首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

奇怪Java题:为什么128 == 128返回false,而127 == 127返回true?

奇怪Java题:为什么128 == 128返回false,而127 == 127返回true? 在回答这个问题之前,我们先来看看int和Integer对比,一步步揭开问题答案。...,java自动拆包装为int,然后进行比较,实际上就变为两个int变量比较 (3) 非new生成Integer变量和new Integer()生成变量比较时,结果为false。...而java API中对Integer类型valueOf定义如下,对于-128到127之间数,进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127...加大对简单数字重利用,Java定义在自动装箱时对于值从–128到127之间值,它们装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象。 2....上图可以从代码断点看出 i 和 j 地址相同 以上堆,栈,常量池等在java概念,可以到 java堆、栈、堆栈,常量池区别,史上最全总结 学习更多知识。

2.2K31
您找到你想要的搜索结果了吗?
是的
没有找到

用了这么久equals,你知道还要遵守约定么

该类每个实例本质上都是唯一 即使对于像Thread 这种代表活动状态实体而不是值类来说也是如此。Object提供equals方法能确保这个类展现出正确行为。 2....重写equals 遵循约定 如果你非要重写equals 方法,请遵循以下约定: 自反性:对于任何非 null 引用值 x,x.equals(x),必须返回true,null equals (null...对称性:对于任何非 null 引用值 x 和 y,当且仅当 x.equals(y) 为true时,y.equals(x) 时必须返回true。...这样导致 URL equals 方法违反 equals 约定,在实践中有可能引发一些问题。URL equals 方法行为是一个大错误并且不应模仿。...尽管很难想象什么情况下 o.equals(null) 返回 true。但是意外抛出空指针异常情形可不是很少见。

53920

java中hashcode与equals详解(集合中用法)

一:Javaequals方法和hashCode方法是Object中,所以每个对象都是有这两个方法,有时候我们需要实现特定需求,可能要重写这两个方法 equals()和hashCode()方法是用来在同一类中做比较用...equals方法,就必须重写hashCode方法,不过不重写hashCode方法的话,Object对象中hashCode方法始终返回是一个对象hash地址,而这个地址是永远不相等。...所以这时候即使重写equals方法不会有特定效果,因为hashCode方法如果都不想等的话,就不会调用equals方法进行比较了,所以没有意义了。...equals方法比较了,也就可能存储进HashSet集合中了,Object类中hashCode()方法不能满足对象存入到HashSet中要求,因为它返回值是通过对象内存地址推算出来,同一个对象在程序运行期间任何时候返回哈希值都是始终不变...,所以,只要是两个不同实例对象,即使他们equals方法比较结果相等,他们默认hashCode方法返回值是不同

69430

如何编写出高质量 equals 和 hashcode 方法

同理,当调用 contains(Object o) 时,Java 会通过 hashCode()返回值定位到相应数组位置,然后再在对应链表中结点依次调用 equals() 方法来判断结点中对象是否是你想要对象...,在哈希表中情况可能如下图所示: article 对象映射到了数组下标为 0 位置,article1 对象映射到了数组下标为 6 位置,所以没有找到返回 False。...所以执行 article1.equals(article) 命令,因为我们重写了 Article 对象 equals 方法,这个是否判断两个 Article 对象 url 属性是否相等,如果相等就返回...在 effective-java 书中总结了一套编写高质量 equals 方法配方,配方如下: 1、使用 == 运算符检查参数是否为该对象引用。如果是,返回 true。...hashcode 决定,而我们 hashcode 始终返回 1 ,这样的话,每个元素都会映射到相同位置,散列表退化成链表。

82760

Java一分钟之-集合框架进阶:Set接口与HashSet

Set接口没有定义特定元素顺序,但某些实现类(如TreeSet)根据元素自然排序或比较器来决定顺序。 核心方法 add(E element): 添加元素,如果集合中已存在该元素,则不会添加。...HashSet不允许元素重复,这意味着如果尝试添加已存在元素,add方法返回false。 特性 快速添加:通过哈希函数快速定位元素,添加效率高。...元素比较规则 问题:元素对象未重写equals()和hashCode(),导致无法正确判断元素是否重复。 ...equals()和hashCode()方法,以便正确识别相等实例。...非唯一性 问题:元素hashCode()方法返回相同值,即使equals()返回false可能导致元素视为重复。

13210

如何编写出高质量 equals 和 hashcode 方法

同理,当调用 contains(Object o) 时,Java 会通过 hashCode() 返回值定位到相应数组位置,然后再在对应链表中结点依次调用 equals() 方法来判断结点中对象是否是你想要对象...,在哈希表中情况可能如下图所示: [format,png] article 对象映射到了数组下标为 0 位置,article1 对象映射到了数组下标为 6 位置,所以没有找到返回 False。...既然只重写 equals 方法不行,那么我们把 hashcode 方法重写了。...article 数据节点,所以执行 article1.equals(article) 命令,因为我们重写了 Article 对象 equals 方法,这个是否判断两个 Article 对象 url...(null) 必须返回 false 现在我们已经知道了写 equals 方法通用约定,那我们就参照重写 equals 方法通用约定,再一次来重写 Article 对象 equals() 方法

60150

Java基础篇:什么是hashCode 以及 hashCode()与equals()联系

逐一取出集合中每个元素与要查找对象进行比较,当发现该元素与要查找对象进行equals()比较结果为true时,则停止继续查找并返回true,否则,返回false。...(3)如果对象equals()重写,那么对象hashCode()也要重写。...这时候,即使我们重写equals()方法不会有特定效果,因为不能确保两个equals()结果为true两个对象会被散列在同一个存储区域,即 obj1.equals(obj2) 结果为true...,同一个对象在程序运行期间任何时候返回哈希值都是始终不变,所以,只要是两个不同实例对象,即使他们equals方法比较结果相等,他们默认hashCode方法返回值是不同。...,所以这里equals()返回false,所以集合认为是不同对象,所以将p2存入集合。

2.1K10

JAVA重写equals()方法为什么要重写hashcode()方法说明

在object类中,hashcode()方法是本地方法返回是对象地址值,而object类中equals()方法比较也是两个对象地址值,如果equals()相等,说明两个对象地址值相等,当然...equals方法,就必须重写hashCode方法,不过不重写hashCode方法的话,Object对象中hashCode方法始终返回是一个对象hash地址,而这个地址是永远不相等。...所以这时候即使重写equals方法不会有特定效果,因为hashCode方法如果都不想等的话,就不会调用equals方法进行比较了,所以没有意义了。...equals方法比较了,也就可能存储进HashSet集合中了,Object类中hashCode()方法不能满足对象存入到HashSet中要求,因为它返回值是通过对象内存地址推算出来,同一个对象在程序运行期间任何时候返回哈希值都是始终不变...,所以,只要是两个不同实例对象,即使他们equals方法比较结果相等,他们默认hashCode方法返回值是不同

1.1K10

equals和hashCode你学会了么?

重写equals方法需要保证equals满足以下特性: 自反性:对于任何非null引用值x,必须满足x.equals(x)返回true 对称性:对于任何非null引用值x和y,当且仅当y.equals...(x)返回true时,x.equals(y)必须返回true 传递性:对于任何非null引用值x、y、z,如果x.equals(y)返回true并且y.equals(z)返回true时,那么x.equals...(z)必须返回true 一致性:对于任何非null引用值x、y,只要equals涉及字段信息没有修改,多次调用x.equals(y)要返回一样结果 非空性:对于任何非null引用值x,x.equals...(null)必须返回false 自反性 该要求说明对象必须等于自身,如果违背这一条你会发下集合contains方法无法告诉你正确结果。...hashCode方法需要遵循以下规定: 在程序执行期间,只要对象equals方法比较操作用到信息没有修改,那么对于同一个对象调用多次hashCode方法必须返回同一个整数。

70620

java集合框架源码解析_java源代码怎么用

3.equals 和 hashCode 值得一提是 Collection 还重写了 Object equals() 和 hashCode() 方法(或者说变成了抽象方法?)...要实现可修改集合,程序员必须另外重写此类add方法(否则将抛出UnsupportedOperationException ),并且iterator方法返回迭代器必须另外实现其remove方法。...contains(e)) return false; return true; } 3.addAll addAll()方法就是在 for 循环里头调用 add() public...由于 contains()方法只看是否存在,而不在意有几个,所以如果目标元素有多个,都删除或者保留。 public boolean removeAll(Collection<?...根据推测,这跟 JDK8 接口默认实现特性一样,是为了让子类可以有选择性去实现接口抽象方法,不必即使不需要该方法必须提供一个无意义空实现。

1.3K10

简单讲一下 HashCode() 与 equals()方法

如果对象euqals 方法重写,那么对象 hashCode 尽量重写,并且产生 hashCode 使用对象,一定要和 equals 方法中使用一致,否则就会违反上面提到第二点。...o) { return true; } } 即使两个A 对象通过 equals() 比较返回true,但HashSet 依然把他们当成 两个对象,即使两个 B 对象 hashCode(...即也就是,当把一个对象放入HashSet 中时,如果需要重写该对象对应类 equals() 方法,则应该重写其 hashCode() 方法。...规则是:如果两个对象通过 equals() 方法比较返回true,这两个对象 hashCode 值应该相同。...如果重写equals(Object ibj)方法,则根据重写方法内容去比较相等,返回 true 则相等,false 则不相等。 参考链接

34530

java基础第十三篇之Collection

*49; // } //Eclipse自动生成hashCode //自己重写equals方法,让年龄相同,名字相同两个对象调用equals返回值是true //...TreeSet判断两个对象不相等方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0。向TreeSet中添加应该是同一个类对象,且最好是不可变对象。...如果我们将两个对象equals方法总是返回true,则这两个对象compareTo方法返回应该返回0 2.定制排序 自然排序是根据集合元素大小,以升序排列,如果要定制排序,应该使用Comparator...Java静态代码块、构造代码块、构造方法执行顺序 执行顺序 静态代码优先于非静态代码,是因为static修饰成员都是类成员,随着JVM加载类时候加载而执行,而没有static修饰成员被称为实例成员...: 1.父类中私有方法不能重写.

53210

String 特点是什么?它有哪些重要方法

即使它第一眼看到是一只小狗或小猫,默认跟随其后,心理学把这种现象叫做印刻效应。...; } } return false; } String 类型重写了 Object 中 equals() 方法equals() 方法需要传递一个 Object 类型参数值...String); // 返回 false 当判断参数为 String 类型之后,循环对比两个字符串中每一个字符,当所有字符都相等时返回 true,否则则返回 false。...它们都可以用于两个字符串比较,当 equals() 方法返回 true 时,或者是 compareTo() 方法返回 0 时,则表示两个字符串完全相同。 4....总结 我们从 String 源码入手,重点讲了 String 构造方法equals() 方法和 compareTo() 方法,其中 equals() 重写了 Object equals() 方法

