【191天】黑马程序员27天视频学习笔记【Day17-上】

叨逼叨两句

如果想把事情做的尽可能好,事情还真是不少啊,这个星期估计都没法一天完成一天的课程了,但一定要做到分的次数不超过三次,哪怕熬夜也要完成。

17-1:HashSet存储字符串并遍历

  1. Set集合,无索引,不可重复,无序(存取顺序不一致)
package com.test.demo30;

import java.util.HashSet;

public class Demo37 {
    public static void main(String[] args) {
        //Set集合,无索引,不可重复,无序(存取顺序不一致)
        HashSet<String> a = new HashSet<String>();
        boolean b1 = a.add("a");
        boolean b2 = a.add("a");
        System.out.println(a);        //HashSet的继承体系中重写了toString方法
        System.out.println(b1);         //true
        System.out.println(b2);        //false
        
    }
}

17-(2-4):HashSet保证元素唯一性的原理

原理

  1. 使用HashSet存储元素时需要去除重复元素,如果每次存储时都用equals方法进行比较,那效率实在是低,为解决这个问题,人们想出用哈希算法提高去重效率。
  2. 简单来说,就是用hashCode方法算出一个哈希值,然后在集合中查找是否有哈希值相同的对象

    1. 如果没有哈希值相同的对象,则直接存入集合。
    2. 若有哈希值相同的对象,则用equals方法进行比较,结果为false就存入,true则不存。

将自定义类的对象存入HashSet去重复

  1. 类中必须重写hashCode()和equals()方法
  2. hashCode():属性相同的对象返回值必须相同,属性不同的返回值尽量不同(提高效率)
  3. equals():属性相同返回true,属性不同返回false,返回false的时候存储

自动生成的hashCode代码说明

public int hashCode() {
        final int prime = 31;     //选取31的三个原因:1. 是质数 2. 不大不小,避免重复,也避免溢出 3. 31这个数好算,2的五次方-1,2向左移动5位
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

自动生成的equals代码说明

    public boolean equals(Object obj) { 
        if (this == obj)     //调用的对象和传入的对象是一个对象
            return true;
        if (obj == null)        //传入的对象为null
            return false;
        if (getClass() != obj.getClass())  //内存中字节码文件是唯一的,这里判断两个对象对应的字节码文件是否是一个
            return false;
        Person other = (Person) obj;// 上面三步已经确定它是Person对象,所以在这里强制转换,不会有异常
        if (age != other.age)    //调用对象的年龄不等于传入的对象的年龄
            return false;
        if (name == null) {        //调用对象的姓名为null时的情况
            if (other.name != null)            
                return false;
        } else if (!name.equals(other.name))  //调用对象的姓名不为null的情况【此时可以放心用equals方法,不担心空指针异常】
            return false;
        return true;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值