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.深克隆

猜你喜欢

转载自www.cnblogs.com/yokii/p/9428524.html