重写科技格局 重写

2023-06-05 07:25:45

你们好,最近小未来发现有诸多的小伙伴们对于重写科技格局,重写这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。

1、 如果重写不强调hashcode方法会怎样?这里有一个简单的例子:

2、 public class Test {

3、 public static void main(String[] args) throws Exception {

4、 Person per1=new Person('zhangsan',12);

5、 Person per2=new Person('zhangsan',12);

6、 System.out.println(per1.equals(per2));

7、}

8、 }

9、 class Person{

10、 private String name;

11、 private int age;

12、 @Override

13、 public boolean equals(Object o) {

14、 if (this==o) return true;

15、 if (o==null || getClass() !=o.getClass()) return false;

16、 Person person=(Person) o;

17、 if (age !=person.age) return false;

18、 return name.equals(person.name);

19、}

20、 public Person() {

21、}

22、 public Person(String name, int age) {

23、 this.name=name;

24、 this.age=age;

25、}

26、 public String getName() {

27、 return name;

28、}

29、 public void setName(String name) {

30、 this.name=name;

31、}

32、 public int getAge() {

33、 return age;

34、}

35、 public void setAge(int age) {

36、 this.age=age;

37、}

38、 @Override

39、 public String toString() {

40、 return 'Person{' +

41、 'name='' + name + '\'' +

42、 ', age=' + age +

43、 '}';

44、}

45、 }

46、 真实;跑步后;好像没什么问题,结果也在意料之中。

47、 别担心,让我们看看下一个代码示例:

48、 public static void main(String[] args) throws Exception {

49、 //Person per1=new Person('zhangsan',12);

50、 //Person per2=new Person('zhangsan',12);

51、 //System.out.println(per1.equals(per2));

52、 MapPerson, String map=new HashMap();

53、 map.put(new Person('zhangsan',12), 'student');

54、 System.out.println ('output result map.get (newcomer ('Zhang San' 12));

55、}

56、 我们定义一个map,使用Person作为键重写在equals之后,map。get(新人('张三'12))我们期望返回一个学生值。

57、 但程序结果返回的值与期望值相差很大,程序结果为null;

58、 为什么会出现这样一个和你想象中大相径庭的结果?这是因为Person类没有覆盖hashCode方法,导致两个相同的实例具有不相等的哈希代码,这违反了哈希代码约定。

59、 Map的put方法将person对象存储在一个hash桶中,但是get在另一个hash桶中查找该对象,结果可想而知。即使两个实例意外地放在同一个哈希桶中,返回值也不会改变。

60、 这和HashMap的一个优化有关,HashMap缓存每一项的哈希代码,如果不匹配,就不会检查它们的等价性,所以还是返回null。

61、 所以重写重写hashCode之后的结果会如预期吗?让我们来试试:

62、 public class Test {

63、 public static void main(String[] args) throws Exception {

64、 //Person per1=new Person('zhangsan',12);

65、 //Person per2=new Person('zhangsan',12);

66、 //System.out.println(per1.equals(per2));

67、 MapPerson, String map=new HashMap();

68、 map.put(new Person('zhangsan',12), 'student');

69、 System.out.println ('output result map.get (newcomer ('Zhang San' 12));

70、}

71、 }

72、 class Person{

73、 private String name;

74、 private int age;

75、 @Override

76、 public boolean equals(Object o) {

77、 if (this==o) return true;

78、 if (o==null || getClass() !=o.getClass()) return false;

79、 Person person=(Person) o;

80、 if (age !=person.age) return false;

81、 return name.equals(person.name);

82、}

83、 @Override

84、 public int hashCode() {

85、 int result=name.hashCode();

86、 result=31 * result + age;

87、 return result;

88、}

89、 public Person() {

90、}

91、 public Person(String name, int age) {

92、 this.name=name;

93、 this.age=age;

94、}

95、 public String getName() {

96、 return name;

97、}

98、 public void setName(String name) {

99、 this.name=name;

100、}

101、 public int getAge() {

102、 return age;

103、}

104、 public void setAge(int age) {

105、 this.age=age;

106、}

107、 @Override

108、 public String toString() {

109、 return 'Person{' +

110、 'name='' + name + '\'' +

111、 ', age=' + age +

112、 '}';

113、}

114、 }

115、 结果是学生,不出所料。

以上就是重写这篇文章的一些介绍,希望对大家有所帮助。

免责声明:本文来源网友投稿及网络整合仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。投诉邮箱:1765130767@qq.com。
本文地址: