• HashSet和TreeSet的异同


    最近用Set解决自定义实体重复数据的问题,突然发现Set的Add方法返回了false。猜测应该是相同元素add时,后续添加的会直接舍弃而不像Map一下被覆盖。顺便测试了下两者的差异

    HashSet的Add方法,触发的是equals和hashCode方法,因为其容器是个HashMap对象。另,equals中的属性,要在hashCode中体现

    TreeSet的Add方法,触发的是compareTo方法,因为其实现了SortedSet接口用户排序

    代码如下

    package test;
    
    import lombok.Data;
    import org.ahocorasick.trie.Emit;
    import org.ahocorasick.trie.Trie;
    import org.junit.Test;
    
    import java.util.*;
    
    import static org.junit.Assert.fail;
    
    public class UtilTest {
    
        @Test
        public void testInitRoleAuthTable() {
            testEntity a = new testEntity();
            testEntity b = new testEntity();
            a.setName("a");
            a.setAge("20岁");
            b.setName("a");
            b.setAge("30岁");
            Set<testEntity> testEntitySet = new TreeSet<>();
            testEntitySet.add(a);
            testEntitySet.add(b);
            for(testEntity item:testEntitySet){
                System.out.println(item.toString());
            }
    
            Set<testEntity> testEntityhashSet = new HashSet<>();
            testEntityhashSet.add(a);
            testEntityhashSet.add(b);
            for(testEntity item:testEntityhashSet){
                System.out.println(item.toString());
            }
        }
    
    }
    @Data
    class testEntity implements Comparable<testEntity>{
        private String name;
        private String age;
        @Override
        public int compareTo(testEntity o){
            return this.name.compareTo(o.getName());
        }
        @Override
        public boolean equals(Object entity){
            testEntity entity2 = (testEntity)entity;
            if(this.name.equals(entity2.name)){
                return true;
            }
            return false;
        }
        @Override
        public String toString(){
            return  "name:"+this.name+" ;age:"+this.age;
        }
        @Override
        public int hashCode() {
            return this.name.hashCode();
        }
    }

     执行结果如下

    name:a ;age:20岁
    name:a ;age:20岁
  • 相关阅读:
    Django -- 模板系统
    CSRF_TOKEN
    MySQL的sql_mode模式说明及设置
    程序员必备的600单词
    前端 -- jQuery
    datatime模块
    github高效搜索
    Mac上Homebrew常用命令总结
    对比System.currentTimeMillis()、new Date().getTime()、System.nanoTime()
    MACOS安装使用kafka
  • 原文地址:https://www.cnblogs.com/jkgyu/p/15517383.html
Copyright © 2020-2023  润新知