List,Set,Map 三者的区别
List是有序且允许重复的,内部存储结构是Object数组,它的实现类有ArrayList,LinkedList,Vector,Vector是线程安全的
Set是无序且不允许重复的,内部是数组+链表,它的实现类有HashSet底层数据结构HashMap , LinkedHast数组+链表 TreeSet是可以自动排序的二叉树
Map是KV键值对,是链表+红黑树,
集合框架底层数据结构总结
ArrayList底层采用Object数组的方式进行存储,
LinkedList采用双向链表的方式进行存储(jdk1.8之前是单向链表)(内存空间不连续)
Vector:"Object"数组
HashSet(无序,唯一):基于HashMap实现,底层采用HashMap来保存元素
LinkedHashMap:继承自HashSet,并且内部通过LinkedHashMap来实现 TreeSet(有序,唯一):红黑树(自平衡的排序二叉树)
HashMap:JDK1.8之前HashMap由数组+链表JDK1.8以后HashMap在解决哈希冲突时(在链表长度大于阈值为8)将链表转换为红黑树
LinkedHashMap继承自HashMap由数组和链表+红黑树组成,另外LinkedHashMap在上面结构的基础上,增加了一条双向链表 TreeMap:
红黑树(自平衡的排序二叉树)
HashTable采用数据结构为哈希表(数组+链表)
有哪些集合是线程不安全的?怎么解决呢?
HashSet,TreeSet,ArrayList,LinkedList,HashMap,TreeMap都是线程不安全的。Collections提供了多个静态的方法可以把它们包装成线程同步的集合,对于Map可以使用ConcurrentHashMap
说一说 ArrayList 的扩容机制吧
第一个元素,数组容量扩为10 每次扩容之后的容量都会变为原来的1.5倍
HashMap 有哪几种常见的遍历方式?
1:使用迭代器 2:使用foreach,迭代器的一种简单形式 (先获取所有的key;遍历所有的key;根据每一个key,获取对应的value值) 3:Entry:类对象遍历:直接获取当前Map集合的所有KV键值对,每一个KV键值对都封装成Entry类型
HashMap的扩容机制:
①:创建时如果不指定容量初始值,HashMap的默认初始大小是16。之后每次扩容,容量变为原来的2倍。
②:创建时如果给定了容量大小,HashMap会将其扩充为2的幂次方大小。也就是说HashMap总是使用2的幂作为哈希表的大小。
HashMap,null可以作为键,这样的键只可以有一个,可以有一个或者多个键的值对应为null
底层数据结构:
JDK1.8以后的HashMap在解决哈希冲突时,当链表大于阈值,将链表转为红黑树,以减少搜索时间。
容器
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。