A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郝锡强 黑马帝   /  2011-12-23 00:37  /  2576 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郝锡强 于 2011-12-23 08:03 编辑

这里不是特别理解,谁给讲讲,我知道ArrayList是列表,那个是集合,用起来不考虑元素还有什么区别

该贴已经同步到 郝锡强的微博

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

2 个回复

倒序浏览
      ArrayList是List(列表),数据是有序的,可以有重复元素
    HashSet是Set(集合),数据没有顺序,没有重复元素,元素搜索速度快            
      HashCode就是一个散列码。一般情况下,如果hashCode相同,则equals应该也判定相等。 散列的价值在于速度,使得查询得以快速进行。 查询一个值的过程首先就是计算散列码,然后使用散列码查询数组。数组并不直接保存值,而是保存值的list。然后对list中的值使用equels()方法进行线性查询。这部分查询会比较慢,但是,如果散列函数好的话,数组的每个位置只有较少的值。因此不是查询真个list,而是快速的跳到数组的某个位置,只对少数的元素进行比较。

      

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
ArrayList_HashSet的比较:

ArrayList是有序集合,存放的元素允许重复,并且存放的是外面对象的引用。而HashSet存放的对象不能重复,且属于散列存放。

设计一个程序来详细说明,ArrayList和HashSet的区别:

public class ReflectPoint {

public int x;
public int y;

public ReflectPoint(int x, int y) {
  super();
  this.x = x;
  this.y = y;
}

public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + x;
  result = prime * result + y;
  return result;
}

public boolean equals(Object obj) {
  if (this == obj)
   return true;
  if (obj == null)
   return false;
  if (getClass() != obj.getClass())
   return false;
  ReflectPoint other = (ReflectPoint) obj;
  if (x != other.x)
   return false;
  if (y != other.y)
   return false;
  return true;
}
}


import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;

public class ReflectTest {

public static void main(String[] args) {
  //Collection collection=new ArrayList();        //ArrayList可以放入相同的对象的引用 打印----4
  Collection collection=new HashSet();          //不能放入相同对象的引用  打印----3
  
  ReflectPoint point1=new ReflectPoint(1, 1);
  ReflectPoint point2=new ReflectPoint(1, 2);
  ReflectPoint point3=new ReflectPoint(1, 1);   //当reflectpoint中生成HashCode和equals,这个点将放不进去 打印---2
  
  collection.add(point1);
  collection.add(point2);
  collection.add(point3);
  collection.add(point1);
  
  point1.y=4;                                                //修改y后,下面的point1就删不掉,因为内存泄露。这样证明java中有内存泄露
collection.remove(point1);
  
  System.out.println(collection.size());
}

}

hashcode把集合分为若干值域,把将要存入的数据转化为HashCode值后放入不同的区域,

当对象被存储进HashCode集合中以后,就不能修改这个对象中的那些参与计算哈希值得字段了,否则,对象修改后的哈希值与最近存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains 方法使用该对象当前的引用作为参数去HashSet集合检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。

HashCode的分析:

hashcode把集合分为若干值域,把将要存入的数据转化为HashCode值后放入不同的区域,

当对象被存储进HashCode集合中以后,就不能修改这个对象中的那些参与计算哈希值得字段了,否则,对象修改后的哈希值与最近存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains 方法使用该对象当前的引用作为参数去HashSet集合检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。


希望我的解答能对你有所帮助。

评分

参与人数 1技术分 +2 收起 理由
杨强 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马