集合类的特点

集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象并且高效的操作数据。 推荐看一下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…

推荐资料1