集合框架(Map容器/Collections工具类)
>两大主流:collection、map(接口)
底层实现为数组和链表;
RationalRose工具:接口与典型实现类;
Map为key和value对的形式;
>HashMap(线程不安全)/Hashtable(线程安全,过时淘汰)
两个类功能相似,同样当需要线程安全的时候,使用Collections工具类,将HashMap转为线程安全;
基本操作代码:
package com.ls.map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class Tmap {
public static void main(String[] args) {
HashMap map=new HashMap();
//存放数据,如果key相同,后面的值覆盖前面的值;
map.put("0531", "济南");
map.put("0532", "青岛");
//size
map.size();
//根据key来拿到value
Object object = map.get("0531");
//拿到所有key的集合,使用迭代器迭代
Set keySet = map.keySet();
Iterator iterator = keySet.iterator();
while (iterator.hasNext()) {
System.out.println(map.get(iterator.next()));
}
//直接拿到所有value,迭代
Collection values = map.values();
for (Iterator iterator2 = values.iterator(); iterator2.hasNext();) {
System.out.println(iterator2.next());
}
}
}
>HashSet与HashMap之间的关系
类和类之间的关系:(继承,关联管理,依赖)
HashSet底层代码是依赖于HashMap,Map的底层代码比较复杂;
1.HashMap主要用途是什么
数字字典:(已经存在的可罗列的一堆数据,并不会收到业务的影响,比如省和简称)
缓存:读缓存,写缓存;
2.HashMap使用的时候怎样可以更快一些
HashMap map=new HashMap(//这里放入2的幂,同时比预计的数字大一点);
3.HashMap底层源码的学习
DEFAULT_INITIAL_CAPACITY 初始容量:要求是2的幂,默认是16;
MAXIMUM_CAPACITY HashMap的负载因子,用来决定HashMap什么时候进行扩容,默认0.75,也就是当前存放12个数据的时候,进行扩容;
HashMap的底层是一个数组,所以存在扩容问题;
什么时候扩容:当数组长度*负载因子>=当前存放的键值对的数量;
transient Entry[ ] table;
//这个是用来存放键值对的数组(数组的每个位置上可能是链表,但要防止这种情况);
threshold:数组扩容的阈值;
Entry类:一个单向链表;
默认的构造:
put方法:
1.根据key的hashcode()计算出一个hash值;
2.拿着这个hash值和16(数组长度)(16-1 15 1111 只要h不同,与出来结果就不同)计算一个int值i;
这个i就是最终这个键值对应value数据要放到数组的下标;
注意:这里的扩容方法,不是像ArrayList中简单的Array.copy...
因为这里的数组的长度,参与的value值下标的计算,要把数据拿出来,重新计算hash值,再放回去;
>collections工具类
1.排序
collections.sort();
collections.sort(//容器,//写一个比较器,重写compare方法);
2.查找
collections.sort();
collections.binarySearch();//先排序,再二分查找,返回该值对应的索引;
collections.replaceAll(//容器,1,100);
3.同步(线程安全)
4.不可变集合
collections.unmodfiableList(list );
5.随机排序
collections.shuffle(list);
>TreeMap
实现对所有的key值进行排序;
>Enumeration (比较古老的类,不怎么用)使用
一种迭代的方式(不推荐使用):