JDK5的新特性
一、增强for循环(foreach)
1.概述
简化数组和Collection集合的遍历
底层依赖的是迭代器(Iterator),所以也会有并发异常
2.格式
for(元素数据类型 变量 : 数组或者Collection集合) {
使用变量即可,该变量就是元素
}
3.案例
public static void demo1() {
int[] arr = {11,22,33,44,55};
for (int i : arr) {
System.out.println(i);
}
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
for (String string : list) {
System.out.println(string);
}
}
public static void demo2() {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("张三", 23));
list.add(new Person("李四", 24));
list.add(new Person("王五", 25));
list.add(new Person("赵六", 26));
for (Person person : list) {
System.out.println(person);
}
}
4.三种迭代的能否删除
- 普通for循环,可以删除,但是索引要-1
- 迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
- 增强for循环不能删除
//1.普通for循环删除,索引要-1
for(int i = 0; i < list.size(); i++) {
if("b".equals(list.get(i))) {
list.remove(i--); //通过索引删除元素
}
}
//2.迭代器删除
Iterator<String> it = list.iterator();
while(it.hasNext()) {
if("b".equals(it.next())) {
//list.remove("b"); //错误,迭代过程中如果集合修改会出现并发修改异常
it.remove();
}
}
for(Iterator<String> it2 = list.iterator(); it2.hasNext();) {
if("b".equals(it2.next())) {
//list.remove("b"); //错误,迭代过程中如果集合修改会出现并发修改异常
it2.remove();
}
}
//3.增强for循环,增强for循环不能删除,只能遍历
for (String string : list) {
if("b".equals(string)) {
list.remove("b"); //错误,迭代过程中如果集合修改会出现并发修改异常
}
}
二、静态导入的使用
1.概述
导入类中的静态方法
2.格式
import static 包名….类名.方法名;
可以直接导入到方法的级别
import static java.util.Arrays.sort; //静态导入
int[] arr = {55,22,33,44,11};
sort(arr); //排序
3.注意事情
方法必须是静态的,但是如果有多个同名的静态方法,就会不知道是哪个类下的静态方法,所以这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用,但是要能看懂。
三、可变参数的概述和使用
1.概述
在定义方法时,不知道应该写多少个参数,即参数个数不确定时使用。
底层实现其实是一个数组
2.格式
修饰符 返回值类型 方法名(数据类型… 变量名){}
public static void print(int ... arr) { //可变参数其实是一个数组
for (int i = 0; i < arr.length; i++) { //底层将所给数据封装为一个数组,比数组更加强大
System.out.println(arr[i]);
}
}
3.注意事项
如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
四、Arrays工具类的asList()方法的使用
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
案例1:
public static void demo1() {
String[] arr = {"a","b","c"};
List<String> list = Arrays.asList(arr); //将数组转换成集合
list.add("d"); //java.lang.UnsupportedOperationException
System.out.println(list);
}
注意事情:
将数组转成集合后,该集合不能进行添加和删除操作,但是可以用集合的思想操作数组,也就是说可以使用其他集合中的方法。
案例2:
public static void demo2() {
int[] arr = {11,22,33,44,55};
//基本数据类型的数组转换成集合,会将整个数组当作一个对象转换,以下两行作用相同
List list = Arrays.asList(arr);
List<int[]> list = Arrays.asList(arr);
System.out.println(list); //[[I@4554617c]
Integer[] arr1 = {11,22,33,44,55};
//将数组转换成集合,数组必须是引用数据类型
List<Integer> list1 = Arrays.asList(arr1);
System.out.println(list1); //[11, 22, 33, 44, 55]
}
案例3:Collection中toArray(T[] a)泛型版的集合转数组
public <T> T[] toArray(T[] a) {
//如果a的长度小于集合长度,返回的数组长度为集合长度
if (a.length < size)
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
//如果a的长度大于集合长度,返回的数组长度为a的长度,其余值为null
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
public static void main(String[] args) {
//集合转数组,加泛型的
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
String[] arr = list.toArray(new String[10]);
for (String string : arr) {
System.out.println(string);
}
}
//a b c d null null null null null null