A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© @白纸嘿字@ 中级黑马   /  2015-9-30 01:14  /  4107 人查看  /  24 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

HashMapDemo
  1. package com.itheima.Map;

  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Set;

  5. import com.itheima.domain.Employe;

  6. public class HashMapDemo {

  7.         /**
  8.          * @param args
  9.          * 练习:
  10.          * 将员工和户口所在地存储到HashMap"容器"。
  11.          * 要求:
  12.          * 同姓名,同年龄,视为同一个员工。按照年龄从小到大的顺序,对员工进行排序
  13.          *
  14.          * 分析:
  15.          * 1、定义一个员工类,包含姓名,年龄等
  16.          * 2、员工和户口所在地是一种映射关系
  17.          */
  18.         public static void main(String[] args) {
  19.                 /*
  20.                  * 建立HashMap"容器"。
  21.                  */
  22.                 Map<Employe,String> map=new HashMap<Employe, String>();
  23.                 /*
  24.                  * 存储HashMap"容器"元素
  25.                  */
  26.                 map.put(new Employe("xiaoqiang",18), "beijing");
  27.                 map.put(new Employe("wangqiang",28), "tianjin");
  28.                 map.put(new Employe("chenqiang",36), "shanghai");
  29.                 /*
  30.                  * 获取Map“容器”元素
  31.                  */
  32.                 Set<Employe> keySet=map.keySet();
  33.                 for (Employe employe : keySet) {
  34.                         String value=map.get(employe);
  35.                         System.out.println(employe.getName()+":"+employe.getAge()+"........"+value);
  36.                 }
  37.         }

  38. }
复制代码

Employe
  1. package com.itheima.domain;

  2. public class Employe {
  3.         private String name;
  4.         private int age;
  5.        
  6.         public Employe() {
  7.                 super();
  8.                
  9.         }
  10.        
  11.         public Employe(String name, int age) {
  12.                 super();
  13.                 this.name = name;
  14.                 this.age = age;
  15.         }

  16.         public String getName() {
  17.                 return name;
  18.         }
  19.         public void setName(String name) {
  20.                 this.name = name;
  21.         }
  22.         public int getAge() {
  23.                 return age;
  24.         }
  25.         public void setAge(int age) {
  26.                 this.age = age;
  27.         }

  28.         @Override
  29.         public String toString() {
  30.                 return "Employe [name=" + name + ", age=" + age + "]";
  31.         }

  32.         @Override
  33.         public int hashCode() {
  34.                 final int prime = 31;
  35.                 int result = 1;
  36.                 result = prime * result + age;
  37.                 result = prime * result + ((name == null) ? 0 : name.hashCode());
  38.                 return result;
  39.         }

  40.         @Override
  41.         public boolean equals(Object obj) {
  42.                 if (this == obj)
  43.                         return true;
  44.                 if (obj == null)
  45.                         return false;
  46.                 if (getClass() != obj.getClass())
  47.                         return false;
  48.                 Employe other = (Employe) obj;
  49.                 if (age != other.age)
  50.                         return false;
  51.                 if (name == null) {
  52.                         if (other.name != null)
  53.                                 return false;
  54.                 } else if (!name.equals(other.name))
  55.                         return false;
  56.                 return true;
  57.         }
  58.        
  59.        
  60. }
复制代码

这个怎么就实现了“按照年龄从小到大排序”,我知道这“文章”在hashcode()和equals(),所以能不能帮我解读一下,这个两个方法中的代码是什么意思?

24 个回复

倒序浏览
这是equal的源码,应该很好懂吧~~
  1.     public boolean equals(Object anObject) {
  2.         if (this == anObject) {
  3.             return true;
  4.         }
  5.         if (anObject instanceof String) {
  6.             String anotherString = (String)anObject;
  7.             int n = count;
  8.             if (n == anotherString.count) {
  9.                 char v1[] = value;
  10.                 char v2[] = anotherString.value;
  11.                 int i = offset;
  12.                 int j = anotherString.offset;
  13.                 while (n-- != 0) {
  14.                     if (v1[i++] != v2[j++])
  15.                         return false;
  16.                 }
  17.                 return true;
  18.             }
  19.         }
  20.         return false;
  21.     }
复制代码

equal就是:1、当用==判断为true时返回true
                   2、否则就判定是否为String类型,如果是接着判定你所给的两个字符串所对应的字符是否相等,是                      就返回true,否则返回false。
回复 使用道具 举报
对于,hashcode()我不是很懂,不过貌似是通过hashcode()方法当一个中间桥梁进行比较。在api中hashcode()方法描述为“返回此属性集的哈希码值”。我想应该是先通过hashcode()方法将不同对象转化为相对应的hash码值,然后通过对比hash码值是否相同来判定不同对象是否相等的。
回复 使用道具 举报
只求不悔 来自手机 中级黑马 2015-9-30 09:50:39
板凳
好难,,貌似我不懂的样子
回复 使用道具 举报
      我觉得你应该用TreeMap实现,TreeMap可以将存入的对象排序,不过对象实现类要实现comparable接口或在TreeMap中传入比较器,来实现其可比性
     hashMap不能实现排序
