java中的hashcode() 函数
这是不是说明hashcode的是什么原理,也不是说明hashcode怎么提高查询效率。。。就是记录一个小知识点,我们使用hashcode()方法时候的小提醒吧。
1
import java.util.Collection;
2 import java.util.HashSet;
3 /**
4 * 为什么要有==,hashcode,equels呢
5 * hashcode可以怎么用
6 * 使用时候容易忽视的小问题
7 * @author lzz
8 */
9 public class HashCodeTest {
10 public static void main(String[] args) {
11 System.out.println("Test-------1---------");
12 StringTest();
13 // 重写hashcode的一个案例,有可能会有这种需求
14 System.out.println("Test-------2--------");
15 CollTest();
16 System.out.println("Test-------3---------");
17 CollTest1();
18 // 使用hashcode时候注意事项,一个小案例,可能造成内存溢出
19 // 当然使用hashcode可以提高查询效率,这也就是set为什么用hash算法的原因吧
20 System.out.println("Test-------4---------");
21 CollTest2();
22 }
23
24 public static void StringTest(){
25
26 /* 这是Object中的equels
27 * public boolean equals(Object obj) {
28 return (this == obj);
29 } */
30 String c= new String("a");
31 String d= new String("a");
32 System.out.println(c.hashCode()==d.hashCode());
33 System.out.println(c==d);
34 System.out.println(c.equals(d));
35 // 引用api中的解释就是
36 // 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果
37 // 所以api建议重写equals同时也要重写hashcode方法
38 }
39
40 /**
41 * 没有重写hashcode方法的类在加入HashSet的情况
42 */
43 public static void CollTest(){
44 Collection coll= new HashSet();
45 CollectionTest coll1= new CollectionTest(3, 4);
46 CollectionTest coll2= new CollectionTest(3, 5);
47 CollectionTest coll3= new CollectionTest(3, 4);
48 coll.add(coll1);
49 coll.add(coll2);
50 coll.add(coll3);
51 System.out.println(coll.size());
52
53 }
54
55 /**
56 * 重写hashcode方法的类在加入HashSet的情况
57 */
58 public static void CollTest1(){
59 Collection coll= new HashSet();
60 CollectionTest1 coll1= new CollectionTest1(3, 4);
61 CollectionTest1 coll2= new CollectionTest1(3, 5);
62 CollectionTest1 coll3= new CollectionTest1(3, 4);
63 coll.add(coll1);
64 coll.add(coll2);
65 coll.add(coll3);
66 System.out.println(coll.size());
67
68 }
69
70 /**
71 * 如果这样使用会造成内存溢出问题
72 */
73 public static void CollTest2(){
74 Collection coll= new HashSet();
75 CollectionTest1 coll1= new CollectionTest1(3, 4);
76 CollectionTest1 coll2= new CollectionTest1(3, 5);
77 System.out.println(coll2.hashCode());
78 coll.add(coll1);
79 coll.add(coll2);
80 coll2.x=4;
81 System.out.println(coll2.hashCode());
82 /* 当coll2的hashcode生成以后加入到coll中后,我们改变从来coll2的属性,此时它的hash已经变化了,
83 所以当我们再去删除它的时候,coll中存储的coll2的hashcod已经不是原来的了
84 所以最开始的那个coll2 就没法被回收, 如果这样的程序大量出现在代码中,那么内存早晚会爆掉的 */
85
86 coll.remove(coll2);
87 System.out.println(coll.size());
88
89 }
90 }
91 /**
92 * 不重新写hashcode和equels
93 * @author lzz
94 */
95 class CollectionTest{
96 int x;
97 int y;
98 public CollectionTest( int x, int y){
99 this.x=x;
100 this.y=y;
101 }
102 }
103
104 /**
105 * 重新写hashcode和equels
106 * @author lzz
107 */
108 class CollectionTest1{
109 int x;
110 int y;
111 public CollectionTest1( int x, int y){
112 this.x=x;
113 this.y=y;
114 }
115 @Override
116 public int hashCode() {
117 final int prime = 31;
118 int result = 1;
119 result = prime * result + x;
120 result = prime * result + y;
121 return result;
122 }
123 @Override
124 public boolean equals(Object obj) {
125 if ( this == obj)
126 return true;
127 if (obj == null)
128 return false;
129 if (getClass() != obj.getClass())
130 return false;
131 CollectionTest1 other = (CollectionTest1) obj;
132 if (x != other.x)
133 return false;
134 if (y != other.y)
135 return false;
136 return true;
137 }
138
139 }
140
2 import java.util.HashSet;
3 /**
4 * 为什么要有==,hashcode,equels呢
5 * hashcode可以怎么用
6 * 使用时候容易忽视的小问题
7 * @author lzz
8 */
9 public class HashCodeTest {
10 public static void main(String[] args) {
11 System.out.println("Test-------1---------");
12 StringTest();
13 // 重写hashcode的一个案例,有可能会有这种需求
14 System.out.println("Test-------2--------");
15 CollTest();
16 System.out.println("Test-------3---------");
17 CollTest1();
18 // 使用hashcode时候注意事项,一个小案例,可能造成内存溢出
19 // 当然使用hashcode可以提高查询效率,这也就是set为什么用hash算法的原因吧
20 System.out.println("Test-------4---------");
21 CollTest2();
22 }
23
24 public static void StringTest(){
25
26 /* 这是Object中的equels
27 * public boolean equals(Object obj) {
28 return (this == obj);
29 } */
30 String c= new String("a");
31 String d= new String("a");
32 System.out.println(c.hashCode()==d.hashCode());
33 System.out.println(c==d);
34 System.out.println(c.equals(d));
35 // 引用api中的解释就是
36 // 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果
37 // 所以api建议重写equals同时也要重写hashcode方法
38 }
39
40 /**
41 * 没有重写hashcode方法的类在加入HashSet的情况
42 */
43 public static void CollTest(){
44 Collection coll= new HashSet();
45 CollectionTest coll1= new CollectionTest(3, 4);
46 CollectionTest coll2= new CollectionTest(3, 5);
47 CollectionTest coll3= new CollectionTest(3, 4);
48 coll.add(coll1);
49 coll.add(coll2);
50 coll.add(coll3);
51 System.out.println(coll.size());
52
53 }
54
55 /**
56 * 重写hashcode方法的类在加入HashSet的情况
57 */
58 public static void CollTest1(){
59 Collection coll= new HashSet();
60 CollectionTest1 coll1= new CollectionTest1(3, 4);
61 CollectionTest1 coll2= new CollectionTest1(3, 5);
62 CollectionTest1 coll3= new CollectionTest1(3, 4);
63 coll.add(coll1);
64 coll.add(coll2);
65 coll.add(coll3);
66 System.out.println(coll.size());
67
68 }
69
70 /**
71 * 如果这样使用会造成内存溢出问题
72 */
73 public static void CollTest2(){
74 Collection coll= new HashSet();
75 CollectionTest1 coll1= new CollectionTest1(3, 4);
76 CollectionTest1 coll2= new CollectionTest1(3, 5);
77 System.out.println(coll2.hashCode());
78 coll.add(coll1);
79 coll.add(coll2);
80 coll2.x=4;
81 System.out.println(coll2.hashCode());
82 /* 当coll2的hashcode生成以后加入到coll中后,我们改变从来coll2的属性,此时它的hash已经变化了,
83 所以当我们再去删除它的时候,coll中存储的coll2的hashcod已经不是原来的了
84 所以最开始的那个coll2 就没法被回收, 如果这样的程序大量出现在代码中,那么内存早晚会爆掉的 */
85
86 coll.remove(coll2);
87 System.out.println(coll.size());
88
89 }
90 }
91 /**
92 * 不重新写hashcode和equels
93 * @author lzz
94 */
95 class CollectionTest{
96 int x;
97 int y;
98 public CollectionTest( int x, int y){
99 this.x=x;
100 this.y=y;
101 }
102 }
103
104 /**
105 * 重新写hashcode和equels
106 * @author lzz
107 */
108 class CollectionTest1{
109 int x;
110 int y;
111 public CollectionTest1( int x, int y){
112 this.x=x;
113 this.y=y;
114 }
115 @Override
116 public int hashCode() {
117 final int prime = 31;
118 int result = 1;
119 result = prime * result + x;
120 result = prime * result + y;
121 return result;
122 }
123 @Override
124 public boolean equals(Object obj) {
125 if ( this == obj)
126 return true;
127 if (obj == null)
128 return false;
129 if (getClass() != obj.getClass())
130 return false;
131 CollectionTest1 other = (CollectionTest1) obj;
132 if (x != other.x)
133 return false;
134 if (y != other.y)
135 return false;
136 return true;
137 }
138
139 }
140