容器
1、Collection
Collection整体继承结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zetJ14em-1617939659028)(C:\Users\91051\AppData\Roaming\Typora\typora-user-images\image-20210312123733563.png)]
Collection各种实现类的底层数据结构实现
1、List接口实现类
Arraylist
:Object[]
数组Vector
:Object[]
数组,支持线程同步LinkedList
: 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)
2、Set接口实现类
- HashSet:完全使用HashMap实现,就是使用HashMap只存了Key
- LinkedHashSet:数据以我们录入的顺序遍历输出。
LinkedHashSet
是HashSet
的子类,并且其内部是通过LinkedHashMap
来实现的。 - TreeSet:实现了SortedSet接口,底层使用TreeMap实现
3、Queue接口实现类
Deque接口实现了Queeue接口,下面是Deque实现类
ArrayDeque:数组实现,包括队列操作、双端队列操作、栈操作
LinkedList:双向链表实现,包括队列操作、双端队列操作、栈操作
Clloction常用方法
- 1 public boolean add(E e):添加一个元素
- 2 public void clear():清空集合中所有的元素
- 3 public boolean remove(E e):移除集合中指定的元素
- 4 public boolean contains(E e):检查集合中是否包含指定的对象
- 5 public boolean isEmpty():判断集合是否为空
- 6 public void size():判断集合中元素的个数
- 7 public Object[] toArray(new T[0]):把集合元素存储到数组中
- 8 Iterator iterator(); 返回结合的迭代器
注意:(remove与contains源码调用equals方法比较是否含有相等对象)
2、Map
Map各种实现类的底层数据结构实现
- HahsMap: JDK1.8 之前
HashMap
由数组+链表组成的,数组是HashMap
的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。允许key为null,无法线程同步 - LinkedHashMap:
LinkedHashMap
继承自HashMap
,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap
在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑 Hashtable
: 数组+链表组成的,数组是HashMap
的主体,链表则是主要为了解决哈希冲突而存在的,支持线程同步,不允许key为nullTreeMap
:实现了SortMap接口, 够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。底层使用红黑树(自平衡的排序二叉树)
HashMap与HashTable联系:
- 底层均是数组+链表或红黑树;
- HashMap许key为null,无法线程同步;HashTable支持线程同步,不允许key为null
LinkedHashMap与HashMap联系:
- LinkedHashMap继承自
HashMap
,在HashMap结构的基础上,增加了一条双向链表,在其基础上保持了键值对的插入顺序
Map常用方法
//map.size()方法
//map.get(key)
//map.keySet()
//map.entrySet()
//map.clear()
//map.remove(key)
//map.value();所有value
//获得map中键值对的集合
Set set1 = map.entrySet();
//得到集合的迭代器
Iterator iterator = set1.iterator();
3、遍历容器
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
HashMap<Integer, Integer> map = new HashMap<>();
map.put(1, 1);
map.put(2, 1);
//------------List遍历------------
//1、迭代器
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
int i = iterator.next();
System.out.print(i+" ");
}
System.out.println();
//2、for-each(不能执行List的删除添加操作,这会改变size大小但不会更新cursor,否则会遍历出问题或抛出异常)
for(int i:list){
System.out.print(i+" ");
}
System.out.println();
//---------Map遍历--------------
//1、迭代器
Iterator<Map.Entry<Integer, Integer>> iterator2 = map.entrySet().iterator();
while(iterator2.hasNext()){
Map.Entry<Integer, Integer> entry = iterator2.next();
System.out.println("key:"+entry.getKey()+",value:"+entry.getValue());
}
Iterator<Integer> iterator3 = map.keySet().iterator();
while(iterator3.hasNext()){
int key = iterator3.next();
System.out.println("key:"+key+",value"+map.get(key));
}
//2、for-each
for(int key:map.keySet()){
System.out.println("key:"+key+",value"+map.get(key));
}