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方法会使得在编码阶段较为繁琐
1.浅克隆

2.深克隆

原文地址:https://www.cnblogs.com/yokii/p/9428524.html