集合框架(Map容器/Collections工具类)

>两大主流:collection、map(接口)

底层实现为数组和链表;

RationalRose工具:接口与典型实现类;

集合框架(Map容器/Collections工具类)

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的底层是一个数组,所以存在扩容问题;

什么时候扩容:当数组长度*负载因子>=当前存放的键值对的数量;

集合框架(Map容器/Collections工具类)

transient Entry[ ] table;

//这个是用来存放键值对的数组(数组的每个位置上可能是链表,但要防止这种情况);

threshold:数组扩容的阈值;

集合框架(Map容器/Collections工具类)

Entry类:一个单向链表;

集合框架(Map容器/Collections工具类)

默认的构造:

集合框架(Map容器/Collections工具类)

put方法:

集合框架(Map容器/Collections工具类)

1.根据key的hashcode()计算出一个hash值

2.拿着这个hash值和16(数组长度)(16-1 15 1111 只要h不同,与出来结果就不同)计算一个int值i

这个i就是最终这个键值对应value数据要放到数组的下标

集合框架(Map容器/Collections工具类)

集合框架(Map容器/Collections工具类)

集合框架(Map容器/Collections工具类)

集合框架(Map容器/Collections工具类)

注意:这里的扩容方法,不是像ArrayList中简单的Array.copy...

因为这里的数组的长度,参与的value值下标的计算,要把数据拿出来,重新计算hash值,再放回去;

集合框架(Map容器/Collections工具类)

集合框架(Map容器/Collections工具类)

>collections工具类

1.排序

collections.sort();

collections.sort(//容器,//写一个比较器,重写compare方法);

2.查找
 

collections.sort();

collections.binarySearch();//先排序,再二分查找,返回该值对应的索引;

collections.replaceAll(//容器,1,100);

3.同步(线程安全)

集合框架(Map容器/Collections工具类)

4.不可变集合

collections.unmodfiableList(list );

5.随机排序

collections.shuffle(list);

>TreeMap

实现对所有的key值进行排序;

>Enumeration (比较古老的类,不怎么用)使用

一种迭代的方式(不推荐使用):

集合框架(Map容器/Collections工具类)