JDK5的新特性

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 

猜你喜欢

转载自blog.csdn.net/qq_40298054/article/details/84963356