Java面试之集合/容器

1. 说说List,Set,Map三者的区别?
     List : 存储的是有序可重复的集合
     Set: 存储的无序不可重复的集合
     Map: 存储的是键值对的集合,键不能重复,值可以重复

2. Arraylist 与 LinkedList 区别?
    1、ArrayList底层是数组实现的,而LinkedList底层是双向链表实现的
    2、ArrayList有数组的有点,支持随机访问。而LinkedList的有点则是在删除和添加的时候
    3、所以在访问比较多的情况应该选择ArrayList,而在频繁增添数据的时候应该选择LinkedList
    4、它们都是线程不安全的
3. ArrayList 与 Vector 区别呢?为什么要用Arraylist取代Vector呢?
    1、Vector 是线程安全的,ArrayList不是线程安全的
    2、因为Vector要实现线程安全,所以它的访问速度要比ArrayList慢
    3、ArrayList的扩容方式是增加 50%,Vector是翻倍。所以ArrayList更加的节省空间
4. 说一说 ArrayList 的扩容机制吧
     https://www.xdx97.com/article?bamId=657233308874178560

5. HashMap 和 Hashtable 的区别
     1、Hashtable 是线程安全的,Hashtable 内部的方法基本都经过synchronized 修饰。HashMap 是线程不安全的
     2、HashMap 允许一个null值得key,多个null值的value,Hashtable 一个null值的key或value都不行
     3、①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小
     4、JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。
6. HashMap 和 HashSet区别
     1、HashSet 底层就是基于 HashMap 实现的。
     2、HashSet 实现Set接口, HashMap 实现Map接口。
     3、HashSet 直接存储对象, HashMap Key-Value方式。
7. HashSet如何检查重复
    当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让加入操作成功。
8. HashMap的底层实现
    1、JDK8后,HashMap底层数据结构是数组+链表+红黑树
    2、HashMap里面有一个Node节点,里面除了基本的key、value、next。还有一个hash,数组的长度-1,然后按位或这个hash值,就是这个节点的索引位置了。
    3、当一个数组的某个位置下面的链表长度大于8,这时候就会把链表转化成红黑树,大程度优化了HashMap的性能。

9. ConcurrentHashMap 和 Hashtable 的区别
    1、ConcurrentHashMap 是线程安全的
10. comparable 和 Comparator的区别
    1、comparable接口实际上是出自java.lang包 它有一个 compareTo(Object obj)方法用来排序
    2、comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序

11. HashSet和TreeSet有什么区别?
    1、TreeSet 是基于红黑树实现的,Treeset中的数据是自动排好序的,不允许放入null值
    2、HashSet 是基于哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null。
12.Array和ArrayList有什么区别?
    1、Array可以存储基本数据类型,而ArrayList不可以。
    2、Array大小是固定的,ArrayList的大小是动态改变的。
    3、ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
13 为什么HashMap中String、Integer这样的包装类适合作为K
    因为HashMap需要使用key的hash值来作为存储的位置,而这些包装类型直接提供了HashCode获取方法。
14 Java集合的快速失败机制 “fail-fast”
    1、“快速失败”也就是fail-fast,它是Java集合的一种错误检测机制。
    2、比如当你对ArrayList正在迭代的时候,改变了集合的结构(add,remove)就会抛出ConcurrentModificationException
    2、推荐使用CopyOnWriteArrayList来替换ArrayList,因为如果加锁的话,可能会阻塞遍历操作。

15 fail-fast 与 fail-safe 机制有什么区别
xxxxxxxxxx
16 集合框架中的泛型有什么优点?
    集合使用泛型之后,可以达到元素类型明确的目的,避免了手动类型转换的过程,同时,也让我们更加明确容器保存的是什么类型的数据。
17 为什么集合类没有实现Cloneable和Serializable接口
    克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。
18 Collection和Collections的区别
    1、Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。
    2、Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类。
19. Iterater和ListIterator之间有什么区别?
    1.使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
    2.ListIterator提供了一些Iterator没有的方法,比如add(),previous()
20. 在Java中,HashMap是如何工作的
xxxxxxxxxx
21. HashMap是如何扩容的?如何避免扩容
https://www.xdx97.com/article?bamId=658291130990854144
22. 哪些集合类是线程安全的
    Vector、Stack、Hashtable、java.util.concurrent包下所有的集合类
23 为何Map接口不继承Collection接口
    1、Map提供的是键值对映射(即Key和value的映射),而collection提供的是一组数据(并不是键值对映射)。 他们俩是两种存储意思

24 Collecntion和Map区别?(数据结构、存储特点)
    1、Collecntion存储的是一组数据,而Map存储的是键值对这种模式的数据。
    2、Collecntion里面有ArrayList基于数组实现的集合,它支持随机访问。也有LinkedList这种基于链表实现的集合,它的特点是在于删除和添加的时候快速。
    3、Map里面有HashMap、TreeMap等具体实现。因为map是存储键值对的,所以它的实现当对比复杂一些。比如HashMap,底层是数组+链表+红黑树.
25 你知道RandomAccess接口嘛
     RandomAccess接口里面什么都没有,实现这个接口表示这个类具有随机访问的功能。
26 你知道HashMap的长度为什么是2的幂次方
     hashMap底层使用到了数组,hashMap使用key的hash值作为数组的下标。但是hash的值太大了存不下。所以最后的下标计算方法是数组的长度-1,再按位与hash ((n-1)& hash ),当然了这个hash也是经过处理的。
27 HashMap的Hash值是直接拿来使用的嘛?
     1、不是的,是经过处理的
     2、当key为null的时候,hash直接为0,所以HashMap的key只能存一个null
     3、让key的hashCode,与hashCode>>>16进行按位异或运算
发布了302 篇原创文章 · 获赞 127 · 访问量 52万+

猜你喜欢

转载自blog.csdn.net/Tomwildboar/article/details/103669383