欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Map及其子类

程序员文章站 2022-06-02 23:22:07
...

目录

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

Map及其子类

无参构造:

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

Map及其子类

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

TreeMap

TreeMap会自动排序,根据ASCII码的大小进行排序,从小到大,Key不可以为null。
Map及其子类)]

示例:

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}
相关标签: 学习总结