集合面试题

1.ArrayList和LinkedList的区别?

ArrayList查询速度快(不准确),尾部增删快,头部增删慢,随机访问速度快;LinkedList头尾增删速度快,中间不高,性能远比ArrayList差,不适合做查询;真想做查询用hashMap

(1)是否保证线程安全:ArrayList和LinkedList都不保证线程安全.

(2)底层数据结构:ArrayList底层使用的是数组,LinkedList底层使用的是双链表;

(3)插入和删除是否受元素位置影响:Arraylist采用数组储存,所以插入和删除元素的时间复杂度受元素位置的影响,Linked采用链表储存.所以插入,删除元素时间复杂度不受元素位置影响.

(4)是否支持快速随机访问:LinkedList不支持高效的随机元素访问,ArrayList实现了RandmoAccess接口,所以有随机访问功能.

(5)内存空间占用:ArrayList的空间浪费主要结尾会预留一定的容量空间,LinkedList的空间花费则体现在它每一个元素都需要消耗比ArrayList更多的空间.

2.HashMap底层原理

JDK8以前:数组+双链表;

JDK8以后:数组+双链表+红黑树;

3.HashMap的resize过程是什么样的?

采用hash表数据加链表的形式,1.8以后引入了红黑树的数据结构,初始化数组长度为16,当数组长度到0.75时扩容,链表长度大于8时转为红黑树,红黑树的长度小于6时转为链表结构,

数组中的元素容量超过了阙值的0.75就会触发扩容长度.

4.HashMap你经常用在哪个地方?

(1)电子商务的应用中使用HashMap作为缓存

(2)金融领域出于性能的考虑非常多的运用HashMap和ConcurrentHashMap

(3)controller层向前台返回数据可以用map封装数据

(4)mybatis中的map可以作为参数或者封装结果集

5.HashMap和Hashtable的区别?

(1)hashMap去掉了HashTable 的contains方法,但是加上了containsValue() 和containsKey()方法.

(2)hashTable同步的,而hashMap是非同步的,效率比hashTable要高.

(3)hashMap允许空键值,而hashTable不允许.

6.List,Map,Set三个接口,存取元素时,各有什么特点?

List有序可重复

Set无序不重复

Map一般都是键值对key-value值,value可多个值

7.HashSet是如何保证元素唯一性的呢?

通过元素的两个方法hashCode和equals来完成的

8.TreeSet怎么对集合中的元素进行排序?

TreeSet底层数据结构是二叉树

(1)让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法

(2)让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,覆盖compare方法.

9.map集合的两种取出方式?

(1)通过map.keyset,先得到map集合的键,再根据键得到value值

(2)通过map.entrySet直接得到键值对

10.Collection和Conllections的区别?

Conllection是集合类的上级接口,继承他的接口主要有set和list

Conllections是工具类,有很多操作集合的方法.

11.ConcurrentHashMap 的工作原理及代码实现

ConcurrentHashMap引入了分割(Segment)的概念,只对Map的一部分(Segment)进行上锁,这样保证同步的时候,锁住的不是整个map

12.HashCode的方法和作用

hashCode()的作用是获取哈希码,也成为散列码,它实际上是返回一个int整数,这个哈希码的作用是确定该对象在哈希表中的索引位置

不同的对象可能会有相同的hashCode,在比较一个对象是否相等时,首先需要比较对象的hashCode是否相等,其次要比较equals是否相等

因此,equals方法被覆盖过,则hashCode方法也必须被覆盖hashCode()的默认行为是对堆上的对象产生的独特值,如果没有重写hashCode(),

则该class的两个对象无论如何都不会相等.

13.什么是链表?

链表是可以将物理地址上不连续的数据连接起来,通过指针来对物理地址进行操作,实现增删改查等功能.

链表大致分为单链表和双向链表

单链表:每个节点包含两部分,一部分存放数据变量的data,另一部分是指下一节点的next指针.

双向链表:除了包含单链表的部分还增加的pre前一个节点的指针.

14.链表的优缺点

链表的优点:插入删除速度快(因为有next指针指向其下一个节点,通过改变指针的指向可以方便的增加删除元素)

内存利用率高,不会浪费内存(可以使用内存中细小的不连续空间(大于node节点的大小)),并且在需要空间的时候才创建空间

大小没有固定,扩展很灵活.

链表的缺点:不能随机查找,必须从第一个开始遍历,查找效率低.

15.什么是红黑树

红黑树是一种含有红黑节点并能自平衡的二叉查找树,他必须满足下面性质:

(1)每个节点要么是黑色,要么是红色

