Map接口(hashMap面试题)
注意:不再是add 之类的了 类似于list的用法
概念:
由一系列键值对组成的集合,提供了key-value的映射,它并没有继承collection。
特点
- key -value 有一一对应的关系,一个key对应一个唯一的值。
- 因为map的键采用set来存放,所以说键不能重复。value可以一样
- HashMap和TreeMap。 Hashmap采用了hash算法,TreeMap采用了树结构(红黑)
- 如果将map的所有key放在一起,那就是一个set集合。key可能有顺序,可能没顺序。
- 如果你将所有的值取出来放在一起,就变成了一个collection了。
用法:通过键来取
没有定义泛型的时候,键可以是任何类型,值可以是任何类型。所以规定泛型的时候既要规定key的泛型又要规定value的泛型。
分别取map里面的所有key 和value
查询匹配map里面是否有某个键
查询匹配map里面是否有某个值
字符串作为键,userbean作为值
然后建立了四个 键
然后通过set来看里面有几个键
发现有4个键。 因为键不一样,尽管值是一样的,但是键是不一样 四个键分别有四个不同的名字。
若泛型是UserBean 则只有三个键, 因为UserBean重写了hashcode和equals 去重了。
以后用的时候若想获得某个班级的值,
map的好处:
java里面一个方法只能一个返回值,若要一次性传多个返回值回来,这时就可以将这些值封装到map里面 打包返回即可
map里面装list list里面装学生 学生里面又装老师 等等
分析源码我们能得到:
1.hashmap是基于hash表来实现的,数组+链表(单链) 数组+红黑
2.底层采用Entry(jdk 1.7以及以前 1.8Node来表示) +链表
3.hashmap采用key-value的形式来存数据,允许为null,但是只能出现一次。
4.Hashmap是线程不安全的。(没有sacranized关键字)
5.hashmap存入顺序和取出来顺序可能不一样。由key决定
6.hashmap保存数据的时候,根据key的Hash值来决定存放位置的。(可能存在hash冲突)
分析代码的属性和方法:
initialCapacity
代表初始容量,指的是hashmap在初始化的时候的自身的容量,可以在构造方法中传递进来,如果你不指定值,默认是16.- size: 当前hashmap的键值对数量
- loadFactor(DEFAULT_LOAD_FACTOR )当hashmap的值到达一定范围后,我们既要开始扩容,加载因子默认是0.75,你也可以通过构造来指定加载因子。 0.75是什么意思? 比如默认的容量为16 ,0.75*16 = 12,当你的容量达到12的时候,就要开始考虑提前扩容了。
- threshold:扩容阀值: 指的是能扩容的空间有多大,一般默认扩容为原来的二倍。 扩容阀值 = hashmap总量*加载因子
hashMap和hashtable的区别
《看到哈希 首先想到他用到了哈希算法
也是一种键值对的存储方式
hashtable不允许空键空值,但是hashmap允许》
- 两者在api的操作上基本上一样,没有太大的区别。两者都实现了Map接口。
- hashMap允许null键null值(null键只能出现一次),hashtable不允许出现null键null值。
- hashMap线程不安全,hashTable是线程安全的。
- hashMap的效率高些,hashTable效率低。
treeMap
treeMap底层是采用红黑树算法来进行数据的查找,红黑树的每个节点都是一个Entry,里面包含了KEY键 Value值 Left 左节点Right右节点 Parent color,root节点默认是黑色,entry是根据key来进行排序的,Entry节点包含的内容为value。
entry排序是按照key来排的,key是放在treeset里面的,entry的key要比较大小是根据entry里面的一个comparator比较器来进行判断的
size:红黑树的节点个数