ArrayList源码后续-问题和面题

前言

前一段时间看了看ArrayList的源码,详情可见上篇文章ArrayList源码 。在阅读源码过程中有一些疑问,在这里记录。并在之后在网上寻找了一些有关ArrayList的面试题目。

问题

  1. ArrayList构造函数是怎么运行的?

能提出这个问题也是你蠢了。

原本想看一下ArrayList各个构造函数执行,然后直接在ArrayList源码的各个构造函数上打了个断点,然后在测试代码上直接debug,发现ArrayList构造函数来回跳转,心想事大了,这构造函数执行的啥呀。

是你傻了,是你傻了。ArrayList并不是只在你的测试代码里使用,其他的java代码可能也会使用ArrayList,甚至是java环境启动时,所以在他们使用ArrayList的时候就会进入到ArrayList打断点的对应源码。所以想要看其构造函数执行,先自己新建ArrayList代码上打个断点再下一步进入到ArrayList构造函数。

最后说一下:ArrayList的构造函数就是普通构造函数的对应,没有什么新奇的。你之前可真是个"小机灵"啊。

  1. 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()这个方法;但是这个方法的具体实现,没有自己去看。找了几篇文章仅供参考。

java native本地方法详解(转)

System.arraycopy()方法详解

深入理解System.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中方式)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值