一.Map整体理解
1.Map框架结构
①HashMap–>LinkedHashMap
②TreeMap
③Hashtable–>Properities
2.三者特性
① HashMap
HashMap作为Map的主要实现类
线程不安全,效率高,可以存储null的key-value
LinkedHashMap作为HashMap的子类
可以按添加的顺序进行遍历,在原有的HashMap底层上,添加了一对指针。
适用于频繁的遍历操作。
HashMap jdk7.0以及之前:数组+链表
jdk8.0:数组+链表+红黑树
②TreeMap
TreeMap中对key-value进行排序,实现排序遍历
③Hashtable
Hashtable作为Map的古老实现类
线程安全,效率低,不能存储null的key-value
Hashtale的子类properites为处理配置文件,key-value都是String
④对key-value的理解
key:无序+不可重复 用Set存储
value:无序+可重复 用Colletion存
Entry对象(key-value):map中Entry对象无序不可重复 用Set存
注意:key所在的类要重写equals和hashcode
values需要写equals(不需要hashcode,因为已有key对应)
3.Hashmap的底层实现原理
①实例化
Hash map = new Hashmap()
jdk7:底层创建16的Entry[] table数组
jdk8:底层首先初始化并没有载入数组,在首次put后再创建数组
②put入元素时
首先计算key的hashcode的哈希值,通过某种算法获得数组的索引
如果位置为空,则添加成功
如果位置不为空,则比较key和已有数据的hash值
如果hash值与已有的都不相同,则添加成功
如果hash值和其中一个hash值相同,则调用equals
如果equals方法返回false,则添加成功
如果equals方法返回true,调用value的equals
如果equals为false,使用value替换相同key的旧value值
如果euals为true,则不添加
注意:在hash值不同,equals返回false,都是以链表添加到数组中国
③扩容问题
jdk7:在添加过程中,默认扩容方法为扩容为原来的两倍并赋值数据
jdk8:在扩容过程中,用到了红黑树,即若数组索引链表元素大于8且数组长度大于64,则将此时所有的链表都用红黑树存储
④红黑树概念
默认初始化容量 16
加载因子 0.75
临界值 12
最大链表长度 8 最大数组容量 64 满足此时转化红黑树
即为了保证数组利用率和链表尽可能少,设置加载因子,即若达到12,则此时扩容为原来的两倍
4.map的常用方法
①方法
Map map = new HashMap();
map.put("li",12);//放入key-value为age=12
//map.putAll(map1) 将map1中的所有key-value放入map中
map.remove("li");//删除key为li的key-value
//map.clear() 清除map中的key-value
map.get("li");//获得li的value
map.containsKey("li");//map是否包含key为li的
//map.containsValue(12) map是否包含value为12的
map.size();//表示map的容量
map.isEmpty();//判断此时map是否为空
//map.equals(map1);判断map与map1是否相等
//遍历map
map.put("li",12);
Set set = map.keySet();//获得key的set类型 可用迭代器
Collection collection = map.values();//获取values的colletion类型 可用迭代器
Set set1 = map.entrySet();//获得Entry的set
Iterator iterator = set1.iterator();
Object obj= iterator.next();//注意迭代器返回的是HashMap类的内部类Node的对象
Map.Entry entry = (Map.Entry)obj;
System.out.println(entry.getKey());
System.out.println(entry.getValue());
②总结常用
增:put
删:remove
改:put
查:get
长度:size
遍历:KeySet/values/Entryset
5.TreeMap
①TreeMap的要求
TreeMap中添加数据,要求key必须是同一个类创建的对象(因为要排序)
TreeMap:
自定义类重写compareTo 自然排序
加入comparator 定制排序
(两者必须按照key来排序)
6.Properties
①用法
Proprieties是读取配置文件的,且数据都是String类型的
②例子
Properties pro = new Properties();
pro.load(file);
pro.getProperty(“name”);
二.Collections工具类的使用
1.例子
List list = new ArrayList();
list.add(1);
list.add(2);
Collections.reverse(list);//逆转列表
Collections.shuffle(list);//对列表随机打乱
Collections.sort(list);//自然排序
Collections.sort(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return 0;
}
});//定制排序
Collections.swap(list,0,1);//交换索引位置为0和1的元素
Collections.frequency(list,1);//统计1出现的次数
//List dest = new ArrayList();
Collections.copy(dest,list);//会报错,因为底层判断dest.size是否大于list.size才会复制
//进行操作 List dest = Arrays.aslist(new Obeject[list.size]
List dest = Arrays.asList(new Object[list.size()]);
//这样即可满足dest.size和list.size的关系
Collections.synchronizedList(list);//这样可将线程不安全的Arraylist变成线程安全的Arraylist