Java集合4-3
文章目录
类集结构图
集合是Java中一些成熟的数据结构的实现
java
1、链表和二叉树思路
(1)链表
class Node {
Object data;
Node next;
}
(2)二叉树
class Node {
Object data;
Node left;
Node right;
}
c#
2、Collection接口
通常不会直接使用Collection接口,而是使用其子接口List和Set,都是存储单值的集合类,前者能够重复,后者不能够重复数组
3、List接口
List的实现类,ArrayList(95%)、LinkedList(1%)和Vector(4%),Vector是ArrayList的早期实现,LinkedList是链表实现,而其余是数组的动态扩容实现。安全
1.ArrayList
使用数组进行存储
线程不安全
数据结构
2.Vector
Vector是同步的,即线程安全,若是不要求线程安全,建议使用ArrayListspa
3.LinkedList
使用的是双向链表的结构
线程
4、Iterator和ListItertor
用来遍历集合中的元素
快速失败:好比迭代器遍历以前有10个元素,迭代到一半的时候元素的数量变成5个。那么迭代器就懵了,直接出错给你看
安全失败:在遍历以前复制一份,遍历的是复制的那一份,就算数据被改也不会出现异常。通常不进行特殊的描述指的都是安全失败
(1)iterator.next()用来将指针下移并return下一个元素
使用remove删除元素要先找到元素,不然会出错
(2)ListIterator实际上是Iterator的一个子类,ListIterator能够有前移操做
3d
5、forEach
加强for循环,最先出如今c#语言中,内部使用迭代器进行遍历,用于迭代数组和结合(Collection)
指针
6、Set接口
Collection和Set没有get方法 ,前面说过Set不能包含重复元素,null也只能有一个,模拟数学中集合的概念。若是将可变对象存入Set,则必须很是当心对象
7、HashSet
Set不能重复,HashSet内部的原理实际上是在使用HashMap进行存储
能够看到flag1为true,flag2为false
8、TreeSet类与Comparable接口
前面的HashSet是散列存储,这里的TreeSet采用有序的二叉树进行存储,利用TreeMap进行存储。输出的顺序是数据的顺序,而不是输入的顺序
但是毕竟ABCD咱们都知道他们的顺序,但是若是是咱们自定义的类型呢,好比下面的Person,哪一个在前面,你本身确定也想不明白,那java说我也想不明,我直接出错给你看
那么到底如何解决呢,咱们 须要实现Comparable接口

9、Map 接口
不一样于Collection的单值存储,Map存储的是键值对,Map集合的键不可重复
1.哈希表
哈希桶中的数量大于8时,链表会装换成二叉树,更利于查找;当哈希桶中的数量减小到6时,红黑二叉树转换成链表。当散列因子达到0.75时对哈希表扩容到2倍
2.HashMap/HashTable/ConcurrentHashMap/TreeMap/LinkedHashMap
以上的基本用法是同样的,可是输出的顺序可能不一样,TreeMap和以前的TreeSet同样,若是是自定义类型须要实现Comparable接口
须要注意的是,不能直接对HashMap进行遍历,要先用keySet()将其转化成Set,这里的set是键
或使用values()将其转化成Collection(),这里的values是值
3.Map集合各子类区别分析
(1)HashMap
线程不安全,效率高
(2)HashTable
线程安全,效率低
(3)ConcurrentHashMap
采用分段锁机制保证线程安全,效率又比较高
(4)TreeMap
有序
(5)LinkedHashMap
HashMap加双向链表
4.存储自定义对象
下面咱们自定义一个Book,显然下面的代码是能成功输出的
但若是咱们对book1的name进行修改,此时就不能经过book1找到相应元素了,缘由是以前咱们是经过name和info计算出的hash值,可是当咱们的name被改变以后计算出的hash值就变了
这里的book3也找不到是由于,虽然book3确实能找到book1的位置,但不是找到就结束了,系统还会把book3和book1的key和info进行比较,结果不一致就返回null
当自定义类型须要改变时尽可能不要放在key的位置
10、JDK9集合新特性
提供存储肯定长度的List,不可修改