java-集合框架库
目录
集合框架库
0要点
0.1重点
0.2接口简要介绍
1Collection接口
1.1List接口
1.2Set接口
1.3Queue接口
2Map接口
2.0哈希表
2.1HashMap
2.2LinkedHashMap
2.3TreeMap
2.4WeakHashMap
2.4.1强引用:
集合框架库
0要点
0.1重点
①顶层接口的学习:Collection接口(子接口:List接口,Set接口,Queue接口),map接口
②接口实现类介绍:结合源代码学会使用对象的方法、特点、底层数据结构,可以自定义实现集合。
③迭代器的学习。
④理清集合框架图,如图所示。
(虚线框表示接口,实线框表示实现类)
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
0.2接口简要介绍
顶层接口:
Collection:存储相同类型的数据,都是存储单个元素
Map:key-value键值对形式存储
Collection子接口:(数据是否可以重复性、有序性(插入顺序)、是否存储null值)
List:数据可重复、保证有序性、可以存储null ->ArrayList(底层是数组、线程不安全的集合)、Vector(底层是数组、线程安全的集合)、LinkedList(底层是链表)
Set:数据不重复、无法保证有序性、不可以存储null ->HashSet(底层是哈希表结构、去重)、LinkedHashSet(底层是哈希表结构、去重、插入有序)、TreeSet(底层是红黑树结构、去重、有序(基于数据特征))
Queue:数据可以重复,保证有序(基于数据特征)、不可以存储null ->PriortyQueue(优先级队列) 堆
Map接口下的实现类:
HashMap:key底层是哈希表、不能重复,key和value可以为null,线程不安全的
HashTable:底层是哈希表、key不能重复,key可以为null,线程安全的
LinkedHashMap:底层是哈希表、继承自HashMap,保证数据的有序性(插入有序)
TreeMap:保证数据的有序性(默认按从小到大排序)
weakHashMap:
1Collection接口
Collection接口通常不能直接使用,该接口提供了添加、删除、管理元素的方法。因为List和Set接口都继承Collection接口,所以对List和Set集合都实用。
共性方法:
add()//添加元素
clear()//清空所有元素
remove()//删除元素,成功删除返回true,失败返回false
contains()//查看集合中是否包含该元素
isEmpty()//集合是否为空
size()//集合的大小
toArray()//吧集合中的元素存储到数组中
利用实现类ArrayList来研究接口方法:
public static void main(String[] args) {//创建ArrayList实例研究Collection接口的方法ArrayList<Integer> arrayList = new ArrayList<>();ArrayList<Integer> arrayList1 = new ArrayList<>();arrayList1.add(9);arrayList1.add(8);
//添加元素 1 boolean add(E e)arrayList.add(1);arrayList.add(9);
//添加arrayList1集合 boolean addAll(Collection<? extends E> c)arrayList.addAll(arrayList1);
//获取集合中元素的个数 int size()System.out.println("arrayList元素个数:"+arrayList.size());
//获取元素 通过指定下标获取元素 E get(int index)System.out.println("通过下标获取0号元素:"+arrayList.get(0));
//for循环遍历集合System.out.print("arrayList集合中的元素:");for(int i = 0;i<arrayList.size();i++){System.out.print(arrayList.get(i)+"\t");}System.out.println();
//删除集合中所有元素 void clear()arrayList1.clear();System.out.println("arrayList1中的元素个数:"+arrayList1.size());
//查询是否包含指定元素 1 boolean contains(Object o)boolean contains = arrayList.contains(1);System.out.println("arrayList中是否包含指定元素 1:"+contains);
//查询是否包含子集合 boolean containsAll(Collection<?> c)boolean b = arrayList.containsAll(arrayList1);System.out.println("arrayList中是否包含子集合:"+b);
// 判断集合是否为空 boolean isEmpty()boolean empty = arrayList1.isEmpty();System.out.println("arrayList1是否为空:"+empty);
//删除指定元素 注意:只找到第一个相同的元素进行删除arrayList.remove(Integer.valueOf(9));
//迭代器Iterator<Integer> iterator = arrayList.iterator();System.out.println("去除元素9之后:arrayList集合中的元素:");while (iterator.hasNext()){System.out.print(iterator.next()+"\t");}System.out.println();
//保留集合中的指定元素(留下的是list的元素) retainall(list);arrayList.retainAll(arrayList1);//迭代器Iterator<Integer> iterator1 = arrayList.iterator();System.out.println("去除元素后:arrayList集合中的元素:");//集合为空while (iterator1.hasNext()){System.out.print(iterator1.next()+"\t");}System.out.println();
}
迭代器:Collection集合元素的通用获取方式。在取出元素先判断集合中有没有元素,有就取出,然后继续判断有没有,有就继续取出,直到所有元素全部被取出。
功能:
1.能够遍历一个集合/容器
2.我们不需要了解容器内部结构
Iterator()接口常用方法:
next():返回下一元素。
hasNext():判断下一元素是否存在。有则返回true。
remove():移除下一个元素
使用步骤:
1.1List接口
继承Collection接口
1、有序的集合
2、有索引
3、允许存储重复的元素
4、允许存储一个或者多个null值
提供的特有方法(和索引有关):
add(int index,E element)//添加元素到指定索引位置
get(int index)//通过索引获取对应位置的值
set(int index,E element)//将索引位置的值替换成新值,并将旧值返回出来
remove(int index)//删除索引位置的值,返回删除的元素
public static void main(String[] args) {//创建ArrayList实例研究List接口的方法ArrayList<Integer> arrayList = new ArrayList<>();ArrayList<Integer> arrayList1 = new ArrayList<>();arrayList.add(0);arrayList.add(1);arrayList1.add(9);
//迭代器Iterator<Integer> iterator = arrayList.iterator();System.out.println("arrayList集合中的元素:");while (iterator.hasNext()) {System.out.print(iterator.next() + "\t");}System.out.println();//添加元素(尾部) add(E e);arrayList.add(3);
//迭代器Iterator<Integer> iterator1 = arrayList.iterator();System.out.println("添加元素后:arrayList集合中的元素:");while (iterator1.hasNext()) {System.out.print(iterator1.next() + "\t");}System.out.println();
//在指定位置index插入元素element add(int index,E element);arrayList.add(2, 2);
//迭代器Iterator<Integer> iterator2 = arrayList.iterator();System.out.println("插入元素后:arrayList集合中的元素:");while (iterator2.hasNext()) {System.out.print(iterator2.next() + "\t");}System.out.println();
//将已有的Collection的集合的对象的数据插入当前集合 addAll(list1);arrayList.addAll(arrayList1);
//迭代器Iterator<Integer> iterator3 = arrayList.iterator();System.out.println("添加集合后:arrayList集合中的元素:");while (iterator3.hasNext()) {System.out.print(iterator3.next() + "\t");}System.out.println();
//在指定位置插入集合对象 addAll(int index,Collection<? extends E> c);arrayList.addAll(2, arrayList1);
//迭代器Iterator<Integer> iterator4 = arrayList.iterator();System.out.println("插入集合后:arrayList集合中的元素:");while (iterator4.hasNext()) {System.out.print(iterator4.next() + "\t");}System.out.println();
//删除指定对象元素 remove(Integer.valueOf(7));arrayList.remove(Integer.valueOf(2));
//迭代器Iterator<Integer> iterator5 = arrayList.iterator();System.out.println("去除元素后:arrayList集合中的元素:");while (iterator5.hasNext()) {System.out.print(iterator5.next() + "\t");}System.out.println();
//删除指定位置的元素 remove(int index);arrayList.remove(0);
//迭代器Iterator<Integer> iterator6 = arrayList.iterator();System.out.println("去除元素后:arrayList集合中的元素:");while (iterator6.hasNext()) {System.out.print(iterator6.next() + "\t");}System.out.println();
//删除指定集合里的数据(删除有list中的元素) removeAll(list);arrayList.removeAll(arrayList1);
//迭代器Iterator<Integer> iterator7 = arrayList.iterator();System.out.println("去除集合后:arrayList集合中的元素:");while (iterator7.hasNext()) {System.out.print(iterator7.next() + "\t");}System.out.println();
//修改操作,指定位置index修改成某值element set(int index,E element);arrayList.set(0, 8);
//迭代器Iterator<Integer> iterator8 = arrayList.iterator();System.out.println("修改元素后:arrayList集合中的元素:");while (iterator8.hasNext()) {System.out.print(iterator8.next() + "\t");}System.out.println();
//查询操作,查询指定位置index的元素 get(int index);System.out.println("0号位置的元素:" + arrayList.get(0));
//部分数据 从起始位置fromIndex到toIndex的数据获取 subList(int fromIndex,int toIndex);System.out.println("0-2号位置的元素:" + arrayList.subList(0, 2));
}
数据可以重复,可以存储null值,安全性
基本数据结构:数组,链表,队列,栈,堆……主要在存储数据时组织数据存储的方式不同
集合底层也是依赖基础的数据结构来存储
1、集合可以动态扩容:数组则是开辟一段连续的内存空间
2、集合提供丰富API接口,方便使用:数组移动(删除,添加)需要自行考虑,集合可以自动移动,提供专有的API接口,不需要关注底层实现
1.1.1ArrayList集合
ArrayList是List接口的一个实现类
特点
1、数据有序
2、底层基于数组实现,
3、可以存储null
4、不支持多线程
例:求两个集合的交并补集
public static void main(String[] args) {ArrayList<Integer> a = new ArrayList<Integer>();//集合aArrayList<Integer> b = new ArrayList<Integer>();//集合ba.add(1);a.add(2);a.add(3);b.add(3);b.add(4);b.add(5);//a:1 2 3 b: 3 4 5//并集 1 2 3 4 5a.addAll(b);//交集 3
// a.retainAll(b);//差集 1 2
// b.retainAll(a); //将b集合变成和a集合的交集
// a.removeAll(b); //在将a集合中属于a,b交集的部分去除掉//迭代器Iterator<Integer> it = a.iterator();while (it.hasNext()){System.out.print(it.next()+" ");}}
并集结果:
交集结果:
差集结果:
源码分析
底层采用的数据结构是数组,由于数组查询快,增删慢,所以ArrayList集合适合用于多查询少增删的场景
这是add()添加方法底层实现的逻辑:添加元素时数组扩容重新申请一个size+1的数组,将原数组复制去新的数组,将新元素添加到新数组的最后。
继承关系
ArrayList<E> extends AbstractList<E>,
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
而AbstractList<E>继承自List接口,对接口中的方法进行了实现,
1.1.2LinkedList集合
特点:
有序
底层是链表(查询慢,增删快)
不支持多线程
特有方法:
import java.util.LinkedList;public class LinkedListTest {/*public void addFirst(E e) :将指定元素插入列表开头public void addLast(E e):将指定元素添加到列表结尾public void push(E e):将元素推入此列表所表示的堆栈 和addFirst()效果相等public E getFirst():返回列表的第一个元素public E getLast():返回列表的最后一个元素public E removeFirst():移除并返回列表的第一个元素public E removeLast():移除并返回列表的最后一个元素public E pop():从列表所表示的堆栈中弹出一个元素 和removeFirst()效果相等public boolean isEmpty() :如果队列不包含元素,返回true*/public static void main(String[] args) {LinkedList<Integer> linkedList = new LinkedList<>();linkedList.addFirst(1);linkedList.addLast(2);linkedList.push(3);System.out.println(linkedList);Integer first = linkedList.getFirst();System.out.println("first:" + first);Integer last = linkedList.getLast();System.out.println("last:" + last);Integer removeFirst = linkedList.removeFirst();System.out.println("removeFirst:" + removeFirst);Integer removeLast = linkedList.removeLast();System.out.println("removeLast:" + removeLast);Integer pop = linkedList.pop();System.out.println("pop:" + pop);boolean empty = linkedList.isEmpty();System.out.println("empty:" + empty);}
}
1.1.3ArrayList和LinkedList的比较
区别:
①底层数据结构不同:ArrayList是基于动态数组的数据结构,LinkedList基于双向链表的数据结构
②访问效率:对于get和set方法,ArrayList优于LinkedList
③修改效率:add和remove方法,LinkedList优于ArrayList
缺点:
ArrayList会存在一定的空间浪费,在创建时会预留一部分的容量空间
ArrayList删除等操作会涉及当前元素后续元素的移动,插入和删除某一固定位置的对象时速度比较慢。
应用场景
ArrayList运用在查询比较多,修改比较少的场景
LinkedList运用在修改比价多,查询比较少的场景
1.1.4Vactor集合
和ArrayList集合类似,底层是数组。但是Vactor是单线程的,线程安全,速度慢
1.1.5Stack
1.2Set接口
继承Collection接口
set接口的实现类:HashSet、LinkedHashSet和TreeSet
Set接口特点:数据是不能重复的、最多可以存储一个null值,无索引
Set接口提供的方法API:
底层数组是哈希表:
先来了解一下哈希值。
哈希值:十进制整数,由系统随机给出,逻辑地址,模拟出来得到的地址,不是物理地址。
在Object类中有一个方法,可以获取对象的哈希值
int hashCode() 返回该对象的哈希码值
jdk1.8之前:哈希表 = 数组 + 链表
jdk1.8之后:哈希表 = 数组 + 红黑树
数组结构把元素进行了分组(相同哈希值的分为1组),链表/红黑树把相同的哈希值的元素连接到一起。
哈希表特点:查询速度快
哈希冲突:元素内容不同但哈希值相同。
不允许重复元素的原理:
使用set集合保证数据唯一的前提是需要 equals方法和hashCode方法
基本数据类型都重写了equals方法和hashCode方法,可以直接使用,如果是自定义的数据类型,需要自己重写后才能正常使用
1.2.1HashSet集合
特点:
1、HashSet不能保证数据有序(无序)
2、HashSet数据是不能重复的
3、HashSet是可以存储null值
4、底层是哈希表结构(查询速度快)
hashSet属性:
//map属性是存储数据的,是HashMap类型的数据 private transient HashMap<E,Object> map; //PRESENT属性, private static final Object PRESENT = new Object();
HashSet底层实现是基于HashMap来实现的,将set中存储的值作为HashMap的key来处理,PRESENT是一个填充的value值
HashMap的构造函数:
public HashSet() {map = new HashMap<>();}
public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}
public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}
public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}
HashSet方法:
public boolean add(E e) {return map.put(e, PRESENT)==null;}
HashSet应用场景:
在做数据去重的场景下使用
1.2.2LinkedHashSet集合
LinkedHashSet特点:
1、数据有序
2、数据不能重复
3、数据是可以存储null的
4、底层是一个哈希表:数组+链表/红黑树+链表:多了一条链表来记录元素的存储顺序,保证了元素有序
LinkedHashSet的源码实现:
public class LinkedHashSet<E> extends HashSet<E>implements Set<E>, Cloneable, java.io.Serializable {
public LinkedHashSet(int initialCapacity, float loadFactor) {super(initialCapacity, loadFactor, true);}
public LinkedHashSet(int initialCapacity) {super(initialCapacity, .75f, true);}
public LinkedHashSet() {super(16, .75f, true);}
public LinkedHashSet(Collection<? extends E> c) {super(Math.max(2*c.size(), 11), .75f, true);addAll(c);}
}
通过声明形式可知:其继承自HashSet,其继承了HashSet中所有的属性和方法
构造函数调用父类HashSet中方法如下:
HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new <>(initialCapacity, loadFactor);}
LinkedHashSet的实现是基于LinkedHashMap来实现的
LinkedHashSet数据有序的特征是基于LinkedHashMap来保证的,其底层利用双向链表来实现的数据有序
LinkedHastSet的应用场景:
在去重的基础上数据有序
1.2.3TreeSet集合
TreeSet <Integer> treeSet = new TreeSet <Integer>();treeSet.add(3);treeSet.add(1);treeSet.add(6);treeSet.add(1);
treesSet特点:
1、数据自然有序(自定义排序,实现Comparator接口)
2、数据不能重复
3、数据不能为null
通过源码可知:TreeSet底层是基于treeMap来实现的
TreeSet引用场景
数据需要去重,且数据按照特定大小进行排序
1.3Queue接口
队列:
先进先出
queue接口除了实现collection接口下的基本方法,还提供了特殊方法,和collection接口不同的是:
常用API:
优先级队列
PriorityQueue特点:
1、数据是按照一定的优先级进行排序,默认是从小到大排序(集合内部不是有序的,只能保证队头第一个元素是最小/最大值)
2、不能存储null值
3、存储元素可以重复
优先级队列底层实现的数据结构是:堆
小根堆的实现
添加元素
添加在堆尾,判断该节点和父节点的大小关系,若小于父节点,则交换位置,接着和当前的父节点继续比较,直到不在交换为止(当前节点大于父节点)。
删除元素
删除堆头的元素,把最后一个元素放在堆头位置,向下调整,找左右孩子中最小的和当前节点调整,接着判断该节点与当前的左右孩子中的最小的比较,直到碰到叶子节点或者当前节点小于左右孩子时停止。
自定义实现优先级队列
public class DIYPriorityQueue212 { //数据的存储private Integer data[]; //存储数据个数 private int size; private Integer capcity;public DIYPriorityQueue212(Integer initcapcity) {data = new Integer[initcapcity];size = 0;capcity = initcapcity;}public DIYPriorityQueue212() {this(16);}//插入数据 public void add(Integer v) {//判断容量是否满足 if (size >= capcity) {//扩容处理 } if (size == 0) {data[0] = v;} else {data[size] = v;//进行调整 siftUp(size);}size++;}//向上调整 private void siftUp ( int k){while (k > 0) {int parentIndex = (k - 1) / 2;if (data[parentIndex] > data[k]) { //父节点大于当前节点 int tmp = data[k]; data[k] = data[parentIndex]; data[parentIndex] = tmp; k = parentIndex; } else {break;}}}//向下调整private void siftDown ( int k){int half = size / 2; //找到所有的非叶子节点 while (k < half) {int child = k * 2 + 1;int rchild = k * 2 + 2;//找到最小孩子的索引位置并赋给child if (rchild < size && (data[child] > data[rchild])){ child = rchild;}if (data[k] > data[child]) {int tmp = data[k];data[k] = data[child];data[child] = tmp;k = child;} else {break;}}}//删除数据 public Integer remove() {if (size == 0) {return null;}int oldValue = data[0];data[0] = data[size - 1];///向下调整 siftDown(0);data[size - 1] = null;size--;return oldValue;}//获取堆顶元素 public Integer peek() {return data[0];}
//作业;
自定义实现一个大根堆的优先级队列(要支持泛型)
comparable和的 比较
源码实现
1、类的继承形式
继承extends AbstractQueue
2、属性
3、构造函数
4、默认值、默认属性
5、扩容机制
6、常用的方法
2Map接口
存储形式:键值对K-V
Map接口:
存储的是键值对形式,key-value键值对存在,key值是不能重复的,value是可以重复的
Map接口下方法:
集合中常用方法解释:
// V put(K key, V value) 向集合中添加键值对hashMap.put("张杰","谢娜");
// hashMap.put("张杰","谢娜2");System.out.println(hashMap.size());//void clear() 将集合元素清空处理
// hashMap.clear();//boolean containsKey(Object key) 判断集合中是否存在指定的键 key 存在返回true 不存在返回falseboolean key = hashMap.containsKey("战三");
// System.out.println(key);//boolean containsValue(Object value) 判断集合中是否存在指定的值value 存在返回true 不存在返回falsehashMap.containsValue("zhangsna");
// System.out.println(hashMap.size());//V get(Object key) 通过键key获取valueString s = hashMap.get("张杰");
Map接口下集合的遍历形式:
/通过entrySet遍历键值对Iterator <Map.Entry <String, String>> iterator = hashMap.entrySet().iterator();while (iterator.hasNext()) {Map.Entry <String, String> entry = iterator.next();System.out.println("key:"+entry.getKey()+",value:"+entry.getValue()+ " ");}//通过keySet遍历键Iterator <String> iterator1 = hashMap.keySet().iterator();while (iterator1.hasNext()) {String key1 = iterator1.next();System.out.print(key1+" ");}//通过values()遍历值Iterator <String> iterator2 = hashMap.values().iterator();while (iterator2.hasNext()) {String value = iterator2.next();System.out.print(value+" ");}
2.0哈希表的介绍
HashMap哈希表(也叫关联数组)一种通用的数据结构,哈希表是一种通过关键码去寻找值得数据映射结构
几个专业的词汇
键(key):又称为关键字。唯一的标示要存储的数据,可以是数据本身或者数据的一部分。
槽(slot/bucket):哈希表中用于保存数据的一个单元,也就是数据真正存放的容器。
哈希函数(hash function):将键(key)映射(map)到数据应该存放的槽(slot)所在位置的函数。
哈希冲突(hash collision):哈希函数将两个不同的键映射到同一个索引的情况。
构造哈希函数的方法:
1、直接寻址法:
2、除留余数法:
哈希冲突的解决
1、链地址法:
当出现哈希冲突时,在冲突的地方通过链表来解决
这个图中h(x) = x mod 10 ;是一个哈希函数,可见代入x=91和x=1的时候都会到映射到键值为1的slot,那么这样就会引发冲突,在链地址法中,用链表延展去存储同键值的数据。
优点:
1、处理冲突简单,无堆积现象,非同义词不会产生冲突,平均查找时间短
2、在用链地址构造的散列表中,删除结点的操作易于实现
2、线性探测法
通过散列函数hash(key),找到关键字key在线性序列中的位置,如果当前位置已经有了一个关键字,就长生了哈希冲突,就往后探测i个位置(i小于线性序列的大小),直到当前位置没有关键字存在。
2.1HashMap
特点
1.数据没有顺序
2.key 值不能重复,value值可以重复
3.可以存储null值
遍历形式
1、以键值对的形式遍历,通过entrySet(),得到Set集合 迭代器数据类型:Map.Entry<String,String>
2、以键的形式遍历,通过keySet()提供的方法
3、以value形式进行遍历,通过values()
分析HashMap源码
继承结构
构造函数
属性
扩容机制
二倍扩容
常见方法
put方法
remove方法
应用场景
数据统计
***底层实现方式
HashTable:和HashMap类似,但它是单线程,线程安全的,速度慢。并且不能存储null值null键。
2.2LinkedHashMap
2.2.1LinkedHashMap的定义:
public class LinkedHashMap<K,V>extends HashMap<K,V>implements Map<K,V>
HashMap,HashTable,LinkedHashMap底层数组初始容量为16
LinkedHashMap继承自HashMap,默认值,扩容,加载因子(0.75)等都相同
但唯一不同的就是:插入有序
2.2.2特有属性
transient LinkedHashMap.Entry<K,V> head; //默认(flase)插入有序 true是访问有序final boolean accessOrder;
2.2.3put操作
2.3TreeMap
2.3.1特点:
有序,能够按照key大小排序
key不可以存null值,key不能重复
2.3.2红黑树:
如何做到数据有序? 红黑树
~红黑树:是一颗二叉树
{二叉树特征:树中的任何一个节点的值都大于它的左孩子,小于它的右孩子,提高检索效率
二叉树在生成过程的容易失衡,导致检索效率降低
平衡二叉树:是一颗空树,左右子树的高度差的绝对值不超过一,并且左右孩子都是一颗平衡二叉树
}
红黑树是一种平衡二叉树,要满足数据的平衡,二叉树要满足一下特点:
1、每个节点都只能是红色或者黑色
2、根节点必须都是黑色
3、叶子结点都必须是黑色的
4、如果一个节点时红色的,则它的子节点都是黑色的,一条路径上不能出现相邻的两个红色节点或黑色节点
5、从任意一个节点到其叶子节点包含相同数目的黑色节点
插入或者删除数据,红黑树就发生了变换,调整无非就是左旋,右旋,或者着色
2.3.3TreeMap源码分析
存储数据Entry节点:
static final class Entry<K,V> implements Map.Entry<K,V> {K key; //键V value; //值Entry<K,V> left = null;//左孩子Entry<K,V> right = null;//右孩子Entry<K,V> parent; //父节点boolean color = BLACK;//颜色//左孩子,右孩子,父节点,颜色(默认是black)Entry(K key, V value, Entry<K,V> parent) {this.key = key;this.value = value;this.parent = parent;}
比较器
private final Comparator<? super K> comparator;//比较器private transient Entry<K,V> root = null; //root属性,红黑树的根节点,是entry类型
entry节点根据key进行排序/*** The number of entries in the tree*/private transient int size = 0; //存储数据数量
构造函数:
//默认的构造方法,comparator为null,按照key自然顺序来位置TreeMap的顺序 public TreeMap() {comparator = null; } //指定一个比较器来构造一个TreeMap public TreeMap(Comparator<? super K> comparator) {this.comparator = comparator; } // public TreeMap(Map<? extends K, ? extends V> m) {comparator = null;putAll(m); }//构造一个sortmap的TreeMap,使用sortmap实例的构造器来实例TreeMap public TreeMap(SortedMap<K, ? extends V> m) {comparator = m.comparator();try {buildFromSorted(m.size(), m.entrySet().iterator(), null, null);} catch (java.io.IOException cannotHappen) {} catch (ClassNotFoundException cannotHappen) {} }
2.3.4treemap提供的方法:
2.4WeakHashMap
优化jvm,使GC更加智能的回收无用对象
weakhashmap关键是:当一个键对象被GC回收是,响应的值对象的引用从map中删除,weakhashmap能节约存储空间,来实现缓存那些非必要的数据
引用类型:
java中提供的引用类型有4种:强(Strong)引用,软(soft)引用,弱(weak)引用,虚(phantom)引用
2.4.1强引用:
常使用的引用类型,在创建对象时
Object o = new Object();
只要强引用存在,GC永远不会被回收引用的对象,通过new创建的对象所关联引用就是强引用,此时GC就不会碰该对象,当JVM内存空间不足,JVM宁愿抛出OOM(OutOfMemoryError)运行错误,使得程序终止,也 不会随时回收强引用所作用的对象
java中除了强引用还有三种引用,在java.lang.ref.Reference
2.4.2软引用:
内存不足就回收
2.4.3弱引用:
GC操作时就会被回收
2.4.4虚引用:
是最弱的引用关系,一个对象是否有虚引用的存在,不会影响对象的生命周期,虚引用存在的目的是当对象被回收时收到一个系统通知
java-集合框架库相关推荐
- 【Java集合框架】ArrayList类方法简明解析(举例说明)
本文目录 1.API与Java集合框架 2.ArrayList类方法解析 2.1 add() 2.2 addAll() 2.3 clear() 2.4 clone() 2.5 contains() 2 ...
- Java集合框架之四大接口、常用实现类,java基础面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- Java 集合框架系列,总结性全文,解决你所有困惑
文章目录 集合接口 Collection Map 集合实现类 抽象类实现 通用实现 遗留实现 并发实现 特殊实现 适配器实现 包装器实现 便利实现 基础设施 算法和工具实现 定长/变长 可改/不可改 ...
- Java集合框架综述,这篇让你吃透!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:平凡希 cnblogs.com/xiaoxi/p/60899 ...
- Java集合框架的知识总结(1)
Java集合框架的知识总结(1) 所有集合类都位于java.util包下.集合中只能保存对象(保存对象的引用变量). Java的集合类主要由两个接口派生而出:Collection和Map,Collec ...
- java集合框架史上最详解(list set 以及map)
title: Java集合框架史上最详解(list set 以及map) tags: 集合框架 list set map 文章目录 一.集合框架总体架构 1.1 集合框架在被设计时需满足的目标 1.2 ...
- 【Java集合源码剖析】Java集合框架
2019独角兽企业重金招聘Python工程师标准>>> Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集 ...
- Java集合框架中Map接口的使用
在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...
- java集合框架综述
一.集合框架图 简化图: 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和 ...
- java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类...
本文关键词: java集合框架 框架设计理念 容器 继承层级结构 继承图 集合框架中的抽象类 主要的实现类 实现类特性 集合框架分类 集合框架并发包 并发实现类 什么是容器? 由一个或多个确 ...
最新文章
- HttpContext.Current.Session ,出现未将对象引用设置到实例上
- Vue中token刷新及token过期的实现
- Java工作笔记-@Value注解的使用(可用于配置文件)
- 微信小程序canvas保存绘制图片
- ajax回显500因为#与$的原因
- python 源码编译教程_python源码编译
- 如何修改influxdb表结构_influxdb基本操作
- winform 报表的基本使用
- 上海电信中兴B860A 4K版破解
- 嵌入式linux项目,嵌入式linux项目开发(一)
- SpringCloud 问题杂集
- Google play中下载apk
- 国外数据挖掘方面的经典博客
- 定制自己的股票量化分析工具QTYX-V2.0版-使用帮助
- 题目7:猴子跳台阶 1级和3级
- Ubuntu 重命名文件
- 清华郑莉C++语言程序设计学习笔记(1)- 绪论、C++简单程序设计、函数
- Android下的遥控器DIY
- shell不允许输入空字符_Linux Cygwin知识库(一):一文搞清控制台、终端、shell概念...
- 以下选项中不是python对文件的写操作方法的是_以下选项中不是Python对文件的写操作方法的是:()-智慧树品三国,论领导艺术章节答案...
热门文章
- 华为笔记本电脑真香,包邮送一台!
- 机器学习基石(林軒田)笔记之十二
- Excel 2010 VBA 入门 028 向单元格输入公式
- html word 编辑表格,在Word文档中运用编辑表格的7个技巧
- docker 常用命令 -----(批量查看镜像/容器,重命名,运行,进入容器,私有仓库)
- JTopo添加动态连线
- (小甲鱼python)集合笔记合集一 集合(上)总结 集合的简单用法 集合的各种方法合集:子、交、并、补、差、对称差集、超集
- ABP——切换MySQL数据库
- 共建计算产业,共创数智未来
- Python--自动将文件分类归入文件夹