一个团体作为一个HashMap的key值,若团体成员的姓名年龄相同,则看作key值相同 因为是自定义类,所以需要重写HashCode和equals方法
public class RedVelvet { private String name; private int age; public RedVelvet ( ) { } public RedVelvet ( String name, int age) { this . name = name; this . age = age; } public String getName ( ) { return name; } public void setName ( String name) { this . name = name; } public int getAge ( ) { return age; } public void setAge ( int age) { this . age = age; } @Override public String toString ( ) { return "RedVelvet{" + "name='" + name + '\'' + ", age=" + age + '}' ; } @Override public boolean equals ( Object o) { if ( this == o) return true ; if ( o == null || getClass ( ) != o. getClass ( ) ) return false ; RedVelvet redVelvet = ( RedVelvet) o; return age == redVelvet. age && Objects. equals ( name, redVelvet. name) ; } @Override public int hashCode ( ) { return Objects. hash ( name, age) ; }
}
public class Demo06MapRv { public static void main ( String[ ] args) { Map< RedVelvet, String> map = new HashMap < > ( ) ; map. put ( new RedVelvet ( "Irene" , 29 ) , "1" ) ; map. put ( new RedVelvet ( "Seulgi" , 26 ) , "2" ) ; map. put ( new RedVelvet ( "Wendy" , 26 ) , "3" ) ; map. put ( new RedVelvet ( "joy" , 24 ) , "4" ) ; map. put ( new RedVelvet ( "Yeri" , 21 ) , "5" ) ; map. put ( new RedVelvet ( "Irene" , 29 ) , "1" ) ; Set< RedVelvet> set = map. keySet ( ) ; for ( RedVelvet rv : set) { String num = map. get ( rv) ; System. out. println ( rv+ " --> " + num) ; } }
}
// 没有重写hashCode之前的输出
RedVelvet{name='Irene', age=29} --> 1
RedVelvet{name='Yeri', age=21} --> 5
RedVelvet{name='Seulgi', age=26} --> 2
RedVelvet{name='joy', age=24} --> 4
RedVelvet{name='Wendy', age=26} --> 3
RedVelvet{name='Irene', age=29} --> 9
// 重写hashCode之后的输出
RedVelvet{name='Irene', age=29} --> 9
RedVelvet{name='Yeri', age=21} --> 5
RedVelvet{name='Seulgi', age=26} --> 2
RedVelvet{name='joy', age=24} --> 4
RedVelvet{name='Wendy', age=26} --> 3
当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。 如果要保证map中存放的key和取出的顺序一致,可以使用java.util.LinkedHashMap
集合来存放。 思考为什么在重写equals方法之前也要重写hashCode?