14210

踩坑集锦之hashcode计算

如果两个对象equals()方法返回true,那么它们hashCode()方法返回值应该相同。 通常情况下,hashCode()方法实现都会使用对象内部状态来计算出一个整数值。...(p)); // true p.age = 30; System.out.println(set.contains(p)); // false } } 在这个例子中...在重写hashCode()方法时,要保证对象哈希码是不变;在重写equals()方法时,要保证相等对象具有相等哈希码。...同时,重写了hashCode()和equals()方法,其中hashCode()方法计算只依赖于不可变属性,而equals()方法只比较不可变属性。...但是,由于hashCode()方法实现方式可能因不同JVM、不同操作系统或不同Java版本而有所不同,因此在某些情况下,hashCode()方法可能返回负数。

72110

Java基础——Collection接口

这里判断重复条件是:往容器中添加对象时,如果新添对象与容器中已有的某个对象equals,则重复,这时add()方法返回false,否则返回true。...(如果对equals不理解可以参考《【J2SE快速进阶】——Javaequals和==区别》)   比如: List list=new ArrayList(); Set set=new...System.out.println(set.add("hello"));//输出为false   Collection提供了如下方法方法返回类型 说明 size() int...返回包含容器中所有对象数组   上述方法中,contains()、containsAll()、add()、addAll()、remove()、removeAll()这几个方法在执行时候,判断对象是否存在...因此可以根据需要来重写对象equals方法,需要注意是,重写对象equals方法同时,一定要重写hashCode方法。   后面陆续对Collection子接口及其实现类进一步探讨。

