ArrayList、HashSet的區別

一、集合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());
 }

}

相關文章
相關標籤/搜索