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
标签:面试题,HashMap,HashSet,元素,接口,链表,集合 From: https://www.cnblogs.com/carney/p/17071681.html