前言
前一段时间看了看ArrayList的源码,详情可见上篇文章ArrayList源码 。在阅读源码过程中有一些疑问,在这里记录。并在之后在网上寻找了一些有关ArrayList的面试题目。
问题
- ArrayList构造函数是怎么运行的?
能提出这个问题也是你蠢了。
原本想看一下ArrayList各个构造函数执行,然后直接在ArrayList源码的各个构造函数上打了个断点,然后在测试代码上直接debug,发现ArrayList构造函数来回跳转,心想事大了,这构造函数执行的啥呀。
是你傻了,是你傻了。ArrayList并不是只在你的测试代码里使用,其他的java代码可能也会使用ArrayList,甚至是java环境启动时,所以在他们使用ArrayList的时候就会进入到ArrayList打断点的对应源码。
所以想要看其构造函数执行,先自己新建ArrayList代码上打个断点再下一步进入到ArrayList构造函数。
最后说一下:ArrayList的构造函数就是普通构造函数的对应,没有什么新奇的
。你之前可真是个"小机灵"啊。
- toArray()带参数的实现方式。
ArrayList中toArray(T[] a)待参数的方法:
1、
a的长度大于ArrayList中存储元素的长度,将ArrayList的元素copy到a中,并在copy结束后a的下一个元素赋值为null;
2、
a的长度小于ArrayList中存储元素的长度,返回a类型的一个数组,包含所有ArrayList的元素。
@Test
public void testEnsureCapacity() {
Integer[] a = new Integer[2];
for (int i = 0; i < a.length; i++) {
a[i] = i + 1;
}
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
list.add(i + 10);
}
Integer[] integers = list.toArray(a);
for (Integer integer : integers) {
System.out.println(integer);
}
}
3、Arrays.copyOf:<T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType)
在看过源码的后,你是不是发现了ArrayList在很多出使用到了Arrays.toArray()这个方法,它也是扩容的核心代码。
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
@SuppressWarnings("unchecked")
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
但是有个问题Arrays.copyOf()方法中又调用了Syste.arraycopy()这个方法;但是这个方法的具体实现,没有自己去看。找了几篇文章仅供参考。
面试题
这里罗列的问题都是在网上找到的,没有答案,如果有疑问的可以自行上网搜索答案。
1.ArrayList的大小是如何自动增加的?
2.在索引中ArrayList的增加或者删除某个对象的运行过程?效率很低吗?解释一下为什么?
3.ArrayList如何顺序删除节点 ?
4.ArrayList的遍历有哪些方法?
5.什么情境下你会使用ArrayList?
例如,直播时滚动的评论信息是不是适合使用ArrayList?QQ的好友列表适合使用ArrayList吗?
参考:https://www.jianshu.com/p/ceb0a90e4be9
6、ArrayList是线程安全的么?
7、ArrayList⽤来做队列合适么?
8、ArrayList list = new ArrayList<>(20); 中的list扩充几次?
9、如何复制某个ArrayList到另一个ArrayList中去?(3中方式)