4、当一个对象存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则对象修改后的哈希值与最初存储进HashSet集合中的哈希值就不同了。在这种情况下,调用contains方法或者remove方法来寻找或者删除这个对象的引用,就会找不到这个对象。从而导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。(程序中某一些对象不再被使用,以为被删掉了,但是没有,还一直在占用内存中,当这样的对象慢慢增加时,就会造成内存泄露。) 补充: 内存泄露:某些对象不再使用了,占用着内存空间,并未被释放,就会导致内存泄露;也就是说当程序不断增加对象,修改对象,删除对象,日积月累,内存就会用光了,就导致内存溢出。 示例: [java] view plaincopy 1. package cn.itheima.Demo; 2. 3. import java.util.ArrayList; 4. import java.util.Collection; 5. import java.util.HashSet; 6. 7. public class HashCodeDemo { 8. 9. public static void main(String[] args) { 10. //Collection collection =new ArrayList(); 11. Collection collection =new HashSet(); 12. HashCodeTest hct1=new HashCodeTest(1,2); 13. HashCodeTest hct2=new HashCodeTest(3,4); 14. HashCodeTest hct3=new HashCodeTest(1,2); 15. 16. collection.add(hct1); 17. collection.add(hct2); 18. collection.add(hct3); 19. collection.add(hct1); 20. 21. //hct1.setX(5); 22. //collection.remove(hct1); 23. System.out.println(collection.size()); 24. } 25. 26. } 27. 28. //测试类 29. class HashCodeTest{ 30. private int x; 31. public int y; 32. 33. public HashCodeTest(int x,int y){ 34. this.x=x; 35. this.y=y; 36. } 37. 38. public int getX() { 39. return x; 40. } 41. 42. public void setX(int x) { 43. this.x = x; 44. } 45. 46. public int getY() { 47. return y; 48. } 49. 50. public int hashCode() { 51. final int prime = 31; 52. int result = 1; 53. result = prime * result + x; 54. result = prime * result + y; 55. return result; 56. } 57. 58. public boolean equals(Object obj) { 59. if (this == obj) 60. return true; 61. if (obj == null) 62. return false; 63. if (getClass() != obj.getClass()) 64. return false; 65. HashCodeTest other = (HashCodeTest) obj; 66. if (x != other.x) 67. return false; 68. if (y != other.y) 69. return false; 70. return true; 71. } 72. 73. public void setY(int y) { 74. this.y = y; 75. } 76. 77. public String toString() { 78. return "HashCodeTest [x=" + x + ", y=" + y + "]"; 79. } 80. }
|