回复 使用道具 举报
hashcode比较大小是先比较哈希值,如果哈希值相同就比较equals,不同则不存则不用再比较equals了。集合一般都是用hashcode()保证集合元素的唯一性的
回复 使用道具 举报
对用treemap实现comparator接口 然后在compare方法中return this.age-age
回复 使用道具 举报
纯手打,希望楼主能够给分

QQ截图20150930203252.jpg (154.19 KB, 下载次数: 89)

QQ截图20150930203252.jpg

QQ截图20150930203305.jpg (162.83 KB, 下载次数: 76)

QQ截图20150930203305.jpg
回复 使用道具 举报
IT黑马_梧桐 发表于 2015-9-30 20:35
纯手打,希望楼主能够给分

那个age=2,name=8;age=4,name=6;手误,希望见谅
回复 使用道具 举报
楼主,求问你那种带行数的发帖格式是咋弄的?我在写博客需要使用这种格式~~~小菜鸟一枚,求告知
回复 使用道具 举报
HashMap没法排序,只能保证元素唯一,用TreeMap吧
回复 使用道具 举报
记住,需要比较就用Treeset,然后用比较器去排序,先按年龄排,年龄相同的话就按姓名排
回复 使用道具 举报
caiyao 发表于 2015-9-30 18:59
hashcode比较大小是先比较哈希值,如果哈希值相同就比较equals,不同则不存则不用再比较equals了。集合一般 ...

发这个帖子,是想搞懂hashcode()和equals()中每一句代码的意思!so,能不能拆分解读一下{:2_43:}
回复 使用道具 举报
本帖最后由 @白纸嘿字@ 于 2015-10-2 23:18 编辑
IT黑马_梧桐 发表于 2015-9-30 20:35
纯手打,希望楼主能够给分
看不懂!?

关于hashCode():
“String=8”,name==null,返回值就是flase,就会执行name.hashCode()——String类的hashCode(),返回一个哈希值;“String=6”,也是这样。r然后,它们各自和前面的值相加,最后的结果是相等的?
这又涉及到了String类的hashCode(),“8”和“6”在String类的hashCode()中算出来的哈希值是多少,是怎么得出来的啊?

关于equals():
是因为hashCode()相等了,才去调用equals()的,为什么还要重复比较!
回复 使用道具 举报
15001162522 发表于 2015-10-1 18:42
楼主,求问你那种带行数的发帖格式是咋弄的?我在写博客需要使用这种格式~~~小菜鸟一枚,求告知 ...

我就是直接粘贴的
回复 使用道具 举报

哦哦 我已经会了 嘿嘿
回复 使用道具 举报
15001162522 发表于 2015-10-2 23:33
哦哦 我已经会了 嘿嘿

就是直接粘贴吧!
回复 使用道具 举报

是的呢
回复 使用道具 举报
Rzzz 中级黑马 2015-10-6 23:41:37
19#
看了楼主的代码中,你哪里能实现排序呀?就能实现个遍历输出呀..用的是KeySet方法..返回一个键的set子类对象集合..然后遍历键获取对应的值.......在HashMap我们说的无序是指不能按我们存入的顺序输出原数据.. HashMap本身就不能保证集合排序..你要做到排序就定义TreeMap  在定义的时候用匿名内部类,去实现Comparator接口去从写里面的compare方法.
.(new Comparator<Student>() {
                        @Override
                        public int compare(Student s1, Student s2) {
                               int  num=s2.getAge() - s1.getAge()   //第一按照年龄比较
                                return num == 0 ? s1.getName().compareTo(s2.getName()) : num; //第二按照姓名比较
                        }
                });

第一:这种匿名内部适合我们只对这个抽象方法调用一次,然后后面就不在使用,适合用匿名类.

第二:就是你在员工类里面重写Hashcode和equals()方法.保障是否是同一个对象..这里是要考虑存储的问题...还有从写ComparTo方法,重写你要按照一个什么顺序去排序



开发中习惯用第一种,一般在实现这个功能的时候我们也习惯采用匿名内部类去实现排序.
回复 使用道具 举报
hashcode()方法和equals()方法一般用于判断对象是否是同一个对象。
在类中重写hashCode()和equals()方法,是为了确定对象的唯一性,首先,该类被保存时,系统会调用类的hashCode()方法,来得到它的哈希码值,如果值不同,则是同一个对象;如果哈希码值相同,系统会调用该类的equals()方法,来判断类中的每一个属性的类容是否相同,若都相同则可看做同一个对象,否则为不同对象。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马