Map及其子类

目录

Map

在这里插入图片描述
主要方法:

方法 说明
public V put(K key,V value) 存储数据,如果Key存在则发生替换,返回旧的数据,不存在返回null
public V get(Object key) 通过Key查询对应的内容
public V remove(Object key) 根据Key删除对应的内容
public int size() 获取集合的长度
public Collection values() 返回所有的内容
public set keySet() 获取所有的Key(Key不能重复)
public Set<Map.Entry<K,V>> entrySet() 将所有的内容以Map.Entry集合的形式返回

示例:

 Map<String, String> map = new HashMap<>(10);
        //put():增加数据
        map.put("1","one");
        map.put("2","two");
        map.put("3","three");
        map.put("4","four");
        map.put("5","five");
        //get():通过key查询value的值
        System.out.println("get()->"+map.get("3"));
        //remove():通过key删除内容
        System.out.println("remove()->"+map.remove("2"));
        //size():获取长度
        System.out.println("sie()->"+map.size());
        //values():返回所有的values值
        System.out.println("values()->"+map.values());
        //keySet():返回所有的key值
        System.out.println("keySet()->"+map.keySet());
        //将所有的数据以 key = value 的集合形式输出
        System.out.println("entrySet()->"+map.entrySet());

结果:

get()->three
remove()->two
sie()->4
values()->[one, three, four, five]
keySet()->[1, 3, 4, 5]
entrySet()->[1=one, 3=three, 4=four, 5=five]

**Collection和Map: **

1、Collection是为了输出而进行存储,Map是为了查询而进行存储。

2、Collection是单值集合,Map是二院偶对象集合。

总结:

1、碰见单值集合优先使用List,List接口优先使用ArrayList。

2、需要通过key来查询数据,属于Map接口,Map接口优先考虑hashMap子类。

3、集合的输出全部砽Iterator接口。

HashMap

在这里插入图片描述

无参构造:

public HashMap() {
        this.loadFactor = 0.75F;	//阈值为75%,当超过75%时进行扩容
    }

扩容:

final HashMap.Node<K, V>[] resize() {
        HashMap.Node<K, V>[] oldTab = this.table;
        int oldCap = oldTab == null ? 0 : oldTab.length;	//旧的容量
        int oldThr = this.threshold;
        int newThr = 0;
        int newCap;
        if (oldCap > 0) {	//旧的容量大于0
            if (oldCap >= 1073741824) {		//当旧的容量大于或等于1073741824
                this.threshold = 2147483647;	//1073741824 * 2赋值给threshold,阈值
                return oldTab;
            }
			//旧的容量赋值给新的容量 * 2 < 1073741824 && 旧的容量 >= 16,第一次不会进入
            if ((newCap = oldCap << 1) < 1073741824 && oldCap >= 16) {//hashMap每次扩容1倍
                newThr = oldThr << 1; //新的阈值 = 旧的阈值 * 2 
            }
        } else if (oldThr > 0) {	//旧的容量 > 0 (???) 可能是当大于int的范围后变负数,才会进去
            newCap = oldThr;	//新的容量 = 旧的阈值
        } else {
            newCap = 16;	//第一次容量为扩充为16
            newThr = 12;	//第一次阈值为12
        }

        if (newThr == 0) {
            float ft = (float)newCap * this.loadFactor;
            newThr = newCap < 1073741824 && ft < 1.07374182E9F ? (int)ft : 2147483647;
        }
    
    	this.threshold = newThr;	//新的阈值赋值给threshold
        HashMap.Node<K, V>[] newTab = new HashMap.Node[newCap];	
        this.table = newTab;

数据性能保证:

int binCount = 0;
在while循环中,当binCount = 7,存储的数据其实为8个,binCount从零开始。
if (binCount >= 7) {	//当binCount等于7时,转成红黑树
    this.treeifyBin(tab, hash);	//会进行树状结构转换(红黑树自动修复,保证查询性能)
}

++binCount;	

LinkedHashMap

在这里插入图片描述

LinkedHashMap是HashMap的子类,其实现机制几乎和HashMap一致,只不过HashMap是无序存储,LinkedHashMap是有序存储,因此想要对数据进行有序存储就使用LinkedHashMap。

TreeMap

TreeMap会自动排序,根据ASCII码的大小进行排序,从小到大,Key不可以为null。
C:\Users\tanxiang\AppData\Roaming\Typora\typora-user-images\image-20200302202732178.png)]

示例:

public class Demo02 {
    public static void main(String[] args) {
        Map<String,String> map = new TreeMap<>();
        map.put("1","one");		//ASCII码 49
        map.put("a","again");	//ASCII码 97
        map.put("2","two");		//ASCII码 50
        map.put("A","Action");	//ASCII码 65
        System.out.println(map);
    }
}

结果:

{1=one, 2=two, A=Action, a=again}
发布了61 篇原创文章 · 获赞 0 · 访问量 2180

猜你喜欢

转载自blog.csdn.net/sabstarb/article/details/104619982