Map集合
键值对集合,集合中按Key-Value键值对方式存储
HashMap类
特点
无序、key唯一、value允许重复、key和value允许为null
数据结构:
JDK7 : 数组+单向链表
JDK8+:数组+单向链表+红黑树
重要参数:
- 数组: Node<K, V>[ ] table 第一次默认16个,每次扩容2倍
- 加载因子(填充因子) : float loadFactor 默认0.75F
- 数组阈值 :int threshold 默认为0.75f
- 数组的元素个数 : int size
- 数组的最大容量 :int MAXIMUM_CAPACITY = 1 << 30
- hashmap生成红黑树的最小数组长度:int MIN_TREEIFY_CAPACITY = 64
扩容方式:
- 第一次扩容 ,数组为空,默认扩容16
- 链表长度 >8,并且数组长度<64,会产生数组扩容
- 添加元素后,数组存储的数据达到数组的阈值(数组容量*加载因子)原数组扩容为2倍
LinkedHashMap类
特点:键值对按照有序方式存储
数据结构:
JDK8+:数组+单向链表+红黑树
在HashMap的基础上,多维护了一条双向链表,用于存储顺序
TreeMap类
特点
按照key排序后存储
数据结构
使用红黑树存储
import java.util.Comparator;
import java.util.TreeMap;
import java.util.Map.Entry;
public class Test02 {
public static void main(String[] args) {
//根据默认比较规则,对key排序
// TreeMap<User,Order> map = new TreeMap<User,Order>();
//根据自定义的比较规则,对key排序
TreeMap<User,Order> map = new TreeMap<User,Order>(new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
if(o1.getIdCardNo().equals(o2.getIdCardNo())) {
return o1.compareTo(o2);
}
return o1.getIdCardNo().compareTo(o2.getIdCardNo());
}
});
//
map.put(new User("z张飞", "147", 15),new Order());
map.put(new User("m马超", "622", 10),new Order());
map.put(new User("l吕布", "147", 15),new Order());
map.put(new User("g关羽", "148", 20),new Order());
map.put(new User("c曹操", "156", 30),new Order());
map.put(new User("c曹操", "188", 30),new Order());
//遍历map
for (Entry<User,Order> entry : map.entrySet()) {
System.out.println(entry);
}
}
}
//User类
public class User implements Comparable<User>{
private String userName; // 用户姓名
private String idCardNo; // 身份证ID
private int userLevel; // 用户等级
public User(String userName,String idCardNo,int userLevel) {
this.userName = userName;
this.idCardNo = idCardNo;
this.userLevel = userLevel;
}
@Override
public int compareTo(User o) {
return this.userName.compareTo(o.userName);
}
@Override
public String toString() {
return "用户信息 [用户姓名=" + userName + ", 身份证ID=" + idCardNo + ", 用户等级=" + userLevel + "]";
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getIdCardNo() {
return idCardNo;
}
public void setIdCardNo(String idCardNo) {
this.idCardNo = idCardNo;
}
public int getUserLevel() {
return userLevel;
}
public void setUserLevel(int userLevel) {
this.userLevel = userLevel;
}
}
//Order类
import java.time.LocalDateTime;
import java.util.UUID;
public class Order{
private LocalDateTime creationDatetime; // 订单时间
private String orderNo; // 订单编号
public Order() {
creationDatetime = LocalDateTime.of(2023, (int)(Math.random()*12)+1, (int)(Math.random()*30)+1, (int)(Math.random()*24)+1, (int)(Math.random()*59)+1);
orderNo = UUID.randomUUID().toString();
}
@Override
public String toString() {
return "订单 [订单时间=" + creationDatetime + ", 订单编号=" + orderNo + "]";
}
public LocalDateTime getCreationDatetime() {
return creationDatetime;
}
public void setCreationDatetime(LocalDateTime creationDatetime) {
this.creationDatetime = creationDatetime;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
}