Java面经3

集合

1、Map和ConcurrentHashMap的区别?
Map是一个接口、ConcurrentHashMap是一实现了Map接口的类,并且通过分段锁机制实现并发。
2、hashMap内部具体如何实现的?
数据结构:数组+链表(当链表长度到达8之后,会自动转化成红黑树)。
put:key的hash值,与hashMap的数组长度-1相与,得出的值即为需要存的数组的位置,然后通过尾插法插入链表中或者插入红黑树中;
get:获取key的hash值,与hashMap的数组长度-1相与,得出的值即为应存在的数组中的位置;若是链表则遍历,红黑树则使用二叉搜索;当hashcode相等时,再比较equal,若equal也返回true,则返回该对象。
size:basecount存储当前size,但当高并发时,对于失败的CAS会被记录到counterCells中,返回size=basecount+counterCells中的数目
resize函数:当hashmap当前的size大于负载因子乘以数组长度,则需要rezise。将当前的容量扩大一倍,将原数组中的链表重新插入新数组中。
3、如果hashMap的key是一个自定义的类,怎么办?
最好写成一个不可变类
需要重写hashCode()和equal()方法
4、ArrayList和LinkedList的区别,如果一直在list的尾部添加元素,用哪个效率高?
ArrayList:使用数组实现
LinkedList:使用链表实现
由于ArrayList实现是数组,当不断在尾部添加元素的时候,超出数组的长度,会自动扩展,涉及到申请新的空间,以及将原数组复制到新的数组中;而LinkedList理论上是可以添加无数个节点。
5、HashMap底层,数组的长度为啥是2^n?
数据存到哪个链表中的算法; 这个算法实际就是取模,源码中做了优化将取余操作转化成位运算,但 hash%length==hash&(length-1)的前提是length是2的n次方。
6、ConcurrentHashMap锁加在了哪些地方?
JDK1.8 中取消了segments字段,直接采用transient volatile HashEntry<k,v>[] table保存数据,采用table数组元素作为锁,从而实现了对每一条链表进行加锁,进一步减少并发冲突的概率。
7、TreeMap底层,红黑树原理?
自平衡的二叉搜索树
插入、查询、删除时间复杂度均为log(n)
特征:

  • 根节点时黑色
  • 叶子节点是黑色
  • 点仅有黑色和红色
  • 两个红色节点不能直接相连
  • 从根节点到叶子节点,经过的所有黑色节点树相同

8、concurrenthashmap有啥优势,1.7,1.8区别?
HashMap1.7和1.8区别

1.71.8
数据结构数组+链表数组+链表+红黑树
链表的插入方式前插后插

ConcurrentHashMap 1.7和1.8区别

1.71.8
数据结构Segment + HashEntry数组+链表+红黑树
加锁方式ReentrantLockCAS+Synchronized

9、ArrayList是否会越界?
会越界。在多线程的情况下,两个线程同时add,当一个add完成时,正好是Array的最后一个数组,在还未扩容之前,另一个线程add会报数组越界的错误。
10、什么是TreeMap?
有序的键值对,可以传入一个Comparator,对Key进行排序。
11、ConcurrentHashMap的原理是什么?
分段锁+CAS+Synchronized
12、Java集合类框架的基本接口有哪些?
Collection、Map
Collection:List、Map、Queue
Map:SortMap
13、为什么集合类没有实现Cloneable和Serializable接口?
如果集合类实现了Cloneable和Serializable接口,则其聚集的类必须先要实现这两个接口,这样的话很多类都无法作为集合类的模板参数。
克隆和序列化是跟具体的场景实现有关的,所以应该由集合的实现类来决定如何实现克隆和序列化
14、什么是迭代器?
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
  Java中的Iterator功能比较简单,并且只能单向移动:
  (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
  (2) 使用next()获得序列中的下一个元素。
  (3) 使用hasNext()检查序列中是否还有元素。
  (4) 使用remove()将迭代器新返回的元素删除。
15、Iterator和ListIterator的区别是什么?

IteratorListIterator
遍历Set和List集合遍历List
从头往后遍历既可以前向也可以后向
并包含其他的功能,比如:增加元素,替换元素

16、快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
一:快速失败(fail—fast)
在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。
原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。
注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。
场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。
二:安全失败(fail—safe)
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。
原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception。
缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。
场景:java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。
17、HashMap和Hashtable有什么区别?

HashMapHashTable
非线程安全线程安全
可接受null值不能接收null

18、ArrayList和LinkedList有什么区别?

ArrayListLinkedList
数据结构数组实现链表实现
随机的 get/setO(1)O(n)
addO(1)O(1)
insertO(n)O(1)
removeO(n)O(1)

19、ArrayList,Vector,LinkedList的存储性能和特性是什么?
Vector线程安全的,基于数组的
20、Collection 和 Collections的区别。
Collection是一个接口
Collections是一个工具类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
21、你所知道的集合类都有哪些?主要方法?

22、List、Set、Map是否继承自Collection接口?
Map不是。
23、阐述ArrayList、Vector、LinkedList的存储性能和特性

24、List、Map、Set三个接口存取元素时,各有什么特点?
Map、Set 插入、删除、查找均为O(1)。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值