第十一章-持有对象学习总结(1)

2017-04-27  本文已影响0人  落叶刻痕

持有对象:集合持有的只是对象的引用

List

ArrayList: 底层以数组实现,擅长随机访问,插入移除时速度较慢
LinkedList: 底层以链表实现,插入移除时速度较快,提供了优化的顺序访问,随机访问速度较慢

Collection的构造器可以接受另一个Collection,因此可以使用Arrays.asList()来为构造器产生输入
可以在Arrays.asList()中间插入一条“线索”,以告诉编译器产生的List类型,这称为显示类型参数说明。
使用Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常。这是由于:

Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList。remove,add,clear等 method在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList override这些method来对list进行操作,但是Arrays$ArrayList没有override remove(int),add(int), clear()等,所以throw UnsupportedOperationException。

解决方法是使用Iterator,或者转换为ArrayList

List list = Arrays.asList(a[]);
List arrayList = new ArrayList(list);

List<Pet> pets = Arrays.<Pet>asList(new Pet(),new Pet("cat", "雌", 5),new Pet());
List<Pet> pets1 = new ArrayList<Pet>(pets);
Collections.sort(pets);//从小到大排序

subList(int fromIndex, int toIndex) :从指定开始位置到指定结束位置截取一段,注意一点,该方法返回的是原来list的一部分的视图,之所以是视图,双方的动作会互相影响,如下:

List<String> list = new ArrayList<String>(Arrays.asList("one", "two", "three", "four", "five"));
System.out.println("list: " + list);
List<String> subList = list.subList(1,4);
System.out.println("subList: " + subList);
subList.clear();//clear方法会清理掉集合内所持有对象的引用,并不会真正释放堆内存
System.out.println("list: " + list);

执行结果:


执行结果

可以利用这个特性删除list中的一段区域

上一篇下一篇

猜你喜欢

热点阅读