Java面试拷打系列(List)

Java集合方面的问的还是挺多的。有的面试官问的还挺深,这种尽量往源码上回答,但是别挖坑!!!

拷打1:Java集合你知道多少?说说你用过的。

:emmmm,List和Map这两种我用的比较多。先说说List吧,具体用过的有ArrayList,LinkedList了解过。
面试官:嗯那你详细说说ArrayList,为什么不用普通数组。
:首先是普通数组Array它不太方便,因为在实际开发中,我们通常是不知道我们这个数组到底需要多少,所以需要一个支持动态扩容的数据结构ArrayList。具体是这样的,当我们new一个ArrayList对象时,默认块创建一个大小为0空的Object数据;当我们往这个AL对象add数据时,Size会初始化10;当不断地往里面add数据时会涉及到一套扩容机制,达到一个阈值就会触发扩容 (好像和map搞混挖坑了)。
面试官:那怎么扩容你知道吗?
:源码里扩容大小默认是1.5倍。具体是调用grow方法,扩容结束后会调用arraycopy方法对数组进行拷贝。
面试官:哦那你还是看过一点源码的,那你说说ArrayList的操作复杂度。
:因为底层数据结构是数组,直接根据下标查询,所以查询复杂度就是O(1)嘛。增加元素是O(1),因为是直接在尾部追加的。删除元素由于设计到后面元素的移位,所以是O(n)。

拷打2:Vector有了解吗?

:C++的还是Java的,C++不太熟
面试官:想到什么说什么
:在Java里Vector用的不多。它的底层数据结构也是数组。
面试官:嗯对,那你说说和数组有什么不同,为什么用它,知道多线程编程吗?
:(麻,当是支支吾吾没答出来,以下是幻想的我回答的)。相比数组或者说是ArrayList他是线程安全的,主要是使用同步锁的机制确保并发访问的线程安全。
此外他并不是绝对安全的,他仅仅能保存多个线程的同个操作安全,并不能保证多个线程的多个操作安全。举例
删除操作:
1.找到被删除元素的下标。
2.将下标作为参数传入删除方法中。
添加操作:
1.得到添加位置下标
2.将下标作为参数传入添加方法中。
在并发访问时,A完成了第二步,删除了元素。而B刚刚完成第一步得到了下标,而此时下标已经被A删除了。所以就会出现错误。
其实Vector已经被抛弃了,保证线程安全有一个CopyOnWriteArrayList。原理是空间代价方法,在写入时上锁并复制到新的数组,也就是说新添加的元素会添加到新数组中,然后再把原数组的指针指向这个新数组中。

面试官From某方and某银行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值