ArrayList和SubList的坑面试题

简介: ArrayList和SubList的坑面试题

Snipaste_2022-04-24_12-29-24.jpg

👨🏻‍🎓博主介绍:大家好,我是芝士味的椒盐,一名在校大学生,热爱分享知识,很高兴在这里认识大家🌟

🌈擅长领域:Java、大数据、运维、电子

🙏🏻如果本文章各位小伙伴们有帮助的话,🍭关注+👍🏻点赞+🗣评论+📦收藏,相应的有空了我也会回访,互助!!!

🤝另本人水平有限,旨在创作简单易懂的文章,在文章描述时如有错,恳请各位大佬指正,在此感谢!!!


代码复现

  • 不要,思考一下会打印出什么?


List<String>list1=newArrayList<>(Arrays.asList("username", "passwd"));
List<String>list2=list1.subList(0, 2);
list2.add("email");
System.out.println(list1);
System.out.println(list2);
  • 执行结果:

image.png

  • 你是否感觉疑惑?在想为什么在list2添加的在list1也添加是吧?

源码解析

  • subList接口    
List<E>subList(intfromIndex, inttoIndex);
  • 我们使用的是ArrayList,所以是选择ArrayList即可
publicList<E>subList(intfromIndex, inttoIndex) {
subListRangeCheck(fromIndex, toIndex, size);
returnnewSubList(this, 0, fromIndex, toIndex);
}
  • fromIndex是从List元素开始索引,toIndex是List元素结束索引,subListRangeCheck方法是检查是否在允许范围之内。
staticvoidsubListRangeCheck(intfromIndex, inttoIndex, intsize) {
//开始索引小于0if (fromIndex<0)
thrownewIndexOutOfBoundsException("fromIndex = "+fromIndex);
//结束索引大于容量if (toIndex>size)
thrownewIndexOutOfBoundsException("toIndex = "+toIndex);
//开始索引大于结束索引if (fromIndex>toIndex)
thrownewIllegalArgumentException("fromIndex("+fromIndex+
  • 重头戏在new SubList(this, 0, fromIndex, toIndex);这里,看看下面的SubList就会知道,this关键字将当前对象的引用也就是list1传入了SubList,把传入的list1变成parent赋值给SubList内部成员,然后又将这个构造生成的赋值给list2,也就是说list1和list2是引用了同一个对象,指向的是同一list。
SubList(AbstractList<E>parent,
intoffset, intfromIndex, inttoIndex) {
//问题就出现在这里this.parent=parent;
this.parentOffset=fromIndex;
this.offset=offset+fromIndex;
this.size=toIndex-fromIndex;
this.modCount=ArrayList.this.modCount;
        }
  • 再来看看list2.add的源码,将元素直接添加在list1和list2共同的list引用对象上,这就是为什么list2添加了,list1也添加了。
publicvoidadd(intindex, Ee) {
rangeCheckForAdd(index);
checkForComodification();
//将元素直接添加在list1和list2共同的list引用对象上parent.add(parentOffset+index, e);
this.modCount=parent.modCount;
this.size++;
        }


相关文章
|
存储 缓存 Java
每日一道面试题之LinkedList VS ArrayList~
每日一道面试题之LinkedList VS ArrayList~
|
2天前
|
索引
ArrayList和LinkedList的区别
ArratList的底层使用动态数组,默认容量为10,当元素数量到达容量时,生成一个新的数组,大小为前一次的1.5倍,然后将原来的数组copy过来; 因为数组有索引,所以ArrayList查找数据更快,但是添加数据效率更低 LinkedList的底层使用链表,在内存中是离散的,没有扩容机制;LinkedList在查找数据时需要从头遍历,所以查找慢,但是添加数据效率更高
|
5月前
|
Java
【JAVA集合篇 - ArrayList】你真的了解ArrayList吗?
【JAVA集合篇 - ArrayList】你真的了解ArrayList吗?
21 0
|
存储 Java 索引
每日一道面试题之ArrayList 和 LinkedList 的区别是什么?
每日一道面试题之ArrayList 和 LinkedList 的区别是什么?
|
安全
ArrayList 和 LinkedList 的区别【重要】
ArrayList 和 LinkedList 的区别【重要】
66 0
|
6月前
|
存储 安全
ArrayList 和 LinkedList 的区别
ArrayList 和 LinkedList 的区别
|
6月前
面试题之:ArrayList和LinkedList有哪些区别
面试题之:ArrayList和LinkedList有哪些区别
|
存储 安全 Java
Java集合ArrayList
Java集合ArrayList
64 0
ArrayList与LinkedList获取指定元素对比(源码分析)
ArrayList与LinkedList获取指定元素对比(源码分析)
76 0
面试基础篇——ArrayList VS LinkedList
面试基础篇——ArrayList VS LinkedList
84 0
面试基础篇——ArrayList VS LinkedList