JAVA集合简介
Collection和Map,是集合框架的根接口。
1、Collection
1.1、List
有序列表(FIFO),可存放重复元素。
1.1.1、ArrayList
数组结构(查询快,增删慢),线程不安全。
自动扩容机制:
- 首先得到当前elementData属性的长度oldCapacity。
- 然后通过判断oldCapacity和minCapacity参数谁大来决定是否需要扩容, 如果minCapacity大于 oldCapacity,那么我们就对当前的List对象进行扩容。
- 扩容的的策略为:取(oldCapacity * 3)/2 + 1和minCapacity之间更大的那个。
- 然后使用数组拷贝的方法,把以前存放的数据转移到新的数组对象中。新添加的元素放在新的数组对象中。
- 如果minCapacity不大于oldCapacity那么就不进行扩容。
1.1.2、LinkedList
双向链表结构(查询慢,增删块),线程不安全。
1.1.3、Vector
数组结构(查询快,增删慢),线程安全。
1.2、Set
无序存储,不可存放重复元素。强调一无二的性质。底层的本质其实就是对应的Map,存放的元素就是在Map的key中存放的。
1.2.1、HashSet
哈希表结构,通过hashCode()与equals()方法保证元素唯一。线程不安全。
注意:两个对象相同的话,则hash值一定相同,但是hashCode值一样的两个对象并不一定相同,因为存在hash值冲突。并且如果重写了保存在HashSet中对象的equals()方法,则一定要重写hashCode()方法。
HashSet过滤重复元素:调用元素HashCode获得哈希码 --> 判断哈希码是否相等,不相等则录入 --> 相等则判断equals()后是否相等,不相等在进行 hashcode录入,相等不录入。
1.2.2、LinkedHashSet
HashSet的子类。链表+哈希表结构,用一个链表来维护元素的插入顺序,所以是有序的。线程不安全。
1.2.3、TreeSet
红黑树结构,有序。线程不安全。
1.3、Comparable和Comparator
-
Comparable是排序接口:若一个类实现了Comparable接口,就意味着“该类支持排序”。
-
Comparator是比较器:我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
1.4、Map
键值对(KV)映射存储,每个key是唯一的且只能映射一个value。
1.4.1、HashMap
JDK7是数组+链表的结构,JDK8是 数组+链表+红黑树结构。无序存储,线程不安全,允许null键。
1.4.2、HashTable
无序存储,线程安全,不允许null键。
1.4.3、TreeMap
红黑树结构,有序存储,不允许null键。
1.4.4、LinkedHashMap
有序存储,此实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。存储的数据是有序的。
2、总结
线程安全 | 线程不安全 | |
---|---|---|
Collection | Vector | ArrayList、LinkedList、HashSet、TreeSet |
Map | HashTable | HashMap、TreeMap、LinkHashMap |
字符串 | StringBuff | StringBuilder |
本文来自博客园,作者:是老胡啊,转载请注明原文链接:https://www.cnblogs.com/solar-9527/p/15906408.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了