集合是什么
集合实际上就是一个容器,可以容纳其他类型的数据。
集合是一个容器,是一个载体,可以一次容纳多个对象。
所有的集合类和集合接口都在Java.util.*下面
单个方式存储元素:
超级父接口:java.util.Collection
键值对的方式存储元素
超级父接口:java.util.Map
总结
ArrayList:底层是数组
LinkedList:底层是双向链表
Vector:底层是数组,线程安全的,效率较低,使用较少
HashSet:底层是HashMap,放到HashSet集合中的元素等同于放到HashMap集合中的key部分了
TreeSet:底层是TreeMap,放到HashSet集合中的元素等同于放到HashMap集合中的key部分了。
HashMap:底层是哈希表。
-------hashcode(): 先比较hashcode的返回值是否相同,如果不同,就是不同的对象,可以存储 如果相同,接着比较equals方法的返回值
-------equals():如果返回true,代表相同 如果返回false,代表不相同,就可以存
Hashtable:底层也是哈希表,只不过是线程安全的,效率较低,使用较少。
Properties:是线程安全的,并且key和value只能存储字符串String。
TreeMap:底层是二叉树,TreeMap集合的key可以自动按照大小顺序排序。
1、Map(双列集合)
1.1、HashMap
HashMap底层基于Map和链表 并且在JDK1.8及之后添加了红黑树部分 因为底层有链表 所以增删改效率高 其次因为底层包含了Map所以存储的也是<K,V>形式的键值 HashMap源码中写到继承了AbstractMap 并且在JDK1.8之后 HashMap中链表长度大于8之后会转化为红黑树
详解
HashMap基于了数组和链表 其中数组可以快速的定位到数据在哪一条链表 链表的优点是插入或者删除 两者结合出来之后 就可以避免HashMap中链表过长而导致难于查询 也避免了使用数组进行插入或删除 两者相互减少缺陷 并且HashMap在存值超过临界点时为了不影响效率 会自动扩容 并且HashMap线程不安全因为map初始化为一个长度为2的数组,loadFactor=0.75,threshold=2*0.75=1,也就是说当put第二个key的时候,map就需要进行resize
取值方法get(key) 添加值方法 put(k,v)
1.2、LinkedHashMap(HashMap子类)
底层数据结构由链表和哈希表组成。
由链表保证元素有序。
由哈希表保证元素唯一。
1.3、Hashtable
底层数据结构是哈希表。线程安全,效率低
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可
1.4、 TreeMap
底层数据结构是红黑树。(是一种自平衡的二叉树)
如何保证元素唯一性呢?
根据比较的返回值是否是0来决定
如何保证元素的排序呢?
两种方式
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator
2、List(有序 可重复)
2.1、ArrayList
ArrayList是比较常用的一个List集合 它底层基于数组 继承自AbstractList 并且实现了List接口 因为底层基于数组 所以大小是动态变化的 允许null的存在 同时也实现了RandomAccess、Cloneable、Serializable接口 所以ArrayList是支持快速访问、复制、序列化的
详解
ArrayList和List在遍历时都不能对集合进行remove操作 因为remove会影响集合的大小从而造成结果不精准或者是数组下标越界 其次ArrayList的扩容机制是默认将集合的大小扩容到原容量的1.5倍 .length( ) 可以获取到ArrayList的长度 在ArrayList中如果需要边遍历边 remove ,必须使用 iterator。且 remove 之前必须先 next,next 之后只能用一次 remove
添加方法是list.add( ) 获取是 get( )
2.2、LinkedList
LinkedList也是很常用的一种数据结构 与ArrayList一样都实现了List接口 但LinkedList底层是基于了链表 所以LinkedList会比ArrayList增删改的效率高 但因为ArrayList底层有一部分基于了数组 所以比LinkedList查询效率高 除了List接口之外 LinkedList还实现了Deque、Cloneable、Serializable接口 这三个接口也证明了LinkedList中支持队列、克隆、序列化 也允许null的存在
详解
LinkedList提供了以下三个成员变量。size,first,last。
3、Set(无序 不可重复)
3.1、HashSet
底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。
3.2、LinkedHashSet
底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。
3.3、TreeSet
底层数据结构采用红黑树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。根据构造方法不同,分为自然排序(无参构造)和比较器排序(有参构造),元素通过比较返回的int值来判断排序序列,返回0说明两个对象相同,不需要存储;