重写hashcode()方法后,HashMap变成升序?

问题描述

public class ObjTest{private Integer id;public boolean equals(Object obj) {if(obj instanceof ObjTest) {ObjTest ojb = (ObjTest) obj;if(this.id.intValue() == ojb.id.intValue()) {return true;}}return false;}public int hashCode() {return id;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}}public class HashMapTest {private static Map<ObjTest, Integer> map = new HashMap<ObjTest, Integer>();private static void init() {ObjTest obj1 = new ObjTest();obj1.setId(3);ObjTest obj2 = new ObjTest();obj2.setId(2);ObjTest obj3 = new ObjTest();obj3.setId(1);map.put(obj1, 3);map.put(obj2, 2);map.put(obj3, 1);for(Map.Entry<ObjTest, Integer> e : map.entrySet()) {ObjTest obj = (ObjTest) e.getKey();System.out.println("key:" + obj.getId());}}public static void main(String[] args) {init();}}结果:key:1key:2key:3求解?

解决方案

你为什么要关心hashmap遍历元素时的顺序呢?它之所以在这里是升序,完全是因为你改变了hashmap在进行散列是否的逻辑,当你把ObjTest id得值取其他很大的时候,就不一定是升序的了关于hashmap进行hash的过程可以参考以下文章:http://www.ibm.com/developerworks/cn/java/j-lo-hash/?ca=dgr-cn-javaeye0912
解决方案二:
hashmap本身就是无序的LinkedHashMap是有序的还有你这个遍历的方式不好最后你要弄清楚为什么要重写hashcode啊hashcode是在hashmap用来散列的,不是用来拿来排序的

时间: 2024-11-23 15:12:51

重写hashcode()方法后,HashMap变成升序?的相关文章

重写了equals()方法之后也必须重写hashCode()方法

我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 在未重写equals方法我们是继承了object的equals方法,那里的 equals是比较两个对象的内存地址,显然我们new了2个对象内存地址肯定不一样 对于值对象,==比较的是两个对象的值 对于引用对象,比较的是两个对象的地址 默认的equals方法同==,一般来说我们的对象都是引用对象,要重写equ

为什么在重写 equals方法的同时必须重写 hashcode方法_java

我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类. 其 equals 方法比较的是两个对象的引用指向的地址,hashcode 是一个本地方法,返回的是对象地址值.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 为何重写 equals方法的同时必须重写 hashcode方法呢 可以这样理解:重写了 equals 方法,判断对象相等的业务逻辑就变了,类的设计者不希望通过比较内存地址来比较两个对象是否相等,而

JAVA中重写equals()方法的同时要重写hashcode()方法

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码.如下:(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true (2)当obj1.ha

why在重写equals时还必须重写hashcode方法分享_java

复制代码 代码如下: public boolean equals(Object anObject) {    if (this == anObject) {        return true;    }    if (anObject instanceof String) {        String anotherString = (String)anObject;        int n = count;        if (n == anotherString.count) { 

重写hashCode()和equals()方法

hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equals方法 如何重写hashCode方法 重写equals而不重写hashCode的风险 如何重写equals()方法 如果你决定要重写equals()方法,那么你一定要明确这么做所带来的风险,并确保自己能写出一个健壮的equals()方法.一定要注意的一点是,在重写equals()后,一定要重写has

java为什么要重写hashCode和equals方法

  如果不被重写(原生)的hashCode和equals是什么样的?       不被重写(原生)的hashCode值是根据内存地址换算出来的一个值.       不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2).   为什么需要重写equals和hashCode方法?       在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等.在这种情况下,原生的equals方法就不能满足我们的需求了    

对象-java中重写equals方法为什么不直接在里面比较hashcode()?

问题描述 java中重写equals方法为什么不直接在里面比较hashcode()? 看书上说只要重写在一个类中重写equals方法,那就一定要重写hashcode方法,因为两个对象只要equals返回值为true,那么他俩的hashcode就一定相同. 那为什么不可以提前先写好hashcode函数,然后在equals函数里面直接来一行if(this.hashcode() == otherObject.hashcode()) return true;else return false;就行了?

Java equals 方法与hashcode 方法的深入解析

面试时经常会问起字符串比较相关的问题,比如:字符串比较时用的什么方法,内部实现如何?hashcode的作用,以及重写equal方法,为什么要重写hashcode方法?以下就为大家解答,需要的朋友可以参考下   PS:本文使用jdk1.7解析1.Object类 的equals 方法 复制代码 代码如下:    /**      * Indicates whether some other object is "equal to" this one.      * <p>   

Java equals 方法与hashcode 方法的深入解析_Java编程

PS:本文使用jdk1.7解析1.Object类 的equals 方法 复制代码 代码如下:    /**     * Indicates whether some other object is "equal to" this one.     * <p>     * The {@code equals} method implements an equivalence relation     * on non-null object references:     *