一、Map集合
1.HashMap集合的数据结构和特性
1.HashMap集合的存储
HashMap是Map接口的子接口它是一个双列集合只针对键不针对值,它通过键来映射值得内存地址,其底层通过hashcode和equals方法保证了键的唯一性。
如果键存储的是自定义的对象,那么自定义的对象要重写hashCode方法和equals方法。
他在jdk1.8之前是用的数组加链表的结构在jdk8之后用的是数组加链表加红黑树,当一个数组上的索引上挂载的链表长度大于8时,链表就会扩容成红黑树。
2.HashMap集合的特性及应用场景
1.HashMap是线程不安全的
2.HashMap主要应用于统计商品的数量,键为商品类型,值为int类型,遍历商品的数组或单例集合,判断Map<商品,计数>,如果Map集合中包含这个商品的键,那么就从map中取出键为商品的值然后在计数上+1,再存储进集合中
public class HashMapUse {
public static void main(String[] args) {
//三个手机对象
Phone phone = new Phone("华为P30", 3000.00, "华为");
Phone phone1 = new Phone("OPPE", 3200.00, "OPPO");
Phone phone2 = new Phone("小米", 3000.00, "小米");
Phone phone3 = new Phone("华为P30", 3000.00, "华为");
Phone[] phones =new Phone[4];
phones[0]=phone;
phones[1]=phone1;
phones[2]=phone2;
phones[3]=phone3;
//创建一个统计map集合
HashMap<Phone, Integer> map = new HashMap<>();
//遍历这个手机集合
for (Phone p:phones
) {
if(!map.containsKey(p)){
//map集合中不包含手机说明第一次出现
map.put(p,1);
}else {
//map中包含手机说明是第二次出现
map.put(p,map.get(p)+1);
}
}
System.out.println(map);
//打印的结果可以看出华为p30出现了两次
//{Phone(name=华为P30, price=3000.0, manufacturer=华为)=2,
// Phone(name=OPPE, price=3200.0, manufacturer=OPPO)=1,
// Phone(name=小米, price=3000.0, manufacturer=小米)=1}
}
}