![](https://img-blog.csdnimg.cn/c1eb84d1d3a5416a99d5219412dc7644.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java容器面试题
Java容器面试题
复活的夜神月
这个作者很懒,什么都没留下…
展开
-
如何决定使用 HashMap 还是 TreeMap?
因为 TreeMap 会自动按照键值进行排序,因此在需要有序访问数据的场合,比如需要将元素遍历输出或排序,或者需要查找最小值和最大值等操作,使用 TreeMap 会更加合适。3. 是否需要键值对的顺序保持一致:HashMap 和 TreeMap 的元素遍历顺序可能不同,因此,如果需要遍历顺序一致,则应该使用 LinkedHashMap,它是 HashMap 的子类,但它会保持元素插入顺序或者访问顺序不变。在选择使用 HashMap 还是 TreeMap 时,需要考虑访问数据的速度和数据的顺序性。原创 2023-05-30 09:39:59 · 1038 阅读 · 0 评论 -
怎么确保一个集合不能被修改?
这些方法接收一个可变的集合,返回一个只读的不可变视图,并且如果试图修改这个不可变的集合,会抛出 UnsupportedOperationException 异常,从而确保了集合的不可变性。因此,在创建不可变集合视图后,如果试图修改底层集合,则会导致不可期预的行为。此外,Java 9 之后提供了新的集合接口和实现,其中包括不可变集合的接口和实现,例如:ImmutableList、ImmutableSet 等类,用户可以通过这些类来实现一个真正意义上的不可变集合。原创 2023-06-02 15:06:22 · 481 阅读 · 0 评论 -
ArrayList 和 Vector 的区别是什么?
2. 初始容量和增长方式:Vector 的初始容量缺省为10,当容量不足时,容器容量会以原来容量的2倍自动扩展。而 ArrayList 的缺省初始容量为10,当容器大小增加到容量大小时,容器容量会自动增加1.5倍。1. 线程安全性:Vector 是线程安全的,即多线程情况下,Vector 可以保证容器的同步性。因此,如果在单线程环境下,或者是不考虑线程安全性的场景下,建议使用 ArrayList。而在多线程环境下,或者需要保证容器同步性的场景下,建议使用 Vector。原创 2023-06-01 16:44:52 · 2437 阅读 · 0 评论 -
ArrayList 和 LinkedList 的区别是什么?
因此,LinkedList 适合于插入和删除操作比较频繁的场景(当然,这种场景下数组的复制次数也比较多,所以并不适合大规模插入或删除)。因为 ArrayList 的底层是数组,所以支持随机访问,即可以通过下标来访问集合中的任意元素。插入和删除操作需要移动后续元素,时间复杂度为O(n),其中n为这个列表的大小。因此,ArrayList 适合于访问元素比较频繁,但插入/删除操作不太频繁的场景。综上所述,ArrayList 适合于读操作比较频繁,而 LinkedList 适合于写操作比较频繁的场景。原创 2023-05-30 10:50:24 · 35 阅读 · 0 评论 -
迭代器 Iterator 是什么?
通过调用集合类的 iterator() 方法可以获取一个迭代器,并使用 hasNext() 方法判断是否还有下一个元素,如果有,则使用 next() 方法获取下一个元素。迭代器(Iterator)是一种设计模式,Java 中的迭代器是集合框架中的一个接口,它可以让程序员遍历集合中的元素而无需暴露集合的内部结构。迭代器还具有一些额外的功能,比如支持 remove() 方法来删除迭代器返回的最后一个元素,以及可以使用 forEachRemaining() 方法来迭代集合中余下的所有元素等。原创 2023-06-02 14:50:13 · 369 阅读 · 0 评论 -
HashMap 的实现原理
1. 计算哈希值:首先,根据键的哈希码和哈希表大小计算出该键值对在哈希表中的位置。3. 存储键值对:在确定了键值对的索引位置之后,如果该位置没有数据,则直接存储;4. 扩容:当哈希表中存储的元素数量超过了哈希表的负载因子乘以哈希表长度时,会触发扩容机制,将哈希表的长度加倍,并重新计算每个元素的位置,并将它们存储到新的哈希表中。需要注意的是,HashMap 并不是线程安全的,因此,在多线程环境下使用 HashMap 时,需要使用线程安全的 ConcurrentHashMap。原创 2023-05-30 10:26:37 · 264 阅读 · 0 评论 -
Array 和 ArrayList 有何区别?
4. 内存管理:Array 直接存储在内存中,而 ArrayList 是基于数组的动态对象,其底层是一个数组,因此需要额外的空间来存储 ArrayList 对象本身和维护元素的新增和删除操作所需的额外开销。2. 数据类型:Array 这个类型是由Java语言本身提供的,它可以是任何类型的对象,也可以是基本数据类型(int、char等)的数组。因此,如果需要一个大小固定且元素类型不会改变的数据结构,应该使用 Array。1. 大小和可变性:Array 的大小一旦声明,就无法再改变,即它是定长的。原创 2023-06-02 13:47:41 · 950 阅读 · 0 评论 -
Iterator 怎么使用?有什么特点?
3. 集合本身可以发生变化:使用 Iterator 时,即使在遍历集合时修改了集合本身(添加或删除元素),也不会抛出 ConcurrentModificationException 异常。4. 支持删除操作:Iterator 支持使用 remove() 方法删除集合中的元素,除此之外,Iterator 没有提供其他修改集合的方法。需要注意的是,Iterator 并不是线程安全的,如果需要在多线程环境中使用 Iterator,需要使用额外的同步机制确保线程安全。原创 2023-06-02 14:55:19 · 220 阅读 · 0 评论 -
HashMap 和 Hashtable 有什么区别?
Hashtable 的扩容机制是当存储的元素数量超过哈希表大小的一半时,会重新分配一个大小是原来的两倍的哈希表,并将原有的元素重新分配到新表中。而 HashMap 的扩容机制是当存储的元素数量超过哈希表大小的负载因子(默认为 0.75)时,会重新分配一个大小是原来的两倍的哈希表,并将原有的元素重新分配到新表中。1. 线程安全性:Hashtable 是线程安全的,而 HashMap 不是线程安全的。因此,如果应用程序的性能要求较高,并且不需要线程安全,则应该使用 HashMap。原创 2023-05-30 09:15:04 · 274 阅读 · 0 评论 -
哪些集合类是线程安全的?
需要注意的是,虽然这些类是线程安全的,但不一定能够满足所有的多线程操作需求,因为它们的线程安全性是一定程度上的,多线程使用时需要根据实际情况进行基于它们提供的线程安全特性的操作,或者使用其他更为强大的多线程集合实现如 ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue 等。Java 的集合框架提供了许多集合类,其中有些是线程安全的,有些是非线程安全的。原创 2023-06-02 13:57:23 · 3654 阅读 · 0 评论 -
在 Queue 中 poll()和 remove()有什么区别?
2. poll() 和 remove() 的含义:poll() 方法是从队列的头部删除并返回第一个元素,如果队列为空则返回 null。因此,如果你不确定队列中是否有元素,而且你不想因为队列为空而抛出异常,应该使用 poll() 方法。1. poll() 和 remove() 的返回值:如果队列为空,调用 poll() 方法会返回 null,而 remove() 方法会抛出 NoSuchElementException 异常。原创 2023-06-02 13:52:59 · 708 阅读 · 0 评论 -
Iterator 和 ListIterator 有什么区别?
Iterator 和 ListIterator 都是 Java 集合框架中的迭代器,其中 Iterator 是普遍适用于所有实现了 Iterable 接口的集合类的通用迭代器,而 ListIterator 则是专门用于遍历 List 集合的迭代器,它比 Iterator 更加强大,而且只适用于 List 集合。2. 支持修改元素的方法不同:Iterator 只支持使用 remove() 方法删除集合中的元素,不支持修改和添加操作;原创 2023-06-02 14:58:08 · 502 阅读 · 0 评论 -
HashSet 的实现原理
当我们向HashSet中插入元素时,HashSet会使用元素的哈希值作为HashMap的键,将元素存储在HashMap中。在查询和删除元素时,HashSet也会根据元素的哈希值找到该元素所在的桶(bucket),然后在桶内查找或进行删除操作。同时,由于HashSet内部使用哈希表实现,所以HashSet的元素也不能保证按照插入顺序遍历,而是按照哈希值的顺序进行遍历。在元素哈希冲突时,HashSet采用链表法(即在冲突的位置上采用链表来保存元素),当链表长度达到一定程度时,链表会转换成树(红黑树)。原创 2023-05-30 10:38:10 · 236 阅读 · 0 评论 -
如何实现数组和 List 之间的转换?
需要注意的是,asList() 返回的是一个视图(view),所以对该 List 进行添加、删除操作会直接影响到原数组的值,而且还不支持 add()、remove()、clear() 操作,不然会抛出 UnsupportedOperationException 异常,该方法适用于只需要读取数组中数据的情况。这是因为 toArray() 方法需要根据参数类型确定返回的数组类型,同时也可以避免由于 toArray() 方法根据传入的数组类型创建数组而导致的额外的数组拷贝开销。原创 2023-05-31 15:26:40 · 587 阅读 · 0 评论 -
List、Set、Map 之间的区别是什么?
总的来说,List集合主要用于存储有序的数据列表,且允许存储重复元素;Set集合主要用于存储不重复的元素集合,不保证元素存储的顺序;Map则主要用于存储键值对形式的内容,每个键是唯一的,且键值对之间无序。Map中每个键值对都包含一个键对象和一个值对象,键是唯一的,每个键只能出现一次。2. Set:Set是无序的、不可重复的集合。Set中的元素不允许重复,每个元素在Set中只会存在一次,Set通常不保证元素添加的顺序。不同的集合类型适用于不同的场景和需求,开发者可以根据实际需要选择合适的集合类型来进行开发。原创 2023-05-25 21:47:25 · 726 阅读 · 0 评论 -
Collection 和 Collections 有什么区别?
Collection是一个接口,定义了多种集合的基本操作,而Collections是一个工具类,提供了很多实用的集合操作方法,能够方便我们进行集合操作。可以说,Collection是集合操作的基础接口,而Collections是集合操作的辅助类,二者相辅相成,为我们提供了非常强大和便捷的集合操作能力。这些方法包括排序、查找、替换、复制、打乱顺序等。1. Collection是Java集合框架中集合类的一个基本接口,用于存储和操作一组对象,包括List、Set、Queue等集合类的父接口。原创 2023-05-25 21:38:32 · 2014 阅读 · 0 评论 -
Java 容器都有哪些?
1. Collection:是Java集合框架的基本接口,它包括List、Set和Queue三种类型。Java容器是Java集合框架中的一种,提供了一组接口和类,用于存储、组织和操作一组对象。总的来说,Java容器包括Collection、Map和Iterator三种类型,Collection分为List、Set和Queue三种子类型。3. Iterator:迭代器是一种反复进行访问的机制,用于依次访问集合中的每个元素,通常可以通过Collection来获取迭代器对象。原创 2023-05-25 21:48:05 · 933 阅读 · 0 评论