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

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

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中的一段区域

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容