java面试之 List,Set,Map集合

hashMap

  1. 以数组方式存储Key-Value,无序的集合,非线程安全,在多线程、并发情况下是非线程安全的,不会存在相同key。
  2. 在jdk1.7之前是数组+链表结构,在jdk1.8的时候加入了红黑树,默认配置了当链表长度大于等于8时,转为红黑树,优化hash冲突,优化查询效率。
  3. 默认长度16,负载因子为0.75,当达到这个百分比时会自动扩容
  4. 是以Key-Value形式存储数据的,将key的hash值存在一个数组中,每个元素是LinkList结构,实际保存在一个散列表中。
  5. put时,将key通过hash算法得出的hash值,作为数组下标,将实际key-value值存入entry对象中,当hash冲突时会执行头插入,将原数据后移。
  6. get时,会将key通过hash算法得到下标,通过下标值获取数据对象,当值为多个时,通过对象中的next与equals方法去比对相同的KEY值

如何实现hashMap安全

  1. 使用 java.util.Hashtable 类,此类是线程安全的,不允许存入null值。
    在主要方法上都加入了synchronized,保证安全,但也降低效率
  2. 使用 java.util.Collections.synchronizedMap() 方法包装 HashMap ,得到线程安全的Map,并在此Map上进行操作。
    实现原理与hashTable一致,存在一个共享对象,在本身方法上加锁。
  3. 使用 java.util.concurrent.ConcurrentHashMap,此类是线程安全的。
    增加了Segment层,是一个数组,每次操作只对单个Segment加锁,能够实现多线程操作,不仅安全,效率上也高
  4. 自己在程序中加锁,保证安全,会影响功能性能。

LinkedHaspMap

是一个有序集合,遵循先入先出,实现haspMap,是非线程安全,遍历的时候会比HashMap慢,有HashMap的全部特性

TreeMap

基于红黑二叉树的NavigableMap的实现,线程非安全,不允许null,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口排序。

HashMap与TreeMap

  1. HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)
  2. 在Map 中插入、删除和定位元素,HashMap是最好的选择。但如果您要按自然顺序或自定义顺序遍历,那么TreeMap会更好。

HashTable与HashMap

  1. 同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。
  2. HashMap允许存在一个为null的key,多个为null的value
  3. hashtable的key和value都不允许为null。

List

本身有序、可重复,查询快增删速度慢

ArrayList

ArrayList是基于数组,是一个有序的集合,遵循先入先出,可以使用sort方法排序,提供Comparator比较器即可,线程异步不安全的

ArrayList排序

  1. 使用 Collections.sort() 简单的自然排序
  2. 重写Comparable 中的compareTo方法,自定义复杂排序
  3. 使用 Collections.sort()加匿名内部类,实现compare,自定义比较排序

LinkedList

LinkedList是基于链表,是一个无序的双向链表,按照插入的先后顺序排序,不提供sort方法对内部元素排序。

Vector 与 ArrayList

  1. vector是线程安全的,而arraylist是线程不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高
  2. vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%。如果在集合中使用数据量比较大的数据,用vector有一定的优势。
  3. 数组方式存储数据,查找速度相同,对于操作数据ArrayLis效率高

ArrayList和LinkedList

  1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
  2. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
  3. 在操作数据时,单条数据ArrayList效率高,批量操作是LinkedList效率高

Set

不能重复

HashSet

HashSet是基于HashMap来实现的,使用了hashMap的key实现各种特性,不允许重复(HashMap的key不允许重复,如果出现重复就覆盖),允许null值,无序集合,非线程安全。

TreeSet

基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator进行排序,具体取决于使用的构造方法。

LinkedHashSet

  1. 根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序,遵循先入先出,
  2. 在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值