常用的Map介绍

常用的Map有HashMap, TreeMap, ConcurentHashMap, HashTable

HashMap

        数据结构

  1. 数组+链表+红黑树(JDK8增加的)

        基本属性
 

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 默认容量
static final int MAXIMUM_CAPACITY = 1 << 30; // 最大容量
static final float DEFAULT_LOAD_FACTOR = 0.75f; // 默认负载因子
static final int TREEIFY_THRESHOLD = 8; // 转红黑树阈值
static final int UNTREEIFY_THRESHOLD = 6; // 红黑树转链表阈值
static final int MIN_TREEIFY_CAPACITY = 64; //转红黑树最小数组长度
  1. 默认初始容量: 16(2的整数次方)
  2. 负载因子默认的是0.75f, 当hashmap集合中存储的数据达到 当前数组大小的75%则需要进行扩容
  3. 扩容阀值: 就是数组的个数乘以负载因子
  4. 链表转红黑树的边界阈值, 链表长度等于8和数组长度达到64个(但是实际可能长度到11才会转
    换为红黑树,因为转红黑树的阈值是8,所以判断链表长度大于8之后但是不满足数组长度大于
    等于64,所以还是扩容,等到链表长度达到11时,会进行转换), 红黑树转离链表边界阈值, 当链表长度降到 6 就转换回去,体现了时间和空间平衡的思想,最开始使用链表的时候,空间占用是比较少的(树节点(TreeNodes)所占的空间是普通节点Node的两倍),而且由于链表短,所以查询时间也没有太大的问题。可是当链表越来越长,需要用红黑树的形式来保证查询的效率。

        常见问题

  1. HashMap是非线程安全的,但是也可以创建线程安全的HashMap: Collections.synchronizedMap(new HashMap());
  2. HashMap继承自AbstractMap类
  3. HashMap是没有contains方法的,而包括containsValue和containsKey方法
  4. Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对;
  5. hash碰撞: 当存入的key通过hash算法得到的hash值一样,就产生hash碰撞了, 有兴趣的可以看一下解决hash的方法: 什么是Hash冲突?如何解决Hash冲突?_成为一枚软男的博客-CSDN博客_hash冲突

TreeMap

ConcurrentHashMap

HashTable

你可能感兴趣的:(Java,散列表,数据结构,map,java)