当前位置: 首页>后端>正文

Java 集合基础面试

1、Java集合有哪些?

1)按照实现接口分类
1.1)实现Map接口得有:EnumMap、IdentityHashMap、HashMap、LinkedHashMap、WeakHashMap、TreeMap
1.2)实现List接口的有:ArrayList、LinkedList
1.3)实现Set接口的有:HashSet、LinkedHashSet、TreeSet
1.4)实现Queue接口的有:PriorityQueue、LinkedList、ArrayQueue

2)按照底层实现的数据结构分类
2.1)底层以数组的形式实现:EnumMap、ArrayList、ArrayQueue
2.2)底层以链表的形式实现:LinkedHashSet、LinkedList、LinkedHashMap
2.3)底层以红黑树的形式实现:TreeMap、TreeSet
2.4) 底层以哈希表的形式实现:HashMap、HashSet、LinkedHashMap、LinkedHashSet、WeakHashMap、IdentityHashMap
2.5)底层以二叉树的形式实现:PriorityQueue

3)并发容器
3.1)ConcurrentHashMap、ConCurrentSkipListHashMap
3.2)LinkedTransferQueue、CopyOnWriteArrayList、ArrayBlockingQueue、LinkeBlockingQueue、PriorityBlockingQueue、LinkedBlockQueue、DelayQueue、SynchronusQueue
3.3)ConcurrentSkipListSet、CopyOnWriteArraySet

2、Collection和Collections有什么区别?

Collection是集合类的上级接口,继承与它有关的接口主要有List和Set;
Collections是一个包装类。它包含有各种有关集合操作的静态多态方法,不能实例化,像一个Collection集合框架中的工具类。

3、List、Set、Map 之间的区别是什么?

List:
1、可以允许重复的对象。
2、可以插入多个null元素。
3、是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
4、常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。

Set:
1、不允许重复对象
2、无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
3、只允许一个 null 元素
4、Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。

Map:
1、Map不是collection的子接口或者实现类。Map是一个接口。
2、Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
3、TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
4、Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
5、Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)

4、HashMap 和 Hashtable 有什么区别?

1)继承的父类不同
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

2)线程安全性不同
Hashtable中的方法是Synchronize的,而HashMap中的方法在缺省情况下是非Synchronize的。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步,但使用HashMap时就必须要自己增加同步处理。

3)key和value是否允许为null值
Hashtable中,key和value都不允许出现null值,而HashMap中,null可以作为键,这样的键只有一个,但是可以有一个或多个键所对应的值为null。

4)内部实现使用的数组初始化化和扩容方式不同
1)HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,
2)Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
3)Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。

5)hash的计算方式不同
HashMap计算了hash值;Hashtable使用了key的hashCode方法。

6)是否有contains方法
HashMap没有contains方法;Hashtable包含contains方法,类似于containsValue。

5、ArrayList和LinkedList有什么区别?

1)数据结构实现
ArrayList底层是用数组实现的,而LinkedList底层是用双向链表实现的;

2)随机访问效率
正因为ArrayList是通过数组实现的,而数组的元素是带有下标的,查询的时候可以通过下标快速定位到所要查询的元素,而LinkedList 基于双向链表实现的,每次查询都必须从头结点移动指针从前往后依次查找直至查找到所要查找的元素,因此ArrayList的随机访问效率比LinkedList效率高;

3)增加和删除效率
在非尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为ArrayList底层是基于数组实现的,而数组是一块连续的内存空间,当我们在中间删除一个元素时,我们都必须逐一将所要删除的元素的后面元素逐一向前移一位,操作繁琐,而LinkedList增加或者删除元素,只需要将所要删除的元素的上一个元素的后驱指针指向指向下下一个元素,也就是node.next = node.next.next;

在需要频繁读取集合中的元素时,更推荐使用ArrayList,而在插入和删除操作较多时,更推荐使用LinkedList。

6、Array和ArrayList有什么区别?

1)Array类型的变量在声明的同时必须进行实例化(至少得初始化数组的大小,而ArrayList可以只是先声明。
2)Array只能存储类型相同的对象,而ArrayList可以存储不同的对象。
3)Array能存储基本数据类型类型和对象类型,而ArrayList只能包含对象类型。
4)Array大小是固定的,ArrayList 的大小是动态变化的。

7、ArrayList和Vector的区别和联系?

相同点:
1)底层都使用数组实现;
2)功能相同,实现增删改查等操作的方法相似;
3)长度可变的数组结构;

不同点:
1)Vector是早期JDK版本提供,ArrayList是新版本替代Vector的;
2)Vector 的方法都是同步的,线程安全;ArrayList 非线程安全,但性能比Vector好;
3)默认初始化容量都是10,Vector 扩容默认会翻倍,可指定扩容的大小;ArrayList只增加 50%。

8、迭代器Iterator是什么?

1)首先说一下迭代器模式,它是 Java 中常用的设计模式之一。用于顺序访问集合对象的元素,无需知道集合对象的底层实现。
2)Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。
3)缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。

9、HashMap的键值需要注意什么?

HashMap 的 key 相等的条件是,条件 1 必须满足,条件2和3必须满足一个。

1)key 的 hash 值相等

2)内存中是同一个对象,即使用 == 判断 key 相等

3)key 不为 null, 且使用 equals 判断 key 相等

所以自定义类作为 HashMap 的 key,需要注意按照自己的设计逻辑,重写自定义类的 hashCode() 方法和 equals() 方法。

10、HashMap的实现原理是什么?

1)HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

2)在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散”的数据结构,即数组和链表的结合体。

Java 集合基础面试,第1张

实现原理:

1)利用key的hashCode重新hash计算出当前对象的元素在数组中的下标;

2)存储时,如果出现hash值相同的key,此时有两种情况:

1、如果key相同,则覆盖原始值;

2、如果key不同(出现冲突),则将当前的key-value放入链表中;

3)获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值;

4)理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。

11、HashSet实现原理是什么?有什么特点?**

1)HashSet 是基于 HashMap 实现的,查询速度特别快

2)HashMap 是支持 key 为 null 值的,所以 HashSet 支持添加null 值

3)HashSet 存放自定义类时,自定义类需要重写 hashCode() 和 equals() 方法,确保集合对自定义类的对象的唯一性判断(具体判断逻辑,见 HashMap put() 方法,简单概括就是 key 进行 哈希。判断元素 hash 值是否相等、key 是否为同个对象、key 是否 equals。第 1 个条件为 true,2、3 有一个为 true,HashMap 即认为 key 相同)

4)无序、不可重复。

12、那些集合类是线程安全的?

1)Vector

2)Stack

3)Hashtable

4)java.util.concurrent 包下所有的集合类 ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque...

13、怎么确保一个集合不能被修改?

使用 JDK中java.util.Collections 类,unmodifiable*** 方法赋值原集合

1)list = Collections.unmodifiableList(list);

2)set = Collections.unmodifiableSet(set);

3)map = Collections.unmodifiableMap(map);

当再修改集合时,会报错 java.lang.UnsupportedOperationException。从而确保自己定义的集合不被其他人修改。

未完待续


https://www.xamrdz.com/backend/3f31931775.html

相关文章: