29.Java集合框架面试题

(1)HashMap和HashTable的区别
1.HashMap不是线程安全的
HashMap是map接口的实现类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null value,而HashTable不允许。
HashTable 是线程安全Collection
HashMap 是 HashTable 的轻量级实现,他们都实现了Map 接口,主要区别在于 HashMap 允许 null key 和 null value,由于非线程安全,效率上可能高于 Hashtable。
区别:
1.HashMap允许将null作为一个entry的key或者value,而HashTable不允许。
2.HashMap把HashTable的contains方法去掉,改成containsValue和containsKey。
3.HashTable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map interface 的一个实现。
4.HashTable 的方法是 Synchronize 的,而 HashMap 不是,在多个线程访问 Hashtable 时,不需要自己为它的方法实现同步,而 HashMap 就必须为之提供外同步。
(2)HashMap底层结构
HashMap的主干是一个Entry对象。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。
HashMap是由数组+链表组成的。
数组是HashMap的主体,而链表是为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向为null),那么对于查找,添加等操作很快,仅需一次寻址。如果定位到的数组位置包含链表,对于添加操作,首先遍历链表,存在即覆盖,否则新增;对于查找操作,也需遍历链表,然后通过key对象的equals方法逐一比对查找。所以HashMap中的链表出现越少,性能就越好。
(3)为什么HashMap线程不安全
jdk1.7多线程环境下,会出现由于头插法环形链表的情况,导致死循环和数据丢失。
jdk1.8多线程环境下,会出现数据覆盖的情况。
(4)ArrayList和LinkedList的区别
1.ArrayList是实现了动态数组的数据结构,LinkedList是基于链表的数据结构
2.对于随机访问get和set操作,ArrayList优于LinkedList,LinkedList需要移动指针。
3.对于新增和删除操作,LinkedList优于ArrayList,ArrayList要移动数据。
(5)ArrayList和Vector的区别
1.同步性
如果只有一个线程访问集合,使用ArrayList,因为ArrayList是线程不安全的,效率更高。如果是多个线程访问集合,使用Vector,因为不需要去编写线程安全的代码。
2.数据增长
ArrayList和Vector都有一个初始的容量大小,当存储进里面的元素个数超过容量时,Vector默认增长为原来两倍,ArrayList从源码来看增长为原来的1.5倍。
(6)Array和ArrayList有何区别
1.Array 可以包含基本数据类型和引用类型,ArrayList只能包含引用类型。
2.Array大小不可以调整大小,但ArrayList可以通过内部方法自动调整容量。
3.ArrayList是List接口的实现类,相比Array支持更多的方法和特性。
(7)HashSet实现原理
1.HashSet是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75的HashMap。所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
2.试图将对象放入HashSet中保存时,重写该类的equals方法和hashcode()方法很重要,这两个方法的返回值必须保持一致。当该类的两个的 hashCode() 返回值相同时,它们通过 equals() 方法比较也应该返回 true。
(8)List、Set、Map之间的区别
List(列表)

List的元素以线性方式存储,可以存放重复对象,List主要有以下两个实现类:
1.ArrayList: 长度可变的数组,可以对元素进行随机的访问,向ArrayList中插入与删除元素的速度慢。JDK8中ArrayList扩容的实现是通过grow()方法里使用语句newCapacity = oldCapacity + (oldCapacity >> 1)(即1.5倍扩容)计算容量,然后调用Arrays.copyof()方法进行对原数组进行复制。
2.LinkedList: 采用链表数据结构,插入和删除速度快,但访问速度慢。
Set(集合)

Set中的对象不按特定(HashCode)的方式排序,并且没有重复对象,Set主要有以下两个实现类:
1.HashSet:HashSet按照哈希算法来存取集合中的对象,存取速度比较快。当HashSet中的元素个数超过数组大小*loadFactor(默认值为0.75)时,就会进行近似两倍扩容(newCapacity = (oldCapacity << 1) + 1)。
2.TreeSet:TreeSet实现了SortedSet接口,能够对集合中的对象进行排序。
Map(映射)

Map是一种把键对象和值对象映射的集合,它的每一个元素都包含一个键对象和值对象。Map主要有以下实现类:
HashMap:HashMap基于散列表实现,其插入和查询<K,V>的开销是固定的,可以通过构造器设置容量和负载因子来调整容器的性能。
LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得<K,V>的顺序是其插入次序,或者是最近最少使用(LRU)的次序。
TreeMap:TreeMap基于红黑树实现。查看<K,V>时,它们会被排序。TreeMap是唯一的带有subMap()方法的Map,subMap()可以返回一个子树。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值