精华内容
下载资源
问答
  • 由于哈希冲突,不同值的对象也可能具有相同哈希值。这是为什么呢?今天番茄加速就来分析一下。 字符串驻留 In [1]: a = ‘something’ …: b = ‘some’+‘thing’ …: id(a)==id(b) Out[1]: True 如果上面例子返回...

    由于哈希冲突,不同值的对象也可能具有相同的哈希值。这是为什么呢?今天番茄加速就来分析一下。在这里插入图片描述

    字符串驻留

    In [1]: a = ‘something’

    …: b = ‘some’+‘thing’

    …: id(a)==id(b)

    Out[1]: True

    如果上面例子返回True,但是下面例子为什么是False:

    In [1]: a = ‘@zglg.com’

    In [2]: b = ‘@zglg’+’.com’

    In [3]: id(a)==id(b)

    Out[3]: False

    这与Cpython 编译优化相关,行为称为字符串驻留,但驻留的字符串中只包含字母,数字或下划线。

    相同值的不可变对象

    In [5]: d = {}

    …: d[1] = ‘java’

    …: d[1.0] = ‘python’

    In [6]: d

    Out[6]: {1: ‘python’}

    ### key=1,value=java的键值对神器消失了

    In [7]: d[1]

    Out[7]: ‘python’

    In [8]: d[1.0]

    Out[8]: ‘python’

    这是因为具有相同值的不可变对象在Python中始终具有相同的哈希值

    由于存在哈希冲突,不同值的对象也可能具有相同的哈希值。

    对象销毁顺序

    创建一个类SE:

    class SE(object):

    def init(self):

    print(‘init’)

    def del(self):

    print(‘del’)

    创建两个SE实例,使用is判断:

    In [63]: SE() is SE()

    init

    init

    del

    del

    Out[63]: False

    创建两个SE实例,使用id判断:

    In [64]: id(SE()) == id(SE())

    init

    del

    init

    del

    Out[64]: True

    调用id函数, Python 创建一个 SE 类的实例,并使用id函数获得内存地址后,销毁内存丢弃这个对象。

    当连续两次进行此操作, Python会将相同的内存地址分配给第二个对象,所以两个对象的id值是相同的.

    但是is行为却与之不同,通过打印顺序就可以看到。

    充分认识for

    In [65]: for i in range(5):

    …: print(i)

    …: i = 10

    0

    1

    2

    3

    4

    为什么不是执行一次就退出?

    按照for在Python中的工作方式, i = 10 并不会影响循环。range(5)生成的下一个元素就被解包,并赋值给目标列表的变量i.

    认识执行时机

    array = [1, 3, 5]

    g = (x for x in array if array.count(x) > 0)

    g为生成器,list(g)后返回[1,3,5],因为每个元素肯定至少都出现一次。所以这个结果这不足为奇。但是,请看下例:

    array = [1, 3, 5]

    g = (x for x in array if array.count(x) > 0)

    array = [5, 7, 9]

    请问,list(g)等于多少?这不是和上面那个例子结果一样吗,结果也是[1,3,5],但是:

    In [74]: list(g)

    Out[74]: [5]

    这有些不可思议~~ 原因在于:

    生成器表达式中, in 子句在声明时执行, 而条件子句则是在运行时执行。

    所以代码:

    array = [1, 3, 5]

    g = (x for x in array if array.count(x) > 0)

    array = [5, 7, 9]

    等价于:

    g = (x for x in [1,3,5] if [5,7,9].count(x) > 0)

    看明白了吗?

    展开全文
  • 定理:如果两个对象相等,那么它们的哈希值一定相同。如果两个对象哈希值相同,这个两个对象不一定相等

    定理:如果两个对象相等,那么它们的哈希值一定相同。如果两个对象的哈希值相同,这个两个对象不一定相等

    展开全文
  •   “Java中直接打印对象,输出的是对象的地址对象的类没有重写toString方法)”,这是初学者在学Java基础语言的时候,大多数教程都是这么介绍的,初学者也会认为这就是对象在内存中存储的位置,如输出的地址...

    前言

      “Java中直接打印对象,输出的是对象的地址值(对象的类没有重写toString方法)”,这是初学者在学Java基础语言的时候,大多数教程都是这么介绍的,初学者也会认为这就是对象在内存中存储的位置,如输出的地址值为:

    cn.imcyc.person.Person@11ff03
    

    但是,其实这种说法是有混淆性的,实际上,打印对象输出的“地址值”并不是对象的物理存储地址,@之后的“11ff03”只是这个对象的哈希值的十六进制。

      实际上,Java语言中其实是看不到变量/对象真正的物理地址值的,只能通过hashCode方法查到变量/对象的哈希值,在极少数的情况下,变量/对象的哈希值会重复,也就是“哈希碰撞”、“哈希冲突”现象。如果初学者看到两个不同数据的类型/对象打印出的“包名.类名@十六进制哈希值”是一样的,就会误以为这两个类型/对象的地址值是相同的,这种想法是错误的。

      下面介绍一种“哈希冲突”的情况。

    哈希值相同的String类对象

    String a = "重地";
    String b = "通话";
    System.out.println(a.hashCode());
    System.out.println(b.hashCode());
    

    上面代码的执行结果是:

    1179395
    1179395
    

    字符串类对象a和b的哈希值是相同的,但事实上两者的物理存储地址是不同的。那么如果将“重地”和“通话”作为字符串存储到对象中,对象的哈希值会一样吗?

    哈希值相同的自定义类对象

      新建一个Person类,有一个私有字符串数据成员,两个构造函数,如下:

    public class Person {
        private String name;
        
        public Person() {
        }
    
        public Person(String name) {
            this.name = name;
        }
    }
    

      主程序执行如下代码:

    Person c = new Person("重地");
    Person d = new Person("通话");
    System.out.println(c);
    System.out.println(c.hashCode());
    System.out.println(d);
    System.out.println(d.hashCode());
    

    执行结果:

    cn.imcyc.person.Person@75412c2f
    1967205423
    cn.imcyc.person.Person@282ba1e
    42121758
    

      可以看到,对象c和d的哈希值不同的。

    拓展:重写Person类的hashCode方法

      重写了hashCode方法的Person类代码为:

    public class Person {
        private String name;
        
        @Override
        public int hashCode() {
            return name != null ? name.hashCode() : 0;
        }
    
        public Person() {
        }
    
        public Person(String name) {
            this.name = name;
        }
    }
    

    上面重写的hashCode的方法是IDEA默认生成的,可以看到就是把数据成员name的哈希值拿来当对象的哈希值,再次执行主程序的代码,输出为:

    cn.imcyc.person.Person@11ff03
    1179395
    cn.imcyc.person.Person@11ff03
    1179395
    

    可以看到这时的c和d两个对象的哈希值就相同了,但是能说对象c和对象d的地址值相同吗?显然是不能的,对象c和对象d的物理存储地址一定是不同的。

    相关文章推荐

      【Java】超严谨论证:为什么自定义类存储到Set集合中,要重写hashCode方法和equals方法

    展开全文
  • 如果这个地址上有元素,在调用equals方法比较,相同则不再存储,不相同的话就会产生冲突,会产生一个链接表,将这两个元素串起来放在同一个哈希码指定的位置上,而实际上会尽量避免哈希冲突。 如果直接调用equals...

    String s1="hello world";

    String s2=new String("hello world");

    s1.hashCode()和s2.hashCode()其实是相等的。

    hashCode()和equals()都是Object类中的一个方法,String类中重写了两个方法,使得比较的是字符地址指向的内容。

     

    在集合中,set集合是不允许元素重复的,name如何保证元素不重复呢?

    当新添加一个元素的时候首先调用这个元素的hashCode方法,得到的哈希码作为这个元素的存储地址,如果这个地址上没有元素,则直接存储在这个地址上;如果这个地址上有元素,在调用equals方法比较,相同则不再存储,不相同的话就会产生冲突,会产生一个链接表,将这两个元素串起来放在同一个哈希码指定的位置上,而实际上会尽量避免哈希冲突。

    如果直接调用equals方法,当数据量过大时,每次都会调用一次equals方法,效率低。

    用hashCode方法比较减少对象比较次数,提高查找效率。

    展开全文
  • 对象哈希值

    千次阅读 2021-02-27 21:33:13
    ## 概述任何对象,都有一个哈希值,这个哈希值对象的一个整数数字表示. 对象的字符串表示是toString()方法.## 如何获取对象哈希值每一个对象都有一个方法,hashCode(),这个方法定义在了Object类中,所以每个对象都...
  • 不同的整数可可以得到相同的余数即hash HashCode就是将对象的内存地址转化为整数后进行hash运算后得到的hash。 所以两个对象的HashCode相同但内存地址不一定相同。 HashMap的底层也是这样实现的。数组加链表(如...
  • 前言:我们经常会听见很多的概念,哈希值,哈希表,可哈希对象,不可哈希对象,散列表,字典,映射,等等,那么这么多的概念后面到底又有什么区别和联系,它们的本质又是怎么样的,本此系列文章将针对这些概念进行...
  • public int hashCode()返回该对象哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。理解:虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上...
  • 元组、字符串、整型、浮点型都可以使用hash 对元组使用 data = (1,2,3) h = hash(data) print(h) # 返回值:529344067295497451 对字符串使用 data = "holle world" h = hash(data) print(h) # 返回值:...
  • 如果你试图通过 GetHashCode 得到的一个哈希值来避免冲突,你可能要失望了。因为实际上 GetHashCode 得到的只是一个 Int32 的结果,而 Int32 只有 32 个 bit。...77163 个对象哈希值冲突概率为 ...
  • 哈希表、哈希值计算分析引出哈希表哈希表(Hash Table)哈希冲突(Hash Collision)...Double 的哈希值计算String 的哈希值计算哈希值计算总结自定义对象哈希值不重写hashCode重写hashCode重写hashCode方法和equals
  • 哈希冲突:多个关键字公用一个地址。 哈希函数的构造方法: 直接定址法 数字分析法 平方取中法 除留余数法 解决哈希冲突的方法 开放地址法-线性探查法 容易产生堆积,即存储太多时,没地方放。 链地址法 ...
  • Java中的对象哈希值何时相等

    千次阅读 2013-07-11 14:06:59
    不知道大家有没有注意过什么样的情况下两个对象哈希值相同 为了解决上面出现的问题,我在做哈希比较的时候尝试着写了几个例子,发现了如下几点: 1.标准的基本类型只要值相等,哈希值就相同; Integer a=10; ...
  • java里的哈希值

    2021-02-04 19:29:19
    一: 看了一些有关java里的哈希值的文章,有的文章把哈希值就直接叫做是内存地址...哈希值是通过哈希算法散列得来的,而地址值是通过是和物理层面有关,是系统分配的,是不存在相同的,而哈希值是可以通过强制手段...
  • 先了解下Java中堆栈的...我们知道,对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash,但当两个对象计算一样时,这就发生了碰撞冲突。如下将介绍如何处理冲突...
  • Java哈希值HashCode理解

    万次阅读 多人点赞 2018-08-30 09:51:18
     两个对象要完全相对必须哈希值一样。比较用equal()  PS1:任何类均为Object类的间接子类,所以均继承方法public int hashCode(),该方法返回的值一般是通过将该对象的内部地址转换成一个整数来实现的。这样能...
  • 哈希值的概念

    2021-07-10 16:12:39
    在Object类中有一个方法可以返回该对象哈希值 HashCode的源码: public native int hashCode(); native:代表调用的是本地操作系统的方法 public class Person extends Object { @Override public int ...
  • 哈希值 & 哈希表

    2020-06-12 16:51:12
    在Object类有一个方法,可以获取对象哈希值 public native int hashCode():返回该对象的哈希码值。 native:代表该方法调用的是本地操作系统的方法 对象哈希值 public class Demo01HashCode { public static...
  • 哈希表与哈希值

    千次阅读 2018-09-30 16:30:05
    哈希表是一种数据结构,它可以提供快速的插入和查找操作。不管哈希表中有多少数据,插入和删除时间都是接近常量的时间:即O(1)。 缺点是:它是基于数组的,数组创建后难以扩展,哈希表被基本填满时,性能下降严重,...
  • 背景近来学习到python的内置函数hash(),深入发现通过python的哈希值可以做很多的事情,最典型的可能就是文件加密了,在我们现实生活中大约有如下一些用途: 加密网站注册用户的密码。 网站用户上传图片 / 文件后,...
  • 什么叫哈希值

    万次阅读 多人点赞 2018-10-23 15:43:26
    (或散列算法,又称哈希函数,英语:Hash Function)是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 143,949
精华内容 57,579
关键字:

不同的对象哈希值相同

友情链接: CsBrower.rar