JavaSE基础 (二十八)

Map 映射

通过某一个key键可以直接定位到一个Value值

存储方式以 键值对 存储 Key-Value

key无序还是一样,指的是存入顺序与取得顺序不一致

key无重复当然指的是 元素不能一致

Map基本使用

HashMap

TreeMap

Properties

HashMap

包 java.util

如何创建对象

基本方法

增删改查
增put(key,value)   存放一组映射关系 key-value
          1.key存储的顺序与取得的顺序不同
          2.不同的key可以存储相同的value
          3.key若有相同的 则将原有的key覆盖而不是拒绝存入(跟Set刚好相反)
删 E = remove(key);
改 put = (key,value1) put(key,value2)
  replace(key,newValue)
查 E = get(key)
遍历Map集合   key不一定什么样
//获取map集合的全部key
Set<Integer> it = map.keySet();
//通过迭代器遍历
Iterator<Integer> it = keys.iterator();
while(it.hashNext()){
   Integer key = it.next;
   String value = map.get(key);
   System.out.println(key+"-"value);
}

API提供的其他方法

char containsKey(key) containsValue(value)
getOrDfault(key.defaultValue)如果key存在就返回对象对应的Value 若没有找到则返回默认返回值
isEmpty()
putAll(map)
putlfAbsent(key.value);//如果key不存在才向集合添加 如果key值不存在就不添加了

HashMap在什么情形下用?

想要存一组元素

数组 or 集合 如果存储的元素以后长度不变用数组 如果数组长度以后不确定用集合

如果发现长度以后不确定——————>集合

List Set Map
List家族有序的  存储有顺序用这个
       ArrayList       更适合遍历轮循
       LinkList        更适合插入删除
       Stack          LIFO      
Set家族无重复   存储元素希望自动去掉重复元用这个
       Hash            性能更高
       Tree            希望存进去的元素自动去重复 同时还自动排序按(A-Z)字典顺序

Map家族k-v      通过唯一的K快速找寻v用这个
       Hash            性能更高
       Tree            希望存进去的元素能自动排序

Hash底层的数据结构

散列表形式      数组加链表
Person对象存入HashMap中  可以
HashCode方法   —>不同的对象可以产生相同的hashCode码
不同的hashCode码  不同的对象
//hashcode码
static fial int hash(Object obj){
  int h;
  return(key == null)?0:(h = key.hashCode())^(h >>>16);
}
数组:对象的hashCode码
    发现hashCode码一致
    当前数组后面串一个Node

    先扫描数组(位置 )
    继续扫描链表
    数组中存储的是hash值
    (key+value)包装成一个对象Entry
    Map.entry