37320

Effective Java 2.0_中英文对照_Item 8

告本章诉你什么时候,怎样重写这些非finalObject方法。本章忽略finalize方法,因为它在Item 7中已经讨论过了。...不关心类是否提供“逻辑等价”测试。例如,java.util.Random可以重写equals方法来检查两个Random实例是否产生相同随机数序列,但设计者认为客户不需要或者不想要这个功能。...很难想象无意违反这个要求。如果你违反了它并将你类实例添加到一个集合中,集合contains方法可能会说这个集合中不包含你刚刚添加实例。...这时list.contains(s)返回什么?谁知道呢?在Sun当前实现中,它碰巧会返回false,但那仅是一种实现方案。在另一种实现中,它也可能很容易返回true或抛出一个运行时异常。...”: p.equals(cp)返回true,而cp.equals(p)返回false

47340

面试官:重写 equals 时为什么一定要重写 hashCode?

即使知道了以上基础知识,依然解决不了本篇问题,也就是:重写 equals 时为什么一定要重写 hashCode?要想了解这个问题根本原因,我们还得先从这两个方法开始说起。...3.3 解决“异常” 为了解决上面的问题,我们尝试在重写 equals 方法时,把 hashCode 方法一起重写了,实现代码如下: import java.util.HashSet; import...,所以直接执行 Object 中 hashCode 方法,而 Object 中 hashCode 方法对比是两个不同引用地址对象,所以结果是 false,那么 equals 方法就不用执行了,...但是,如果在重写 equals 方法时,重写了 hashCode 方法,那么在执行判断时会去执行重写 hashCode 方法,此时对比是两个对象所有属性 hashCode 是否相同,于是调用...hashCode 返回结果就是 true,再去调用 equals 方法,发现两个对象确实是相等,于是就返回 true 了,因此 Set 集合就不会存储两个一模一样数据了,于是整个程序执行就正常了

16.5K168

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券