11.笔记Java-HashSet 哈希

hashset:
1.//遍历 和存储顺序不一致 对迭代顺序不做保证
2.set集合不包含重复元素

3.哈希值:根据地址或者字符串或数字算出来的int类型数值
Object类中的hashCode()可以获得哈希值
4.
保证HashSet元素唯一性通过
重写hashCode()和equals()方法实现
hash 表存入时依赖于对象的 hashcode 和equals()方法  可以对其进行重写

5.Hash表存储元素:(jdk8之前,数组+链表实现  一个以链表为元素的数组)(jdk8之后,在长度较长时,实现了优化)
①算元素的hash值
②创建一个长度为16的哈希表(链表数组)
③hash%16得到存储位置
④判断哈希值和内容是否相同

6.LinkedHashset (哈希表和链表实现的set集合、可预测迭代顺序)
package com.demo11;

import java.util.HashSet;
import java.util.LinkedHashSet;

public class Demo {
    public static void main(String[] args) {

        //遍历 和存储顺序不一致 对迭代顺序不做保证

/*        System.out.println("--------");
        System.out.println("种地".hashCode());
        System.out.println("通话".hashCode());

        HashSet<String> s=new HashSet<String>();
        s.add("100");*/

       /* 哈希表
        HashSet<Student> set=new HashSet<Student>();

        Student s1= new Student("C罗","36");
        Student s2= new Student("梅西","34");
        Student s3= new Student("内马尔","29");
        Student s4= new Student("哈兰德","21");
        Student s5= new Student("穆勒","32");
        Student s6= new Student("穆里尼奥","48");
        Student s7= new Student("梅西","34");
        //add
        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        set.add(s7);

       *//* System.out.println(s1.hashCode());//764977973 764977973同一个值多次调用hashcode 算出来的值一致;
        System.out.println(s1.hashCode());
        System.out.println("--------");
        System.out.println(s2.hashCode());//默认情况下,不同对象的hash值不同,但通过方法重写可以实现哈希值是相同的;*//*
        for(Student s:set){
            System.out.println(s.getName()+"----"+s.getAge());
        }*/

        LinkedHashSet<String> lhs=new LinkedHashSet<String>();
        lhs.add("C罗");
        lhs.add("梅西");
        lhs.add("内马尔");
        lhs.add("内马尔");

        for(String s:lhs){
            System.out.println(s);
        }

    }
}

 Student类

package com.demo11;

/*this 关键字;
用this 修饰后表示成员变量;用this指代后表示成员变量;
解决局部变量隐藏成员变量;
在方法中区分局部和成员变量*/
/*application progranming interfing
 * java API  JDK中提供的Java类 在底层中被封装了起来
 * 可查看JDk汉化帮助文档
 * Java.lang下的函数是不需要导入包的
 * 查看api 返回值 方法名 参数 描述
 * */

public class Student {
    //属性
    private String name;
    private String age;
    private String sid;
    private String address;


    //方法
    //构造方法 在生成对象的时候调用
    public Student() {  System.out.println("无参构造方法"); }

    //重载
    public Student(String name, String age) {
        this.sid=sid;
        this.address=address;
        this.name = name;
        this.age = age;
    }

    //重载
    public Student(String sid, String name, String age, String address) {
        this.sid=sid;
        this.address=address;
        this.name = name;
        this.age = age;
    }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }


    public void doHomework() {
        System.out.println("做作业");
    }

    public void study() {
        System.out.println("学习");
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {

        int age1=Integer.parseInt(age);
        if (age1 > 0 || age1 < 120) {
            this.age = age;
        } else {
            System.out.println("年龄有误!");
        }
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setAddress(String address){ this.address =address; }

    public String getAddress() {return this.address; }

    public void show() {
        System.out.println(this.sid+"---"+this.name + "---" + this.age+"岁"+"---"+this.address);

    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;

        if (name != null ? !name.equals(student.name) : student.name != null) return false;
        if (age != null ? !age.equals(student.age) : student.age != null) return false;
        if (sid != null ? !sid.equals(student.sid) : student.sid != null) return false;
        return address != null ? address.equals(student.address) : student.address == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + (age != null ? age.hashCode() : 0);
        result = 31 * result + (sid != null ? sid.hashCode() : 0);
        result = 31 * result + (address != null ? address.hashCode() : 0);
        return result;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值