Java Collections
集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象并且高效的操作数据。 推荐看一下collection继承体系图
抽象类的使用
如果要自己实现一个集合类,去实现那些抽象的接口会非常麻烦,工作量很大。这个时候就 可以使用抽象类,这些抽象类中给我们提供了许多现成的实现,我们只需要根据自己的需求重写一些方法或者添 加一些方法就可以实现自己需要的集合类,工作流昂大大降低
List
- ordered/有序的
- 几种构造器的不同参数
- int参数引出容量问题,扩容(原先的容量*1.5),扩容以后原先的就是垃圾了
- list有arraylist和linkedlist
Set
- 无序的,但不能包含重复元素
- 判断重复,通过equals方法
- 如果集合很大,每个新加的元素要跟所有元素判断相等
- hash code,Java世界的第二大重要约定
- 相同的对象有相同的hashcode
- 假如两个对象的equals返回true,则他们的hash code也一定相同
- 假如两个对象不相等,也可能返回相同的hash code
- object 映射成 int
- hash code是单向的映射,不能通过hash code得到object,多对一,而一不能对多
- hashSet是无序的,而且随时间可以改变顺序,能保证顺序的是LinkedHashSet(用双向链表)
- 比较三种set
- hashset: 顺序完全随机
- linkedhashset: 和插入的顺序一样
- treeset: 有序的,通过comparable接口约定来排序,内部结构是红黑树, treeset最大的用处就是排序
Map
- key不能重复,value可以重复
- keySet,和map共用一组数据,keyset的改变会影响map,map的改变也会影响keyset(很重要的坑)
- keyset返回的是set,values返回的是collection(可能有重复)
- entryset, 返回键值对,迭代的时候很有用
- hashmap的key的set就是一个hashset,从源码看到,hashset肚子里面包了一个hashmap
- hashmap扩容
- hashmap线程不安全,(不同步),
- hashmap的死循环:多线程情况下扩容会造成循环链表
- 用concurrentHashMap
- hashmap在java7后的改变,链表变为红黑树
- treemap
collection的其他实现
- queue/deque
Guava
- 如果碰到collection不能解决的问题,首先尝试在guava中寻找有没有可用的
- 常用的有
- lists, sets, maps
- immutableMap, immutableSet
- multiset, multimap
- bimap
java约定
- 工具在name+s里面,比如collections, sets, lists…