HashSet:       重写   hashCode和equals方法                                  
      特点:无序,唯一
      底层结构是:
        哈希表:元素为链表的数组。综合了链表和数组的好处
      add方法:底层实际是依赖于HashCode()和equals()方法

HashSet实际用的是HashMap
public HashSet() {
map = new HashMap<>();
}

案例-HashSet存储自定义对象

出现问题:
   重复的元素也被添加了,不能保证元素唯一性

原因:自定义类没有重写HashCode和equals方法;

分析:
    (1) 默认继承Object类的HashCode和equals方法,而Object的HashCode值是通过对象
        的内部地址值转换为一个整数得到的,不同的对象的地址值不同,进而可以知道转换后
        的HashCode值也不可能相同。HashCode值不同就当作不是重复的元素而添加了。
   (2)equals方法默认也是比较地址值,如果不重写equals方法,那么不同的对象
        比较的结果也一定就是false;将会当作不是重复元素而添加了

解决:重写自定义类的HashCode和equals方法

思考:重写HashCode(),那么HashCode值跟什么有关系呢?
      答: 和对象的成员变量值有关系

重写HashCode方法:
      就将对象的成员变量值相加:
             基本类型:直接相加
            引用类型:就加哈希值

// return name.hashCode()+age;
     // 代码优化如下
     return name.hashCode()+age*31;

注意:判断是否是重复元素步骤:
        1-先比较HashCode值:
               1-1:如果HashCode值不同:直接添加
               1-2:如果HashCode值相同:
                    1-2-1:继续判断equals方法:
                                  返回false:添加元素
                                   返回true:放弃添加

对于hashCode和equals方法的理解:(新华字典: 即使是在同一页了,也有可能不是同一个元素)
        同一页:hashCode值
        同一页中同一个元素:hashCode值相同情况下,还要继续采用equals方法判断

二、LinkedHashSet:
      底层数据结构是:链表和哈希表
      链表保证元素有序
      哈希表保证元素唯一

三、TreeSet:

(1)实现Comparable自然排序接口,重写compareTo方法

(2)实现Comparator比较器排序接口,重写compare方法

排序方式:以构造函数确定排序方式
    A 无参构造:自然排序
   class Student implements Comparable<Student>{
       @Override
      public int compareTo(Student s){
       //按年龄排序
       int num=this.age-s.age;
       //隐含条件,年龄相同时,应该继续比较姓名
       int num2=num==0?this.name.compareTo(s.name):num;
       return num2;
      }
  }

B 有参构造:比较器排序 将自定义的比较器类对象作为构造方法的参数
    class MyComparator implements Comparator<Student>{
        @Override
       public int compare(Student s1,Student s2){
          int num=(int)(stu2.getTotal()-stu1.getTotal());
          int num2=num==0?stu1.getName().compareTo(stu2.getName()):num;
          return num2;
        }
    }
   TreeSet<Student> ts=new TreeSet<Student>(new MyComparator());

---------------------------------------------
字符串的比较
int compareTo(String str):

Set常用子类特点的更多相关文章

  1. 集合中Set接口与Collection接口,常用子类TreeSet,HashSet.

    Set接口与List接口的不同之处在于: 不允许有重复的数据. 定义如下: public interface Set<E>extends Collection<E> 主要方法与 ...

  2. Set 接口常用子类及其特点

    Set 集合中元素不可重复,是无序的(存入和取出的顺序是不一样的), Set 接口中的方法和 Collection 接口一致. 常用子类: HashSet : 内部数据结构是哈希表, 是不同步的 Li ...

  3. List 接口常用子类及其特点

    List 常用子类: - Vector: 内部是数组数据结构,是同步的. 增删, 查询都很慢 - ArrayList: 内部是数组数据结构,是不同步的,替代了 Vector,不同步的效率较高. 特点: ...

  4. Map集合,Map常用子类

    Map 集合 1,Collection中的集合,元素是孤立的,向季和忠储存的元素采用一个元素方式储存 2,Map中的集合,元素是成对存在的,每个元素中的集合称为双列集合 3,Collection中的集 ...

  5. Map集合概述和Map常用子类

    概述java.util.Map接口 Map<K,V> 有两个泛型 类型参数:K - 此映射所维护的键的类型V - 映射值的类型 特点:1.Map集合是双列集合,一个元素包含两个值,一个是k ...

  6. Map集合和Map常用子类

    Map集合 java.util.Map<K,V>集合 Map集合的特点: 1.Map集合是一个双列集合,一个元素包含两个值(Key,Value) 2.Map集合中的元素,key和value ...

  7. 系统学习 Java IO (十三)----字符读写 Reader/Writer 及其常用子类

    目录:系统学习 Java IO---- 目录,概览 Reader Reader 类是 Java IO API 中所有 Reader 子类的基类. Reader 类似于 InputStream ,除了它 ...

  8. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_2_Map常用子类

    常用的实现类HashMap 它的子类.LinkedHaspMap

  9. 17、Map接口及其常用子类(Hashtable、HashMap、WeakHashMap)

    17.Map接口 Map没有继承Collection接口,Map提供key到value的映射.一个Map中不能包含相同的key,每个key只能映射一个value.Map接口提供3种集合的视图,Map的 ...

随机推荐

  1. MySQL分页存储过程

    CREATE PROCEDURE ProcPage(in tableName varchar(20),#表名  in showField varchar(100),#要显示的列名  in whereT ...

  2. C基础 - 终结 Size Balanced Tree

    引言 - 初识 Size Balanced Tree 最近在抽细碎的时间看和学习 random 的 randnet 小型网络库. iamrandom/randnet - https://github. ...

  3. MongoDB安全:所有操作(Privilege Actions)

    本文展示了两张思维导图,分别是MongoDB 3.6.4.0的所有权限操作,未做深入研究,仅仅是列出来. 3.6总共9类105个操作,4.0版本比3.6多了两类操作,同时增加了3个操作,共11类108 ...

  4. 删除git库中untracked files(未监控)的文件

    https://blog.csdn.net/ronnyjiang/article/details/53507306 在编译git库拉下来的代码时,往往会产生一些中间文件,这些文件我们根本不需要,尤其是 ...

  5. Python 深拷贝、浅拷贝

    Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 首先,对赋值操作我们要有以下认识: 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( ...

  6. 洛谷P2016战略游戏

    传送门啦 战略游戏这个题和保安站岗很像,这个题更简单,这个题求的是士兵人数,而保安站岗需要求最优价值. 定义状态$ f[u][0/1] $ 表示 $ u $ 这个节点不放/放士兵 根据题意,如果当前节 ...

  7. POJ 2186 Popular Cows(强联通分量)

    题目链接:http://poj.org/problem?id=2186 题目大意:    每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种 ...

  8. SQL语句资料

    --语 句 功 能  --数据操作  SELECT --从数据库表中检索数据行和列  INSERT --向数据库表添加新数据行  DELETE --从数据库表中删除数据行  UPDATE --更新数据 ...

  9. iOS图片缓存

    iOS的内存管理始终是开发者面临的大问题,内存占用过大时,很容易会被系统kill掉,开发者需要尽可能的优化内存占用问题. 现在的App界面做的越来越精致,里面集成了大量的图片,笔者首先想到的就是如何减 ...

  10. **CI中使用IN查询(where_in)

    注意别漏了$this->db->get(); /** * 匹配用户手机号,返回匹配的用户列表 * @param $column_str 'user_id, user_name, user_ ...