@liayun
2016-06-02T23:47:02.000000Z
字数 20425
阅读 1966
java基础
Map集合:该集合存储键值对,一对一对的往里存,而且要保证键的唯一性。
Map集合中的常用方法:
put(K key, V value)
putAll(Map<? extends K,? extends V> m)
clear()
remove(Object key)
containsKey(Object key)
containsValue(Object value)
isEmpty()
get(Object key)
size()
values()
entrySet()
keySet()
创建一个集合容器,使用Map接口的子类——HashMap
Map<String, String> map = new HashMap<String, String>();
map.put("01", "zhangsan1");
map.put("02", "zhangsan2");
map.put("03", "zhangsan3");
注意:添加元素时,如果出现相同的键,那么后添加的值会覆盖原有的键对应的值,并且put()方会法返回被覆盖的值。
System.out.println("put:"+map.put("01", "zhangsan1")); // null,因为"01"键所对应的原来的值为null
System.out.println("put:"+map.put("01", "wangwu")); // zhangsan1,因为此时"01"键所对应的原来的值为"zhangsan1"
System.out.println("containsKey:"+map.containsKey("022")); // containsKey:false
System.out.println("remove:"+map.remove("02")); // remove:zhangsan2
System.out.println("get:"+map.get("023")); // get:null
HashMap
允许使用null
值和null
键,如:
map.put("04", null);
System.out.println("get:"+map.get("04")); // get:null
map.put(null, "haha");
System.out.println("get:"+map.get(null)); // get:haha
Collection<String> coll = map.values();
System.out.println(coll);
Map和Set很像,其实,Set底层就是使用了Map集合。
Map集合的两种取出方式:
Set<K> keySet()
:将map所有的键存入到Set集合,因为Set集合具备迭代器,所以可以通过迭代方式取出所有的键,在根据get()方法,获取每一个键对应的值。Map集合的取出原理:将map集合转成set集合,在通过迭代器取出。Set<Map.Entry<K,V>> entrySet()
:将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry。第一种取出方式:
import java.util.*;
class MapDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("02", "zhangsan2");
map.put("03", "zhangsan3");
map.put("01", "zhangsan1");
map.put("04", "zhangsan4");
// 先获取map集合的所有的键的Set集合,keySet()
Set<String> ketSet = map.keySet();
// 有了Set集合,就可以获取其迭代器
Iterator<String> it = ketSet.iterator();
while(it.hasNext()) {
String key = it.next();
// 有了键就可以通过map集合的get()方法获取其对应的值
String value = map.get(key);
System.out.println("key:"+key+", value:"+value);
}
}
}
第二种取出方式:
import java.util.*;
class MapDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("02", "zhangsan2");
map.put("03", "zhangsan3");
map.put("01", "zhangsan1");
map.put("04", "zhangsan4");
// 将map集合中的映射关系取出,存入到set集合中
Set<Map.Entry<String, String>> entrySet = map.entrySet();
Iterator<Map.Entry<String, String>> it = entrySet.iterator();
while(it.hasNext()) {
Map.Entry<String, String> me = it.next();
String key = me.getKey();
String value = me.getValue();
System.out.println(key+":"+value);
}
}
}
Map.Entry,其实Entry也是一个接口,它是Map接口中的一个内部接口。源码我们可以理解为:
interface Map {
public static interface Entry {
public abstract Object getKey();
public abstract Object getValue();
}
}
class HashMap implements Map {
class HaHa implements Map.Entry {
public Object getKey() {}
public Object getValue() {}
}
}
练习一:每一个学生都有对应的归属地。学生Student,地址String。学生属性:姓名,年龄。注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。
解:
分析:
描述学生:
class Student implements Comparable<Student> {
private String name;
private int age;
Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String toString() {
return name + ":" + age;
}
public int hashCode() {
return name.hashCode() + age * 34;
}
public boolean equals(Object obj) {
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s = (Student)obj;
return this.name.equals(s.name) && this.age == s.age;
}
public int compareTo(Student s) {
int num = new Integer(this.age).compareTo(new Integer(s.age));
if(num == 0)
return this.name.compareTo(s.name);
return num;
}
}
定义Map容器,将学生作为键,地址作为值存入。
HashMap<Student, String> hm = new HashMap<Student, String>();
hm.put(new Student("lisi1", 21), "beijing");
hm.put(new Student("lisi1", 21), "tianjin"); // 会覆盖掉键所对应的前一个值
hm.put(new Student("lisi2", 22), "shanghai");
hm.put(new Student("lisi3", 23), "nanjing");
hm.put(new Student("lisi4", 24), "wuhan");
获取map集合中的元素。
// 第一种取出方式 keySet()
Iterator<Student> it = hm.keySet().iterator();
while(it.hasNext()) {
Student stu = it.next();
String addr = hm.get(stu);
System.out.println(stu+"..."+addr);
}
// 第二种取出方式 entrySet()
Set<Map.Entry<Student, String>> entrySet = hm.entrySet();
Iterator<Map.Entry<Student, String>> iter = entrySet.iterator();
while(iter.hasNext()) {
Map.Entry<Student, String> me = iter.next();
Student stu = me.getKey();
String addr = me.getValue();
System.out.println(stu+".........."+addr);
}
练习二:需求:对学生对象的姓名进行升序排序。
解:
分析:因为数据是以键值对的形式存在的。所以要使用可以排序的Map集合。TreeMap。
学生对象在练习一中我们已描述,在此省略。
定义一个按姓名排序的比较器:
class StuNameComparator implements Comparator<Student> {
public int compare(Student s1, Student s2) {
int num = s1.getName().compareTo(s2.getName());
if(num == 0)
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
return num;
}
}
调用代码:
class MapTest {
public static void main(String[] args) {
TreeMap<Student, String> tm = new TreeMap<Student, String>(new StuNameComparator());
tm.put(new Student("blisi3", 23), "nanjing");
tm.put(new Student("lisi1", 21), "beijing");
tm.put(new Student("alisi4", 24), "wuhan");
tm.put(new Student("lisi1", 21), "tianjin"); // 会覆盖掉键所对应的前一个值
tm.put(new Student("lisi2", 22), "shanghai");
Set<Map.Entry<Student, String>> entrySet = tm.entrySet();
Iterator<Map.Entry<Student, String>> it = entrySet.iterator();
while(it.hasNext()) {
Map.Entry<Student, String> me = it.next();
Student stu = me.getKey();
String addr = me.getValue();
System.out.println(stu+":::"+addr);
}
}
}
练习三:"sdfgzxcvasdfxcvdf"
获取该字符串中的字母出现的次数。希望打印结果:a(1)c(2)...
。
解:
分析:通过结果发现,每一个字母都有对应的次数。说明字母和次数之间都有映射关系。注意:当发现有映射关系时,可以选择map集合。因为map集合中存放的就是映射关系。
本题思路:
我们可以定义一个方法来获取打印结果:
public static String charCount(String str) {
char[] chs = str.toCharArray();
TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
for (int x = 0; x < chs.length; x++) {
if(!(chs[x] >= 'a' && chs[x] <= 'z' || chs[x] >= 'A' && chs[x] <= 'Z'))
continue; // 如果非字符,则继续循环
Integer value = tm.get(chs[x]);
if(value == null) {
tm.put(chs[x], 1);
} else {
value = value + 1;
tm.put(chs[x], value);
}
}
StringBuilder sb = new StringBuilder();
Set<Map.Entry<Character, Integer>> entrySet = tm.entrySet();
Iterator<Map.Entry<Character, Integer>> it = entrySet.iterator();
while(it.hasNext()) {
Map.Entry<Character, Integer> me = it.next();
Character ch = me.getKey();
Integer value = me.getValue();
sb.append(ch+"("+value+")");
}
return sb.toString();
}
可以进一步优化为:
public static String charCount(String str) {
char[] chs = str.toCharArray();
TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
int count = 0; // 定义一个变量记录次数
for (int x = 0; x < chs.length; x++) {
if(!(chs[x] >= 'a' && chs[x] <= 'z' || chs[x] >= 'A' && chs[x] <= 'Z'))
continue; // 如果非字符,则继续循环
Integer value = tm.get(chs[x]);
if(value != null)
count = value;
count++;
tm.put(chs[x], count);
count = 0;
}
StringBuilder sb = new StringBuilder();
Set<Map.Entry<Character, Integer>> entrySet = tm.entrySet();
Iterator<Map.Entry<Character, Integer>> it = entrySet.iterator();
while(it.hasNext()) {
Map.Entry<Character, Integer> me = it.next();
Character ch = me.getKey();
Integer value = me.getValue();
sb.append(ch+"("+value+")");
}
return sb.toString();
}
调用代码:
public static void main(String[] args) {
System.out.println(charCount("ak+abf-cdk,abc1defa"));
}
问:什么时候使用map集合呢?
答:当数据之间存在着映射关系时,就要先想到map集合。
一对多的关系:一个学校有多个教室,每一个教室都有名称。一个教室有多个学生。假设学生属性:学号和姓名。
import java.util.*;
class MapDemo {
public static void main(String[] args) {
// 首先定义一个学校
HashMap<String, HashMap<String, String>> czbk = new HashMap<String, HashMap<String, String>>();
// 接着再定义两个教室,预热班和就业班
HashMap<String, String> yure = new HashMap<String, String>();
HashMap<String, String> jiuye = new HashMap<String, String>();
// 学校和教室建立对应关系
czbk.put("yureban", yure);
czbk.put("jiuyeban", jiuye);
// 教室里面装有学生
yure.put("01", "zhangsan");
yure.put("02", "lisi");
jiuye.put("01", "zhaoliu");
jiuye.put("02", "wangwu");
// 遍历czbk集合,获取所有的教室
Iterator<String> it = czbk.keySet().iterator();
while(it.hasNext()) {
String roomName = it.next();
HashMap<String, String> room = czbk.get(roomName);
System.out.println(roomName);
getStudentInfo(room);
}
}
public static void getStudentInfo(HashMap<String, String> roomMap) {
Iterator<String> it = roomMap.keySet().iterator();
while(it.hasNext()) {
String id = it.next();
String name = roomMap.get(id);
System.out.println(id+"::"+name);
}
}
}
class Student {
private String id;
private String name;
public Student(String id, String name) {
this.id = id;
this.name = name;
}
public String toString() {
return id + ":::" + name;
}
}
class MapDemo3 {
public static void demo() {
// 首先定义一个学校
HashMap<String, List<Student>> czbk = new HashMap<String, List<Student>>();
// 接着再定义两个教室,预热班和就业班,注意此时使用的是List集合
List<Student> yure = new ArrayList<Student>();
List<Student> jiuye = new ArrayList<Student>();
// 学校和教室建立对应关系
czbk.put("yureban", yure);
czbk.put("jiuyeban", jiuye);
// 教室里面装有学生
yure.add(new Student("01", "zhangsan"));
yure.add(new Student("04", "wangwu"));
jiuye.add(new Student("01", "zhouqi"));
jiuye.add(new Student("02", "zhaoliu"));
Iterator<String> it = czbk.keySet().iterator();
while(it.hasNext()) {
String roomName = it.next();
List<Student> room = czbk.get(roomName);
System.out.println(roomName);
getInfos(room);
}
}
public static void getInfos(List<Student> list) {
Iterator<Student> it = list.iterator();
while(it.hasNext()) {
Student s = it.next();
System.out.println(s);
}
}
public static void main(String[] args) {
demo();
}
}
sort()
public static <T extends Comparable<? super T>> void sort(List<T> list)
:根据元素的自然顺序对指定列表按升序进行排序,列表中的所有元素都必须实现comparable接口。
public static void sortDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
list.add("qq");
list.add("z");
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
public static <T> void sort(List<T> list, Comparator<? super T> c)
:根据指定比较器产生的顺序对指定列表进行排序。此列表内的所有元素都必须可使用指定比较器相互比较。
class StrLenComparator implements Comparator<String> {
public int compare(String s1, String s2) {
if(s1.length() > s2.length())
return 1;
if(s1.length() < s2.length())
return -1;
return s1.compareTo(s2);
}
}
public static void sortDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
list.add("qq");
list.add("z");
System.out.println(list);
Collections.sort(list, new StrLenComparator());
System.out.println(list);
}
max()
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
:根据元素的自然顺序,返回给定collection的最大元素。collection中的所有元素都必须实现comparable接口。
public static void maxDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
list.add("qq");
list.add("z");
Collections.sort(list); // 可以看出元素的自然顺序结果
System.out.println(list);
String max = Collections.max(list);
System.out.println("max="+max);
}
public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)
:根据指定比较器产生的顺序,返回给定collection的最大元素。collection中的所有元素都必须可通过指定比较器相互比较。
class StrLenComparator implements Comparator<String> {
public int compare(String s1, String s2) {
if(s1.length() > s2.length())
return 1;
if(s1.length() < s2.length())
return -1;
return s1.compareTo(s2);
}
}
public static void maxDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
list.add("qq");
list.add("z");
Collections.sort(list, new StrLenComparator()); // 可以看出根据指定比较器产生的顺序
System.out.println(list);
String max = Collections.max(list, new StrLenComparator());
System.out.println("max="+max);
}
binarySearch()
public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
:使用二分搜索法搜索指定列表,以获得指定对象。在进行此调用之前,必须根据列表元素的自然顺序对列表进行升序排序(通过sort(List)方法)。如果搜索键包含在列表中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。
public static void binarySearchDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
list.add("qq");
list.add("z");
Collections.sort(list);
System.out.println(list);
int index = Collections.binarySearch(list, "aaa");
System.out.println("index="+index); // index=0
}
其原理是:
public static int halfSearch(List<String> list, String key) {
int max, min, mid;
max = list.size() - 1;
min = 0;
while(min <= max) {
mid = (max + min) >> 1; // /2
String str = list.get(mid);
int num = str.compareTo(key);
if(num > 0)
max = mid - 1;
else if(num < 0)
min = mid + 1;
else
return mid;
}
return -min-1;
}
调用halfSearch
方法:
public static void binarySearchDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
list.add("qq");
list.add("z");
Collections.sort(list);
System.out.println(list);
int index = halfSearch(list, "aaaa");
System.out.println("index="+index); // index=-2
}
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
:使用二分搜索法搜索指定列表,以获得指定对象。在进行此调用之前,必须根据指定的比较器对列表进行升序排序(通过sort(List, Comparator) 方法)。
class StrLenComparator implements Comparator<String> {
public int compare(String s1, String s2) {
if(s1.length() > s2.length())
return 1;
if(s1.length() < s2.length())
return -1;
return s1.compareTo(s2);
}
}
public static void binarySearchDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
list.add("qq");
list.add("z");
Collections.sort(list, new StrLenComparator());
System.out.println(list);
int index = Collections.binarySearch(list, "aaa", new StrLenComparator());
System.out.println("index="+index); // index=3
}
其原理是:
public static int halfSearch(List<String> list, String key, Comparator<String> cmp) {
int max, min, mid;
max = list.size() - 1;
min = 0;
while(min <= max) {
mid = (max + min) >> 1; // /2
String str = list.get(mid);
int num = cmp.compare(str, key);
if(num > 0)
max = mid - 1;
else if(num < 0)
min = mid + 1;
else
return mid;
}
return -min-1;
}
调用halfSearch
方法:
class StrLenComparator implements Comparator<String> {
public int compare(String s1, String s2) {
if(s1.length() > s2.length())
return 1;
if(s1.length() < s2.length())
return -1;
return s1.compareTo(s2);
}
}
public static void binarySearchDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
list.add("qq");
list.add("z");
Collections.sort(list, new StrLenComparator());
System.out.println(list);
int index = halfSearch(list, "cc", new StrLenComparator());
System.out.println("index="+index); // index=-2
}
public static <T> void fill(List<? super T> list, T obj)
:使用指定元素替换指定列表中的所有元素。
public static void fillDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
System.out.println(list);
Collections.fill(list,"pp");
System.out.println(list);
}
练习:复写fill(),将list集合中部分元素替换成指定元素。
public static void fillDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
System.out.println(list);
fill(list, 1, 3, "hello");
System.out.println(list);
}
public static void fill(List<String> list, int start, int end, String str) {
for(int i = start; i < end; i++) {
list.set(i, str);
}
}
public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)
:使用另一个值替换列表中出现的所有某一指定值。
public static void replaceAllDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
System.out.println(list);
Collections.replaceAll(list, "aaa", "pp");
System.out.println(list);
}
public static void reverse(List<?> list)
:反转指定列表中元素的顺序。
public static void replaceAllDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
System.out.println(list);
Collections.reverse(list);
System.out.println(list);
}
reverseOrder()
public static <T> Comparator<T> reverseOrder()
:返回一个比较器,它强行逆转实现了Comparable接口的对象collection的自然顺序。按照字符串的自然顺序排序:
public static void orderDemo() {
TreeSet<String> ts = new TreeSet<String>();
ts.add("abcde");
ts.add("aaa");
ts.add("k");
ts.add("cc");
Iterator it = ts.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
反转其自然排序:
public static void orderDemo() {
TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder());
ts.add("abcde");
ts.add("aaa");
ts.add("k");
ts.add("cc");
Iterator it = ts.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
当然还可以这样做:
定义一个按照字符串的自然顺序排序的比较器:
class StrComparator implements Comparator<String> {
public int compare(String s1, String s2) {
// 这样写太繁琐
/*
int num = s1.compareTo(s2);
if(num > 0)
return -1;
if(num < 0)
return 1;
return num;
*/
return s2.compareTo(s1); // 简写
}
}
调用此比较器:
public static void orderDemo() {
TreeSet<String> ts = new TreeSet<String>(new StrComparator());
ts.add("abcde");
ts.add("aaa");
ts.add("k");
ts.add("cc");
Iterator it = ts.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
public static <T> Comparator<T> reverseOrder(Comparator<T> cmp)
:返回一个比较器,它强行逆转指定比较器的顺序。定义一个按照字符串的长度排序的比较器:
class StrLenComparator implements Comparator<String> {
public int compare(String s1, String s2) {
if(s1.length() > s2.length())
return 1;
if(s1.length() < s2.length())
return -1;
return s1.compareTo(s2);
}
}
按照字符串的长度排序:
public static void orderDemo() {
TreeSet<String> ts = new TreeSet<String>(new StrLenComparator());
ts.add("abcde");
ts.add("aaa");
ts.add("k");
ts.add("cc");
Iterator it = ts.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
反转其顺序:
public static void orderDemo() {
TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder(new StrLenComparator()));
ts.add("abcde");
ts.add("aaa");
ts.add("k");
ts.add("cc");
Iterator it = ts.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
public static void shuffle(List<?> list)
:使用默认随机源对指定列表进行置换。所有置换发生的可能性都是大致相等的。
public static void shuffleDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
list.add("qq");
list.add("z");
System.out.println(list);
Collections.shuffle(list);
System.out.println(list);
}
swap(List<?> list, int i, int j)
:在指定列表的指定位置处交换元素。(如果指定位置相同,则调用此方法不会更改列表。)
public static void sortDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
list.add("qq");
list.add("z");
System.out.println(list);
Collections.swap(list, 1, 2);
System.out.println(list);
}
Arrays:用于操作数组的工具类。里面都是静态方法。
toString()
:返回指定数组内容的字符串表示形式。
int[] arr = {2, 4, 5};
System.out.println(Arrays.toString(arr));
public static <T> List<T> asList(T... a)
:返回一个受指定数组支持的固定大小的列表。
String[] arr = {"abc", "cc", "kkkk"};
List<String> list = Arrays.asList(arr);
System.out.println("contains:"+list.contains("cc"));
// list.add("qq"); // UnsupportedOperationException
System.out.println(list);
把数组变成list集合有什么好处?
答:可以使用集合的思想和方法来操作数组中的元素。注意:将数组变成集合,不可以使用集合的增删方法。因为数组的长度是固定的。可以使用集合的诸如contains()
、get()
、indexOf()
、subList()
等等方法,如果你增删,那么会生成UnsupportedOperationException
。
再看下面一段代码:
int[] nums = {2, 4, 5};
List li = Arrays.asList(nums);
System.out.println(li);
此时输出[[I@139a55]
类似结果,以上代码没有使用泛型,使用泛型应是如此:
int[] nums = {2, 4, 5};
List<int[]> li = Arrays.asList(nums);
System.out.println(li);
如果代码修改为:
Integer[] nums = {2,4,5};
List<Integer> li = Arrays.asList(nums);
System.out.println(li);
此时输出[2, 4, 5]
,所以,得出结论:如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素。如果数组中的元素都是基本数据类型,那么会将该数组([[I@139a55])作为集合中的元素存在。
例,Collections接口中的toArray()方法的应用。
import java.util.*;
class CollectionToArray {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
String[] arr = al.toArray(new String[al.size()]);
System.out.println(Arrays.toString(arr));
}
}
格式:
for(数据类型(一般是泛型类型) 变量名 : 被遍历的集合(Collection)或者数组) {
}
例,遍历集合。
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
之前我们使用迭代器遍历:
Iterator<String> it = al.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
现在我们可使用高级For循环,就简化书写了。
for(String s : al) {
System.out.println(s);
}
结论:高级For循环对集合进行遍历,只能获取集合中的元素,但是不能对集合进行操作。迭代器除了遍历,还可以进行remove()集合中元素的动作。如果使用ListIterator,还可以在遍历过程中进行对集合进行增删改查的操作。
对于数组int[] arr = {3,5,1};
,我们可使用传统for循环:
for (int x = 0; x < arr.length; x++) {
System.out.println(arr[x]);
}
还可使用高级For循环:
for (int i : arr) {
System.out.println("i:"+i);
}
问:传统for和高级for有什么区别呢?
答:高级for有一个局限性,必须有被遍历的目标。
建议:在遍历数组的时候还是希望使用传统for,因为传统for可以定义角标。
对于Map集合,我们也可以使用高级For循环。
HashMap<Integer, String> hm = new HashMap<Integer, String>();
hm.put(1, "a");
hm.put(2, "b");
hm.put(3, "c");
第一种遍历方式:
Set<Integer> keySet = hm.keySet();
for (Integer i : keySet) {
System.out.println(i+"::"+hm.get(i));
}
第二种遍历方式:
for (Map.Entry<Integer, String> me : hm.entrySet()) {
System.out.println(me.getKey()+"---"+me.getValue());
}
JDK1.5版本出现的新特性。
可变参数:其实就是一种数组参数的简写形式,不用每一次都手动的建立数组对象,只要将要操作的元素作为参数传递即可,隐式地将这些参数封装成了数组。
class ParamMethodDemo {
public static void main(String[] args) {
show("gaga",2,3,4,5,6);
}
public static void show(String str, int... arr) {
System.out.println(arr.length);
}
}
注意:方法的可变参数在使用时,可变参数一定要定义在参数列表的最后面。
例,
import java.util.*;
import static java.util.Arrays.*; // 导入的是Arrays类中的所有静态成员。
import static java.lang.System.*; // 导入了System类中所有静态成员。
class StaticImport extends Object {
public static void main(String[] args) {
out.println("hello");
int[] arr = {3,1,5};
sort(arr);
int index = binarySearch(arr, 1);
System.out.println(Arrays.toString(arr)); // 此时不能省略Arrays,方法重名时,指定具备所属的对象或类。
System.out.println("index="+index);
}
}
注意: