017.day17 Map接口 克隆 treeSet集合排重缺陷
复习昨日
1. treeSet集合排重缺陷
当treeset集合同时存有基本数据类型和引用类型时,当基本数据相同,引用数据也相同时,不能将其排重
原因是引用数据指向了不同的地址,treeset集合中hashcode不同,判定为不同对象,所以不排重
2.解决办法
重写compare方法时拆箱
public class ProductComparator implements Comparator<Product> {
@Override
public int compare(Product newProduct, Product oldProduct) {
// 拆箱
if (newProduct.getPrice().intValue() == oldProduct.getPrice().intValue() && newProduct.getName().equals(oldProduct.getName())) {
return 0;
}
if (newProduct.getPrice() >= oldProduct.getPrice()) {
return -1;
}else {
return 1;
}
}
}
// TODO 自定义比较器
Set<Product> set = new TreeSet<>(new ProductComparator());
set.add(new Product("日常用品",300));
set.add(new Product("汽车配件",500));
set.add(new Product("食品",100));
set.add(new Product("电子产品",3000));
set.add(new Product("电子产品",3000));
for (Product product : set) {
System.out.println(product);
//Product [name=电子产品, price=3000, shop=null]
//Product [name=汽车配件, price=500, shop=null]
//Product [name=日常用品, price=300, shop=null]
//Product [name=食品, price=100, shop=null]
// 排重成功
}
今日内容
1.Map接口
1.常用方法
2.存储特点
将键映射到值:键值对,一个映射不能包含重复的键,每个键只能映射一个值
3.常用实现类
4.Map集合的遍历
// TODO Map结构基本用法 - 添加/取出元素 - 遍历
// Map结构的定义 - 可以指定key-value对应结构的两个泛型
Map<String, String> map = new HashMap<>();
// 添加元素的方式 put()
map.put("name", "sand");
map.put("age", "20");
map.put("sex", "男");
// 取出元素的方式get() - 不存在对应的key时,返回null(空对象)
System.out.println(map.get("name")); // sand
System.out.println(map.get("phone"));// null
// 遍历方式1:keySet()方式
Set<String> keys = map.keySet();// 得到key的Set集合(获得键的集合)
// 再根据keys获得相应的value
for (String key : keys) {
System.out.println(key + "--" + map.get(key));
}
// 遍历方式2:entrySet
Set<Entry<String, String>> entries = map.entrySet(); //得到键值对的集合 返回值是Entry类型的集合
for (Entry<String, String> entry : entries) {
System.out.println(entry);
// sex=男
// name=sand
// age=20
// 可以通过键值对获得键,值
System.out.println(entry.getKey() + "--" + entry.getValue());
// sex--男
// name--sand
// age--20
}
// TODO 向Map集合中存放自定义类型
// key的存放特点与Set一致,不能重复的元素
// 不同点,当出现相同的key时,对应的value会被覆盖
Map<String, Student> map = new HashMap<>();
map.put("001", new Student("sand",19));
map.put("002", new Student("tom",22));
map.put("003", new Student("jerry",23));
map.put("003", new Student("jerry",20));
System.out.println(map.size());
for (String key : map.keySet()) {
System.out.println(key + "--" + map.get(key));
}
// 3
// 001--Student [name=sand, age=19]
// 002--Student [name=tom, age=22]
// 003--Student [name=jerry, age=20]
2.克隆
将一个对象的状态(包含的属性信息等)完全复制,且和原对象之间互不干扰
- 浅克隆:当对象中只包含基本数据类型及字符串的属性时,无问题
- 浅克隆:当对象中包含另外的自定义类型作为成员变量时,会造成指向相同
- 深度克隆:解决浅克隆中出现的问题,但是当对象之间的关系较为复杂时,每次重写clone方法会使得在编码阶段较为繁琐