首页 > 编程语言 > 详细

Java面试集合篇

时间:2021-03-17 22:54:38      阅读:37      评论:0      收藏:0      [点我收藏+]

List(有序 可重复的)

? ArrayList: 底层是动态数组,查询快,效率高,增删慢,默认长度为10,当添加的元素超过当前数组长度时,会进行扩容操作,创建一个新数组,长度为当前数组长度的1.5倍,扩容调用的是grow()方法,通过grow()方法中调用的Arrays.copyof()方法进行对原数组的复制,在通过调用System.arraycopy()方法进行复制,达到扩容的目的

? Vector: 底层是动态数组,默认长度为10,查询快,线程安全,效率慢

? LinkedList: 双向链表 增删快,效率高,查询慢,线程不安全

Map

? HashMap: 数组+链表+红黑树 没有存储顺序 线程不安全

? TreeMap:红黑树 非线程安全 有存储顺序 默认key升序 如果需要改变排序方式,则需要使用比较器:comparator

? HashTable:数组+链表 线程安全

? LinkedHashMap:继承于hashMap hashMap是无序的 LinkedHashMap额外维护了一个双向链表用于保持迭代顺序 所以是有序的 默认为插入顺序

Set(无序 不可重复)

? HashSet+:散列集 允许为空 实际为HashMap的实例 值存在hahMap的key上

? TreeSet: 底层是TreeMap 特点 插入无序内部有序

? LinkedHashSet:底层为LinkedHashMap

hashMap1.7和1.8

? 1.7:数组+ 单链表

? 1.8:数组+链表+红黑树(当链表节点大于等于8,也就是默认阈值,会转化为红黑树,当链表节点小于等于6,转为普通链表当链表)

hashMap和hashTable区别

  • hashMap是线程不安全的,可以通过ConcurrentHashMap来得到一个安全的集合,hashTable是线程安全的

  • hashMap允许有空值,hashTable是不允许的

  • hashMap的默认容量为16,hashTable的默认容量为11,两者的负载因子均为0,75,当使用的容量大于乘以负载因子时,会触发扩容机制

concurrentHashMap

  • 1.8之前
    segment+HashEntry:Segment是一个数组,单个segment包含HashEntry,HashEntry是链表结构,可保存key和value.指向下一个节点的指针每个Segment相当于一个HashMap,
    默认的Segment长度是16,可以支持16个线程的并发操作。
  • 1.8
    1.8 CAS+synchronized+Node实现,同样也加入了红黑树,避免链表过长导致性能的问题

Java面试集合篇

原文:https://www.cnblogs.com/qrzu/p/14551448.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!