一、集合collection的兩個實現:ArrayList、HashSet的區別java
1.1)ArrayList能夠往裏添加劇復對象的引用,以下圖:算法
1.2) HashSet不能夠往裏添加劇復對象的引用,當往set裏面添加劇復元素以前,會先檢查一次set裏面有沒有該對象的引用,若是沒有,則添加,若是有則不添加(不會覆蓋哦):以下圖:ide
1.3)hashcode方法的做用,當往set中添加元素前,須要檢查該set中是否含有該元素,當該set很大時,按照普通的從前日後遍歷,則須要很大的開銷,這樣作明細是很不合理的。HashSet的實現思路是如此:該set分紅不少個段,每個段內放置n個對應的Hashcode值,當添加一個元素時,hashcode()方法爲該元素生成一個hashcode值,並檢查該hashcode值對應的段內,若是該段內找不到相同的元素,則將該元素插入到段中;這樣將大大提升搜索的效率。 hashcode只有在hash算法集合中才有做用,在如ArrayList中沒有用! 當在對象中實現了hashcode後,那麼對象不適合再改變參與hashcode方法的屬性,由於改變了該屬性後hashcode值也會發生變化,那麼存儲在hash集合中的對象將不能修改之~測試
1.4)對於一個實現了hashcode()方法的對象,若是將該對象加入到HashSet中,當改變該元素的屬性後,將不能將該元素從該HashSet中移除(remove)掉,由於修改該對象的屬性後,該對象的hashcode值也將發生變法,則不能在對應的set段內找到該對象。this
其中hashcode方法和equals方法是生成的,右鍵->Generate HashCode() and equals()...spa
測試實例以下:code
package com.interview.hashcode;orm
public class Point {
private int x;
private int y;
public Point(){
}
public Point(int x,int y){
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Point other = (Point) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
}
對象
package com.interview.hashcode;rem
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
public class HashCodeTest {
public static void main(String[] args) {
Point pt1 = new Point(3,3);
Point pt2 = new Point(2,2);
Point pt3 = new Point(3,3);
Collection list = new ArrayList();
Collection set = new HashSet();
list.add(pt1);
list.add(pt2);
list.add(pt3);
list.add(pt1);
set.add(pt1);
set.add(pt2);
pt1.setX(4);
set.remove(pt1);
System.out.println("list.size:"+list.size());
System.out.println("set.size:"+set.size());
}
}