目录
接上一篇文章《Java集合框架(一)》,今天我们对双列集合展开来进行分析。
Map集合:
一、首先我们先对Map有一个基础的认识:
1、Map集合被称为双列集合,合适:{key1 = value1, key2 = value2 , key3 = value3, ......},一次需要储存一堆数据作为一个元素。
2、Map集合的每个元素 “key = value” 称为一个键值对/键值对对象/一个Entry对象,Map集合也被称为 “键值对集合”。
3、Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能找到自己的对应的值。
总之通俗一点就是:一瓶饮料 —— 五元,其中“一瓶饮料”就是键,“五元”就是值,他们是对应的,被称为键值对。
二、Map集合包含了:HashMap,LinkedHashMap,Treemap。特点如下:
1、HashMap:无序,不重复,无索引;
2、LinkedHashMap:有序,不重复,无索引;
3、TreeMap:按照大小默认升序排序,不重复,无索引;
三、常用方式:
代码如下:
package d9_map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class Map_Test2 {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("手表",100);
map.put("手表",200);
map.put("手机",2);
map.put("java",2);
map.put(null,null);
System.out.println(map);
//获取集合的大小
System.out.println(map.size());
//清空结合
// map.clear();
// System.out.println(map);
//判断集合是否为空,为空返回true,反之
System.out.println(map.isEmpty());
//根据键获取对应值
int v1 = map.get("java");
System.out.println(v1);
//根据键删除整个元素(删除键会返回键的值)
System.out.println(map.remove("手表"));
//判断是否包含某个键,包含返回true,反之
System.out.println(map.containsKey("手表"));
System.out.println(map.containsKey("java"));
//判断是否包含某个值
System.out.println(map.containsValue(2));//true
System.out.println(map.containsValue("2"));//false
//获取Map集合的全部键
System.out.println(map.keySet());
//获取Map集合的全部值
Collection<Integer> values= map.values();
System.out.println(values);
//把其他Map集合的数据拷贝到自己的集合中去
Map<String,Integer> map1 = new HashMap<>();
map1.put("java",20);
map1.put("java1",10);
Map<String,Integer> map2 = new HashMap<>();
map2.put("java3",10);
map2.put("java",100);
map1.putAll(map2);//把map2全部拷贝到map1中
System.out.println(map1);
System.out.println(map2);
}
}
四、遍历方式:
1、键找值:
代码如下:
package d10_map_traverse;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTest1 {
public static void main(String[] args) {
//准备一个Map集合。
Map<String, Double> map = new HashMap<>();
map.put("小红",162.5);
map.put("小红",169.8);
map.put("小明",165.8);
map.put("小李",169.5);
map.put("小赵",183.8);
System.out.println(map);
//获取Map集合的全部键
Set<String> keys = map.keySet();
System.out.println(keys);
//遍历全部的键,根据键获取其对应的值
for (String key : keys) {
//根据键获取对应的值
double value = map.get(key);
System.out.println(key + "====>" +value);
}
}
}
2、键值对:
代码如下:
package d10_map_traverse;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTest2 {
public static void main(String[] args) {
Map<String, Double> map = new HashMap<>();
map.put("小红",162.5);
map.put("小红",169.8);
map.put("小明",165.8);
map.put("小李",169.5);
map.put("小赵",183.8);
System.out.println(map);
//调用Map集合提供entrySet方法,把Map集合转换成键值对类型的Set集合
Set<Map.Entry<String, Double>> entries = map.entrySet();
for (Map.Entry<String, Double> entry : entries) {
String key = entry.getKey();
Double value = entry.getValue();
System.out.println(key + "--->" + value);
}
}
}
HashMap底层原理:
HashMap和HashSet的底层原理相同,都是基于哈希表实现的。(Set系列的集合的底层原理就是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据)
哈希表(数组+链表+红黑树)
① 创建一个默认长度16的数组,默认加载因子为0.75,数组名table
② 使用元素的哈希值和对数组的长度求余计算出相应的存入位置
③ 判断当前位置是否为null,如果是null直接存入
④ 如果不为null,表示有元素,则调用equals方法比较。相等,则不存;不相等,则存入数组
JDK 8之前,新元素存入数组,占老元素位置,老元素挂下面
JDK 8之后,新元素直接挂在老元素下面
特点:
1、HashMap集合是一种增删改查的数据,性能都比较好的集合
2、无序,不能重复,没有索引支持
3、HashMap的键依赖hashCode方法和equals方法保证键的唯一
4、如果键储存的是自定义类型的对象,可以通过重写hashCode和equals方法,这样可以保证多个对象内容一样时,HashMap集合就能认为是重复的。
代码如下:
package d11_map_impl;
import java.util.HashMap;
import java.util.Map;
public class Test1HashMap {
public static void main(String[] args) {
Map<Student,String> map = new HashMap<>();
map.put(new Student("小明",25,168.5),"大学");
map.put(new Student("小明",25,168.5),"初中");
map.put(new Student("小李",23,163.5),"初中");
map.put(new Student("小赵",28,186.1),"小学");
System.out.println(map);
}
}
LinkedHashMap底层原理:
LinkedHashMap结构同样是基于哈希表实现的,只是每个键值对元素额外的多了一个双链表的机制记录元素顺序(保证有序)。(LinkedHashSet集合的底层原理就是LinkedHashMap。)
代码如下:
package d11_map_impl;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class Test2LinkedHashMap {
public static void main(String[] args) {
// Map<String, Integer> map = new HashMap<>();
Map<String, Integer> map = new LinkedHashMap<>();
map.put("手表",100);
map.put("手表",200);
map.put("手机",2);
map.put("java",2);
map.put(null,null);
System.out.println(map);
}
}
TreeMap底层原理:
TreeMap的底层原理是基于红黑树实现的,它能够确保集合中的元素处于排序状态,并且提供了高效的查询、插入和删除操作。
特点:不重复,无索引,可排序(按照键的大小默认升序排序,只对键排序)
排序方法:
1、默认排序方法:TreeMap的底层实现是基于红黑树的,这种数据结构能够确保集合中的元素始终处于有序状态。在没有指定比较器的情况下,TreeMap会使用键的类的自然顺序来对元素进行升序排列。
2、自定义排序:通过实现Comparator接口来定义自定义排序规则。在创建TreeMap时,可以将这个比较器传递给TreeMap的构造方法,这样TreeMap就会使用这个比较器来确定元素的排序顺序。
注意:如果需要对TreeMap中的值进行排序,而不是键,那么可以考虑使用Map.Entry返回的Collections视图,并在这个视图上应用排序。但是,这将不会改变TreeMap本身的排序方式,而只是对视图中的元素进行排序。
代码如下:
package d11_map_impl;
import java.util.Map;
import java.util.TreeMap;
public class Test3TreeMap {
public static void main(String[] args) {
Map<Student,String> map = new TreeMap<>(( o1, o2)->Double.compare(o2.getHeight(), o1.getHeight()));
map.put(new Student("小明",25,168.5),"大学");
map.put(new Student("小明",25,168.5),"初中");
map.put(new Student("小李",23,163.5),"初中");
map.put(new Student("小赵",28,186.1),"小学");
System.out.println(map);
}
}
新手制作,哪里有错,烦请各位大佬指出。也请各位大佬给出指导性意见。
如有侵权,联系删除。