首页 > 编程语言 >Java中的hash

Java中的hash

时间:2023-07-26 21:03:20浏览次数:27  
标签:set Java String hashCode add new hash public

String类的HashCode

package demo3;
/*
 * 对象的哈希值,普通的十进制整数
 * 父类Object,方法public int hashCode()计算int整数
 */
public class HashDemo {

    public static void main(String[] args) {
        Person p = new Person();
        int i = p.hashCode();
        System.out.println(i);
        
        String s1 = new String("abc");
        String s2 = new String("abc");
        // h = 31 * h + val[i];
        System.out.println(s1.hashCode());//96354(31*0+97=97,31*97+98=3105,31*3105+99=31354)
        System.out.println(s2.hashCode());//96354
        String s3="abc";
        String s4="abc";
        String s5="abd";
        String s6 = "ccc";
        System.out.println(s3.hashCode());//96354
        System.out.println(s4.hashCode());//96354
        System.out.println(s5.hashCode());//96355
        System.out.println(s6.hashCode());//98307(31*0+99=99,31*99+99=3168,31*3168+99=98307)
        //String 的hashCode()源码
         /*public int hashCode() {
                int h = hash;
                if (h == 0 && value.length > 0) {
                    char val[] = value;

                    for (int i = 0; i < value.length; i++) {
                        h = 31 * h + val[i];
                    }
                    hash = h;
                }
                return h;
            }*/
    }
}


哈希表的实现


Java中的hash_hash


HashSet存储过程


Java中的hash_hash_02


HashSet存储String类型

public static void function() {
        HashSet<String> set = new HashSet<String>();
        set.add(new String("abc"));
        set.add(new String("abc"));
        set.add(new String("bbc"));
        set.add(new String("bbc"));
        set.add(null);
        set.add(null);
        System.out.println(set);//[null, bbc, abc]
    }


HashSet存储自定义对象,并重写HashCode和equals方法

package demo3;

import java.util.HashSet;

/*
 * HashSet集合的自身特点:
 * 底层数据结构,哈希表
 * 存储,取出都比较快
 * 线程不安全,运行速度
 * 
 * 哈希表(链表数组结合体)
 * 
 */
public class HashSetDemo1 {

    public static void main(String[] args) {
//        function();
        function1();
        
    }
    //存储String类型
    public static void function() {
        HashSet<String> set = new HashSet<String>();
        set.add(new String("abc"));
        set.add(new String("abc"));
        set.add(new String("bbc"));
        set.add(new String("bbc"));
        set.add(null);
        set.add(null);
        System.out.println(set);//[null, bbc, abc]
    }
    //存储自定义Person类型(由于是new出来的所以不是同一个对象,所以变成了可以存储重复了)
    public static void function1() {
        HashSet<Person> setPerson = new HashSet<Person>();
        setPerson.add(new Person("a",20));
        setPerson.add(new Person("b",10));
        setPerson.add(new Person("b",10));
        setPerson.add(new Person("c",15));
        setPerson.add(new Person("d",19));
        setPerson.add(new Person("e",17));
        System.out.println(setPerson);
    }
}


重写HashCode和equals方法

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)//内存地址一样
            return true;
        if (obj == null)//是否为孔
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }



标签:set,Java,String,hashCode,add,new,hash,public
From: https://blog.51cto.com/u_16190206/6860157

相关文章

  • java 静态变量赋值
    Java静态变量赋值1.流程概述在Java中,静态变量是类级别的变量,它的值在类加载的时候被初始化,且只有一份拷贝,所有实例共享该变量。要实现Java静态变量的赋值,需要遵循以下步骤:步骤描述1声明一个静态变量2在静态块或静态方法中为静态变量赋值下面将详细介绍......
  • java 静态变量map
    实现Java静态变量Map介绍在Java中,静态变量是类级别的变量,它们在整个程序中只有一份拷贝,可以被所有实例共享。而Map是一种键值对的数据结构,可以用来存储和操作键值对。结合两者,我们可以实现一个静态变量Map,以便在整个程序中共享和访问数据。实现步骤下面是一种实现静态变量Map的......
  • java 金额显示千分符
    Java金额显示千分符介绍在开发中,经常会遇到需要将金额格式化为千分符的需求。Java中提供了多种方式来实现这个功能,本文将介绍一种简单有效的方法。实现步骤下面是实现“Java金额显示千分符”的步骤:步骤描述1将金额转换为字符串2使用正则表达式添加千分符3......
  • java 解析map
    Java解析Map简介在Java中,解析Map是一项常见的任务。Map是一个键值对的集合,其中每个键都是唯一的,可以通过键来获取对应的值。解析Map的过程就是将Map中的键值对提取出来,并进行相应的操作。解析流程下面是解析Map的一般流程:步骤描述1创建一个新的Map对......
  • java 截取小数点后面的数字
    Java截取小数点后面的数字在Java编程中,经常需要对小数进行处理,并且有时候需要截取小数点后面的数字。本文将介绍如何使用Java来实现截取小数点后面的数字,并提供相应的代码示例。方法一:使用字符串截取一种常见的方法是将小数转换为字符串,然后使用字符串的截取方法来获取小数点后......
  • java 接收任何类型的Map的参数声明
    Java接收任何类型的Map的参数声明在Java编程中,我们经常需要接收不同类型的Map作为方法的参数,并对其进行处理。在某些情况下,我们希望方法能够接收任何类型的Map,并且能够适应不同类型的数据结构。Java提供了一种灵活的方法来实现这个目标。泛型和通配符为了实现接收任何......
  • java 接口调用重试
    Java接口调用重试实现引言在实际开发中,我们经常会遇到网络不稳定、接口调用超时等问题,这时我们需要实现接口调用的重试机制,来保证接口的可靠性和稳定性。本文将介绍如何在Java中实现接口调用重试。流程概述下面是实现接口调用重试的整个流程概述:步骤描述1.发起接......
  • java 将枚举转Json
    Java将枚举转为JSON引言在Java开发中,有时候需要将枚举类型转换为JSON格式。这样可以方便地在不同的系统或平台之间传递数据。本文将介绍如何使用Java代码实现将枚举类型转换为JSON格式的步骤和代码示例。流程概述下面是将枚举转为JSON的整个流程概述:步骤操作步骤1导......
  • java 将两张图片合成一张
    合成两张图片的流程合成两张图片的过程可以分为以下几个步骤:创建一个新的空白图片,用于存放合成后的结果;将第一张图片绘制在新图片的指定位置;将第二张图片绘制在新图片的指定位置;保存合成后的图片。下面将逐步介绍每个步骤需要做的事情,并提供相应的代码。步骤1:创建一个新的......
  • java 将kb转化为KB、MB、GB的方法
    将KB转化为MB和GB的方法1.流程概述在将KB转化为MB和GB的方法中,我们可以采用以下步骤进行实现:步骤描述1获取输入的KB值2将KB值除以1024得到MB值3将MB值除以1024得到GB值4输出转化后的MB值和GB值下面我们将逐步实现这些步骤。2.代码实现2.1.获取输......