(2)根节点是黑色

(3)每个叶子节点(NIL)是黑色

(4)每个红色节点的两个子节点一定都是黑色

(5)任意一节点到每个叶子节点的路径都包含数量相同的黑节点

16.常用的集合类有哪些?

Map接口和Collection接口是所有集合框架的父接口:

Collection接口的子接口包括:Set接口和List接口

Map接口的实现类有:HashMap,TreeMap,Hashtable,ConcurrentashMap以及Properties等

Set接口的实现类有:HashSet,TreeSet,LinkedHashSet等

List接口的实现类主要有:ArrayList,LinkendList,Stack以及Vector等

17.那些集合类是线程安全的?

Vector:就比ArrayList多了个synchronized(线程安全),因为效率较低,现在已经不太建议使用.

hashTable:就比hashMap多了个synchronized(线程安全),不建议使用

ConcurrentHashMap:是Java5中支持高并发,高吞吐量的线程安全HashMap实现,

18.遍历一个List有哪些不同的方式?

(1)for循环遍历,基于计算器,在集合外部维护一个计算器,然后依次读取每一个位置的元素,当读取到最后一个元素后停止

(2)迭代器遍历,Iterator,Iterator是面向对象的一个设计模式,目的是屏蔽不同数据集合的特点,统一遍历集合的接口,Java在Conllections中支持了Iterator模式.

(3)foreach循环遍历,foreach内部也是采用了Iterator的方式实现,使用时不需要显示声明Iterator或计数器,优点是代码简介,不易出错,缺点是只能做简单的遍历,

不能在遍历过程中操作数据集合,例如删除,替换.

19.如何实现数组和List之间的转换?

数组转List:使用Arrays,asList(array)进行转换

List转数组:使用List自带的toArray()方法

数组转set:使用构造函数,直接转入数组

new HashSet(arrays[])

20.如何把一个线程不安全的集合转化为线程安全集合?

向HashSet中add()元素时.判断元素是否存在的依据,不仅要比较hash值,同时还要结合equals方法比较,

HashSet中的add()方法会使用HashMap的put()方法.HashMap的key是唯一的,在HashMap中如果k/y相同时,会用新的V覆盖掉旧的V,然后返回旧的V,所以不会重复

21.说一下HashSet的实现原理?

HashSet是基于HashMap实现的,HashSet的值存放与HashMap的Key上,HashMap的Value统一为present,因此HashSet的实现比较简单

相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,HashSet不允许重复的值,

22.HashSet如何检查重复?HashSet是如何保证数据不可重复的?

向HashSet中add()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合equles方法比较,

HashSet中的add()方法会使用HashMap的put()方法,

HashMap的key是唯一的在HashMap中如果k/v相同时,会用新的V覆盖掉旧的V,然后返回旧的V,所以不会重复

23.说一下HashMap的实现原理?

HashMap是基于哈希表的Map接口的非同步实现,此实现提供所有可选的映射操作,并允许使用null值和null键.

24.HashMap是如何解决Hash冲突?

核心就是使用了数组的储存方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比,需要注意Jdk 1.8中

对HashMap的实现做了优化,

当链表中的节点数据超过了八个之后,该链表会转为红黑树来提高查询效率,数据长度低于6之后会退化为链表

25.为什么HashMap的初始长度为16?

因为长度太小很容易导致map扩容影响性能,如果分配太大的话又会浪费资源,所以就使用16作为初始大小

减少hash碰撞,提高map查询效率,分配过小防止频繁扩容,分配过大浪费资源,

26.HashMap和ConcurrentHashMap的区别?

ConcurrentHashMap对整个桶数组进行了分割分段(Segment),然后在每一个分段上都用了lock锁进行保护,

相对于HashTable的synchronized锁的粒度更精细了一些,并发性能更好,

而HashMap没有锁机制,不是线程安全的

HashMap的键值对允许有null,但是ConcureentHashMap都不允许.

27.什么是TreeMap?

TreeMap是一个有序的Key-value集合,他是通过红黑树实现的,

TreeMap基于红黑树(Red-Black tree)实现,该映射根据其键的自然顺序进行排序,

或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法,

28.comparable和comparator的区别?

comparable接口实际上是出自java,lang包,他有一个compareTo(Object obj) 方法用来排序

comparator接口实际上是出自java.util包,它有一个compare(Object obj1,Object obj2) 方法用来排序

29.如何实现对集合数据排序

使用Stream的sorted方法

使用Collections中的sort方法

使用有序的集合,例如:TreeSet,TreeMap

posted @   英俊潇洒的萨克君  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示