java 容器 面试

1 java 容器都有哪些?
List:有序、可重复的集合,如ArrayList、LinkedList。
Set:无序、不可重复的集合,如HashSet、TreeSet。
Queue:队列,用于实现先进先出(FIFO)的数据结构,如LinkedList、PriorityQueue。
Map:键值对的集合,如HashMap、TreeMap。

2 Collection 和 Collections 有什么区别?

Collection是Java集合框架的根接口,它定义了集合对象的基本操作和行为,包括添加、删除、遍历等。
Collections是一个工具类,提供了一系列静态方法,用于对集合进行排序、搜索、同步等操作。

3 List、Set、Map 之间的区别是什么?
List是有序的集合,可以包含重复元素,可以通过索引访问和操作元素。
Set是无序的集合,不允许包含重复元素,可以用来判断元素是否存在。
Map是键值对的集合,每个元素由一个键和一个值组成,键不允许重复,值可以重复。

4 HashMap 和 Hashtable 有什么区别?
线程安全性:Hashtable是线程安全的,而HashMap不是。在多线程环境中,如果需要保证线程安全性,可以使用Hashtable或使用HashMap并通过Collections.synchronizedMap方法进行包装。
null键和null值:HashMap允许使用null作为键或值,而Hashtable不允许,否则会抛出NullPointerException。
性能:由于Hashtable是线程安全的,其在竞争资源时需要进行同步,可能会影响性能;而HashMap在单线程环境下性能较好。
迭代器:Hashtable的迭代器是fail-fast的,当在迭代过程中对Hashtable进行修改时会抛出ConcurrentModificationException异常;而HashMap的迭代器是fail-fast的,但允许在迭代过程中通过Iterator的remove方法删除元素。
总的来说,HashMap在大多数场景下更常用,Hashtable在特定需要线程安全的场景下使用

5 如何决定使用 HashMap 还是 TreeMap?
如果需要快速的查找、插入和删除操作,并且不关心元素的顺序,通常选择HashMap。
如果需要将元素按照键的自然顺序或者自定义顺序进行排序,并且查找操作的效率要求较高,通常选择TreeMap

6 说一下 HashMap 的实现原理?
HashMap内部是通过数组和链表/红黑树结构实现的。在HashMap中,通过hashCode计算出元素的哈希值,然后将元素放入数组中对应的位置(通过哈希值取模数组长度),如果发生哈希碰撞(即不同的元素具有相同的哈希值),则以链表或红黑树的形式存储在数组的同一个位置上。
JDK8之后,当链表长度超过阈值(默认为8)时,会将链表转换为红黑树,以提高查找效率。
在进行查找、插入和删除操作时,HashMap会根据元素的哈希值找到对应的位置,然后进行相应的操作。

7 说一下 HashSet 的实现原理?
HashSet是基于HashMap实现的,内部使用HashMap来存储元素。
HashSet中的元素实际上是作为HashMap的key存储的,而value则使用一个固定的Object对象。
当向HashSet中添加元素时,实际上是将元素作为key放入HashMap中,并将固定的Object对象作为value存储。

8 ArrayList 和 LinkedList 的区别是什么?
内部实现:ArrayList基于动态数组实现,支持随机访问;LinkedList基于双向链表实现,支持快速插入和删除操作。
随机访问性能:ArrayList的随机访问性能好,时间复杂度为O(1);LinkedList的随机访问性能较差,时间复杂度为O(n)。
插入和删除性能:ArrayList在中间插入和删除元素时性能较差,时间复杂度为O(n);LinkedList在中间插入和删除元素时性能较好,时间复杂度为O(1)。

9 如何实现数组和 List 之间的转换?
数组转换为List:可以使用Arrays.asList方法将数组转换为List,例如:List<String> list = Arrays.asList(array);
List转换为数组:可以使用List的toArray方法将List转换为数组,例如:String[] array = list.toArray(new String[list.size()]);

10 ArrayList 和 Vector 的区别是什么?
线程安全性:ArrayList是非线程安全的,而Vector是线程安全的。在多线程环境中,如果需要保证线程安全性,可以使用Vector或使用ArrayList并通过Collections.synchronizedList方法进行包装。
动态增长:ArrayList和Vector都支持动态增长,但是它们的增长策略不同。ArrayList每次增长50%当前容量,而Vector每次增长当前容量的一倍。
初始容量:ArrayList默认的初始容量为10,而Vector默认的初始容量为10。
性能:由于Vector是线程安全的,其在竞争资源时需要进行同步,可能会影响性能;而ArrayList在单线程环境下性能较好。

11 Array 和 ArrayList 有何区别?

数据类型:Array是一种原生数据类型,而ArrayList是Java集合框架中的一种类。
大小:Array的大小固定,一旦创建后无法改变;而ArrayList的大小是动态可变的。
功能:Array提供了基本的数组操作,如访问元素、修改元素、获取长度等;ArrayList提供了更多的功能和操作,如动态增加、删除、查找元素等。
泛型:ArrayList支持泛型,可以指定存储的元素类型;而Array没有泛型,只能存储同一种类型的元素。

12在 Queue 中 poll()和 remove()有什么区别?
poll()方法用于检索并删除队列的头部元素,如果队列为空,则返回null。
remove()方法用于检索并删除队列的头部元素,如果队列为空,则抛出NoSuchElementException异常。

13哪些集合类是线程安全的?
Vector:是线程安全的动态数组。
Hashtable:是线程安全的哈希表(已被HashMap取代)。
Stack:是线程安全的堆栈类(已被Deque接口及其实现类取代)。
ConcurrentHashMap:是线程安全的哈希表,是HashMap的线程安全版本。

14迭代器 Iterator 是什么?
  迭代器Iterator是Java集合框架中的一个接口,用于遍历集合中的元素。它提供了一种统一的方式来访问集合中的元素,而不需要暴露集合的内部结构。


15 Iterator 怎么使用?有什么特点?
 通过调用集合类的iterator()方法获取迭代器对象,例如:Iterator<String> iterator = list.iterator();
使用while循环和hasNext()方法判断是否还有下一个元素,例如:while (iterator.hasNext()) { ... }
使用next()方法获取下一个元素,例如:String element = iterator.next();
可以使用remove()方法删除通过迭代器获取的最后一个元素。
迭代器的特点:

安全性:迭代器提供了安全的遍历方式,可以避免在遍历过程中对集合进行修改导致的异常。
只读性:迭代器本身只能用于遍历集合,不支持修改操作,如果需要修改集合,需要使用集合类提供的相应方法。

16 Iterator 和 ListIterator 有什么区别?

迭代方向:Iterator只能向前遍历集合,而ListIterator可以双向遍历,既可以向前也可以向后遍历。
元素操作:Iterator只能遍历并删除元素,而ListIterator除了遍历和删除外,还可以修改和插入元素。
集合类型:Iterator适用于所有实现了Iterable接口的集合,而ListIterator仅适用于List集合

17 怎么确保一个集合不能被修改?
使用Collections.unmodifiableXXX方法对集合进行包装,返回一个不可修改的视图,例如:List<String> unmodifiableList = Collections.unmodifiableList(list);
使用Java 9引入的of方法创建一个不可修改的集合,例如:List<String> unmodifiableList = List.of("element1", "element2");
使用第三方库,如Google Guava中的ImmutableCollection来创建不可修改的集合。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值