Android 面试题整理总结(二)Java 集合

本文深入解析Java集合框架中的HashMap,包括其特点、底层数据结构、冲突解决方法、resize过程以及线程安全问题。同时,对比HashMap、HashSet、HashTable、ConcurrentHashMap的区别,探讨了Hashtable为何被弃用,以及Java容器类中的fail-fast机制。
摘要由CSDN通过智能技术生成

目录

1、Java集合框架中有哪些类?都有什么特点?区别是什么?
2、集合、数组、泛型的关系和区别?

3、HashMap 相关:
3.1 解释一下 HashMap,Java为什么要推出 HashMap?
3.2 底层实现了什么数据结构?
3.3 put、get 元素的过程?体现了什么数据结构?
3.4 HashMap 是有序的吗?如何实现有序?
3.5 是采用什么方法处理冲突的?分离链接法的优缺点?
3.6 Hashmap 的参数及影响性能的关键参数:加载因子和初始容量?
3.7 Resize操作的过程?如何避免扩容?
3.8 容量为 2 次幂的原因?
3.9 如何保证 HashMap 线程安全?

4、HashSet、HashMap、HashTable、ConcurrentHashMap 的区别?为什么 Hashtable 被弃用?
5、容器类中 fastfail 的概念。

题解

1、Java 集合框架中有哪些类?都有什么特点?区别是什么?

可以分为两类:Collection 和 Map,Map 和 Collection 唯一重叠的地方是 Map 可以使用 entrySet() 和 values() 方法来产生 Collection

Collection:
|-----List
|-----|----ArrayList
|-----|----LinkedList
|-----Set
|-----|----HashSet
|-----|----LinkedHashSet
|-----|----TreeSet
|-----Queue
|-----|----BlockingQueue

Map
|-----HashMap
|-----LinkedHashMap
|-----TreeMap
|-----WeakHashMap

List、Set、Queue 的区别:
List 是有序列表,可以通过下标访问,成员可以重复,允许拥有多个 null 元素
Set 的成员不可重复,最多拥有一个 null 元素
Queue 是队列,先进先出

ArryList 和 LinkedList 的区别:
ArrayList 内部使用数组实现,随机访问效率高
LinkedList 内部使用链表实现,插入删除效率高

HashMap、LinkedHashMap、TreeMap、WeakHashMap 的区别:
HashM 基于散列查找算法实现,效率最好
LinkedHashMap 维护着一个遍历所有条目的双向链表,因此可以按照插入顺序迭代元素,效率次之
TreeMap 内部基于红黑树实现,按升序(Comparable)排列元素,效率最慢
WeakHashMap 的内部类 Entry 继承自 WeakReference,因此 GC 时,元素可能会被自动删除
ConcurrentHashMap 是并发安全的 HashMap

HashSet、 LinkedHashSet、TreeSet 的区别:
HashSet 内部基于 HashMap 实现,效率最好
LinkedHashSet 继承自 HashSet,维护着一个遍历所有条目的双向链表,因此可以按照插入顺序迭代元素,效率次之
TreeSet 内部基于 TreeMap(红黑树) 实现,按升序(Comparable)排列元素,效率最慢

2、集合、数组、泛型的关系和区别?

数组自创建起,其尺寸就不允许被修改,不能配合泛型使用

集合可以动态地修改尺寸,可以配合泛型使用,用于在编译差检查元素类型,但在运行时,参数类型不同的两个集合,实际上还是同一个类型

3、HashMap 相关

3.1 解释一下 HashMap,Java为什么要推出 HashMap?

  1. 基于散列查找算法实现,put 和 get 都可以提供时间复杂度为 O(1) 的性能
  2. 内部维护一个 Node 数组,Node 除了用于存储 key & value 之外,还有指向下一个元素的指针,即 HashMap 采用的冲突处理方法是分离链接法
  3. 初始容量是 16,加载因子是 0.75,即如果存储的元素个数大于容量 * 0.75 时,就会执行扩容操作,扩容会在原来的基础上扩大 2 倍,

以前 Java 使用的是 HashTable,但这个类无论是单线程还是多线程场景下的性能都不好,因为它的每个成员方法都会简单粗暴地添加 synchronized 修饰符,这种方法的代价是严重降低了程序的可伸缩性,当多个线程竞争容器的锁时,吞吐量将严重下降。因此推出了 HashMap 和 ConcurrentHashMap,HashMap 线程不安全,适合单线程下使用,ConcurrentHashMap 是线程安全的,同时因为使用了分段锁机制,效率比 HashTable 高很多

3.2 底层实现了什么数据结构?

底层实现了一个桶数组,数组中的每个元素都是一个链表,链表中的节点使用内部了 Node 表示

3.3 put、get 元素的过程?

put 会把 key & value 封装为 Node(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值