Map概述
Map:映射关系
特点:
map中的元素是以键值对的形式存在
键是不可以重复 值是可以重复的
不保证存取顺序
常见操作:
添加 删除 修改 判断是否空 判断是否包含某一个键 判断是否包含某一个值 根据键获取值 获取键集(Set) 获取值集(Collection) 获取键值对的一个Set
遍历的方法:
1 获取键集 根据键 来获取值
2 键值对集合 Map.Entry 再通过 Map.Entry 的getKey和getValue来获取的键值
public static void main(String[] args) {
//Map集合键唯一,一个键对应一个键值,但是一个键值可以对应多个键
Map map = new HashMap();
//添加元素
map.put("java","蓝桥");
map.put(456,"world");
map.put("hello","world");
map.put(1.0,2.0);
map.put(456,789);
System.out.println(map);
System.out.println("-----------------------");
//使用泛型创建集合
Map<String,String> map1 = new HashMap<>();
//添加元素
map1.put("10010","联通");
map1.put("10086","移动");
map1.put("119","火警");
//添加map中的所有元素
map1.putAll(map);
//根据键修改值,这种修改必须保证所修改的键值对在map中存在相应的映射关系
map1.replace("456","Hello");
System.out.println(map1.get(456));
System.out.println(map1);
}
泛型擦除
注意:在集合中 如果要使用泛型 都使用泛型 如果不使用泛型 那么都不要使用
泛型仅在编译期有效 在运行期是没有泛型的 称为泛型擦除
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
Class c1 = list1.getClass();
Class c2 = list2.getClass();
// 在运行期 List list1 = new ArrayList(); List list2 = new ArrayList<>();
System.out.println(c1);
System.out.println(c2);
System.out.println(c1 == c2);//true 运行期 得到的类型与泛型无关
}
Map的具体实现
HashMap
特点:
1 Hash是map所有实现类中使用频率最高的 实现类
2 基于哈希表的实现的Map接口
3 并允许null的值和null键
4 存取是无序的
5 hashMap的键是不能重复
存储结构:
Jdk1.8前 HashMap使用的是数组+链表的实现
Jdk1.8及以后 HashMap采用的是数组 + 链表 + 红黑树的实现
HashMap源码分析
重要常量:
Jdk8以前:数组+ 链表 = 桶(bucket)
在map中 元素的存储位置是根据键的 hashCode来计算而得
Jdk8以后 采用的 数组+ 链表 + 红黑树
HashMap底层实现特点
1. HashMap map = new HashMap()默认 创建一个长度为16得数组 但是 数组此时并不会立即创建
2. 负载因子为 0.75f
3. 当我们第一次去put的时候 才会初始化长度为16的数组
4. 数组的类型为Node类型
5. 形成链表的结构时,新添加的键值对在链表的尾部
6. 当数组中链表的长度>8 时 且map中数组的长度> 64时 此时会将链表转换为红黑树
7. 当红黑树的节点个数小于6的时候,就会转化为链表
LinkedHashMap
1 LinkedHashMap是HashMap的子类
2 在LinkedHashMap中,对于HashMap进行了扩展:使用了双向链表 来记录元素的添加顺序
3 基于特殊的结构,迭代顺序和插入顺序是一致的。
HashMap的Node
LinkedHash的Entry继承了HashMap的Node
在LinkedHashMap中,对于HashMap进行了扩展:
使用了双向链表 来记录元素的添加顺序
TreeMap
需要对存入其中的元素进行排序
TreeMap可以保证元素处于有序状态 有序–字典顺序
排序方式 :自然排序 定制排序
public static void main(String[] args) {
Map<Student,String> map = new TreeMap<>(new Comparator<Student>() {
@Override
public int compare(Student st1, Student st2) {
return st1.getAge() - st2.getAge();
}
});
Student st1 = new Student("郭靖",22);
Student st2 = new Student("黄蓉",23);
Student st3 = new Student("杨过",21);
Student st4 = new Student("小龙女",20);
map.put(st1,"20201108");
map.put(st2,"20201104");
map.put(st3,"20201101");
map.put(st4,"20201107");
// 迭代
Set<Map.Entry<Student,String>> entrySet = map.entrySet();
for(Map.Entry<Student,String> entry : entrySet){
Student key = entry.getKey();
String value =entry.getValue();
System.out.println(key +"---"+ value );
}
}
HashTable(了解)
1 采用hash表实现 和HashMap一样
2 不允许null键null值
3 是线程同步
Properties 后续再学习
Collections
是操作集合Set List Map的工具类
工具类中的方法都是静态的
方法
两个集合的拷贝
返回集合的最大(自然排序)的元素
反转
替换
对列表中的元素进行随机排序
对集合进行排序
交换集合的两个位置的元素
得到线程安全的集合List Set Map