集合转数组与数组转集合

一, 数组转集合

1, asList方法的使用

    public void test() {
		String[] arr = new String[] {"1", "2"};
		List list = Arrays.asList(arr);
		System.out.println(list);
		list.add("3");	// 运行异常
		System.out.println(list);
		arr[0] = "4";  // list.get(0)随之被修改
		System.out.println(list);
	}

2, 异常情况

第一种情况: list.add("3");     运行异常。

第二种情况:arr[0] = "4";  list.get(0)随之被修改。

原因分析:

asList的返回对象是一个ArrayList, 此处的ArrayList是Arrays的内部类, 不是常用的直接实现了List接口的ArrayList, 没有实现集合的修改方法。Arrays.asList()提现的是适配器模式, 只是转换接口, 后台的数据仍是数组。

集合转数组与数组转集合_第1张图片

 

二, 集合转数组

1,toArray方法的使用

   public void test() {
		List list = new LinkedList<>();
		list.add("a");
		list.add("b");
		list.add("c");
		Object[] obj = list.toArray();
		System.out.println(Arrays.toString(obj));
		String[] arr = new String[list.size()];
		arr = list.toArray(arr);
		System.out.println(Arrays.toString(arr));	
	}

备注: 直接list.toArray()的返回值只能是Object[]类型, 不能强转成指定类型; 所以需要先声明指定类型的数组, 再以参数形式传进去,解决类型转换问题。

 

三, 集合之间的操作

1, subList方法的使用

public void test() {
		List list = new ArrayList();  
        list.add("a");  
        // 使用构造器创建一个包含list的列表list1  
        List list1 = new ArrayList(list);  
        // 使用subList生成与list相同的列表list2  
        List list2 = list.subList(0, list.size()); 
        System.out.println(list.equals(list1));  // true
        System.out.println(list.equals(list2));  // true 
        list2.add("b");  
        System.out.println(list.equals(list1));  // false
        System.out.println(list.equals(list2));  // true
	}

备注:

1, 使用构造器创建一个包含list的列表list1  
    List list1 = new ArrayList(list);  
 2, 使用subList生成与list相同的列表list2  
    List list2 = list.subList(0, list.size());  

可以发现,list2为list的子list,当list2发生结构性修改(list2.add("b"))后,list也发生相应改变,所以返回结果仍为true。subList返回的是ArrayList的内部类SubList(ArrayList的一个视图), 对于SubList子列表的所有操作最终会反映到原列表上。

 

 

 

你可能感兴趣的:(java基础)