• java 17- 3 hashCode()方法


      HashSet:存储字符串并遍历
        问题:为什么存储字符串的时候,字符串内容相同的只存储了一个呢?
           通过查看add方法的源码,我们知道这个方法底层依赖 两个方法:hashCode()和equals()。
        步骤:
          首先比较哈希值
            如果相同,继续走,比较地址值或者走equals()
            如果不同,就直接添加到集合中
          按照方法的步骤来说:
            先看hashCode()值是否相同
              相同:继续走equals()方法
                返回true: 说明元素重复,就不添加
                返回false:说明元素不重复,就添加到集合
              不同:就直接把元素添加到集合
                如果类没有重写这两个方法,默认使用的Object()。一般来说不同相同。
                而String类重写了hashCode()和equals()方法,所以,它就可以把内容相同的字符串去掉。只留下一个。

     1 import java.util.HashSet;
     2 public class HashSetDemo {
     3 public static void main(String[] args) {
     4 // 创建集合对象
     5 HashSet<String> hs = new HashSet<String>();
     6 
     7 // 创建并添加元素
     8 hs.add("hello");
     9 hs.add("world");
    10 hs.add("java");
    11 hs.add("world");
    12 
    13 // 遍历集合
    14 for (String s : hs) {
    15 System.out.println(s);
    16 }
    17 }
    18 }
    19 
    20  


       需求:存储自定义对象,并保证元素的唯一性
       要求:如果两个对象的成员变量值都相同,则为同一个元素。

       目前是不符合我的要求的:因为我们知道HashSet底层依赖的是hashCode()和equals()方法。
       而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类。
       这个时候,他们的哈希值是不会一样的,根本就不会继续判断,执行了添加操作。

     1 import java.util.HashSet;
     2 public class HashSetDemo2 {
     3 public static void main(String[] args) {
     4 // 创建集合对象
     5 HashSet<Student> hs = new HashSet<Student>();
     6 
     7 // 创建学生对象
     8 Student s1 = new Student("林青霞", 27);
     9 Student s2 = new Student("柳岩", 22);
    10 Student s3 = new Student("王祖贤", 30);
    11 Student s4 = new Student("林青霞", 27);
    12 Student s5 = new Student("林青霞", 20);
    13 Student s6 = new Student("范冰冰", 22);
    14 
    15 // 添加元素
    16 hs.add(s1);
    17 hs.add(s2);
    18 hs.add(s3);
    19 hs.add(s4);
    20 hs.add(s5);
    21 hs.add(s6);
    22 
    23 // 遍历集合
    24 for (Student s : hs) {
    25 System.out.println(s.getName() + "---" + s.getAge());
    26 }
    27 }
    28 }
    何事都只需坚持.. 难? 维熟尔。 LZL的自学历程...只需坚持
  • 相关阅读:
    IIS配置和发布网站
    单点登录的理论原理(一)
    Tomcat乱码或异常
    浅谈Tomcat 、Apache、 Nginx的区别及优缺点
    KETTLE数据互交
    Centos7防火墙配置
    【linux】查看某个进程PID对应的文件句柄数量,查看某个进程当前使用的文件句柄数量
    this license XXXXXX has been cancelled
    Ubuntu16.04安装Redis
    redis的 rdb 和 aof 持久化的区别
  • 原文地址:https://www.cnblogs.com/LZL-student/p/5901525.html
Copyright © 2020-2023  润新知