`
lujinglong
  • 浏览: 10634 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Hashset和ArrayList的比较,及HashCode与内存泄露

 
阅读更多
import java.util.Date;

public class ReflectPoint {
private Date birthday = new Date();

private int x;
public int y;
public String str1 = "ball";
public String str2 = "basketball";
public String str3 = "itcast";

public ReflectPoint(int x, int y) {
super();
this.x = x;
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 ReflectPoint other = (ReflectPoint) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}


@Override
public String toString(){
return str1 + ":" + str2 + ":" + str3;
}


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;
}


public Date getBirthday() {
return birthday;
}


public void setBirthday(Date birthday) {
this.birthday = birthday;
}

}

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

public class  ReflectTest
{
public static void main(String[] args)
{
Collection collections = new ArrayList;
ReflectPotin pt1 = new ReflectPoint(3,3);
ReflectPotin pt2 = new ReflectPoint(5,5);
ReflectPotin pt3 = new ReflectPoint(3,3);

collections.add(pt1);
collections.add(pt2);
collections.add(pt3);
collections.add(pt1);

System.out.println(collections.size());
}
}

当new一个该对象类型为ArrayList的时候,结果为4。如果Collection cllections =new HashSet()则结果为3;ReflectPoint的equals()方法和hashcode()方法如果实现,则比较pt1和pt2的值后,得出这两个对象相等。这此时的结果为2;如果没实现hashcode,则结果有可能为3,也有可能为2。

hashcode把集合分成若干个区域,一般情况下arraylist中不用hashcode,hashcode一般只应用在hash集合中,才有价值。

假设想查找一个集合中是否包含有某个对象,通常是逐一取出每个元素与要查找的对象进行比较,当发现某个元素与要查找的对象进行equals方法比较的结果相等时,则停止查找并返回肯定的信息,否则,返回否定的信息。如果一个集合有很多个元素,例如有一个个元素,并且没有包含要查找的对象时,则意味着代码需要从这个集合中取出一万个元素进行逐一的比较才能得到结论。

为了提高效率,则我们把把哈希算应用到哈希集合里面。这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储在哪个区域。

通常来说,一个类的两个实例对象用equals()方法比较的结果相同,他们的哈希码也必须相等,但反之则不成立。即equals()方法比较结果不相等的两个对象可以有相同的哈希码。或者说哈希码相同的两个对象的equals()方法比较结果可以不相等。例如:“BB”和“Aa”的equals方法比较结果肯定不相等,但他们的hashconde方法返回值却相等。

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

如果在ReflectTest2这个类中把pt1.y=1或者 pt1.x=7.则collections.remove(pt1),则结果为2。如果没把pt1中的x.y的值该掉。则remove后,结果为1。


  • 大小: 108.9 KB
分享到:
评论

相关推荐

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    实验05 Java集合.doc

    注意:因为Person类是自定义类,需要重写hashCode()方法和equals()方法,并规定只有姓名和身份证号都相等,则对象相等。 其中计算哈希码的算法:(31 + ((name == null) ? 0 : name.hashCode()))*31 + id (注:...

    Java面试题.docx

    33、ArrayList和LinkedList的区别,以及应用场景 34、数组和链表的区别 35、开启线程的三种方式? 36、线程和进程的区别? 38、run()和start()方法区别 39、如何控制某个方法允许并发访问线程的个数? 40、在...

    java8源码-putaoo.github.io:putao.github.io

    hashCode与equals) (String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?、什么是反射机制?反射机制的应用场景有哪些?......) (Arraylist 与 LinkedList 异同、ArrayList 与 Vector 区别...

    java8源码-java-start::seedling::seedling::seedling:学习Java语法过程中的一些案例

    hashCode与equals) (String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?、什么是反射机制?反射机制的应用场景有哪些?......) (Arraylist 与 LinkedList 异同、ArrayList 与 Vector 区别...

    Java期末复习-类集框架

    List接口、ArrayList类、Vector类、栈操作类Stack、链表操作类LinkList、队列操作接口Queue、Set接口、HashSet类、TreeSet类、SortedSet接口 双值操作接口Map(key->value)及其子接口、子类: SortedMap接口、HashMap...

    程序员需要经常刷题吗-simple-java-zh-CN:SimpleJava是Java常见问题的集合。中文翻译

    比较器与可比较 hashCode() 和 equals() 之间的契约 Java是按引用还是按值传递对象? 迭代与递归 ##3。 类和接口 什么是实例初始化器? 字段不能被覆盖? 继承与组合 如何使用 Java 枚举? 有多少种内部类? 什么是...

    史上最全java面试,103项重点知识,带目录

    25. ArrayList 和 LinkedList 的区别是什么? 11 26. 如何实现数组和 List 之间的转换? 11 27. ArrayList 和 Vector 的区别是什么? 11 28. Array 和 ArrayList 有何区别? 12 29. 在 Queue 中 poll()和 remove()有...

    疯狂JAVA讲义

    学生提问:hashCode方法对于HashSet的作用是什么? 249 7.3.2 TreeSet类 252 7.3.3 EnumSet类 259 7.4 List接口 261 7.4.1 List接口和ListIterator接口 261 7.4.2 ArrayList和Vector实现类 264 7.4.3 固定长度...

    java8集合源码分析-CollectionDemo:自己复习集合框架时候的例子

    java8 集合源码分析 ...保证唯一性:元素hashCode和equals方法。hashCode方法相同,判断equals方法 ---LinkedHashSet: 有序,是HashSet的子类 2.TreeSet: 底层是二叉树,可对元素进行排序,默认是自然顺序

    Java测试题2答案

    B 内存回收程序负责释放无用内存 C 内存回收程序允许程序员直接释放内存 D 内存回收程序可以在指定的时间释放内存对象 11.下列代码哪几行会出错: c 1) public void modify() { 2) int I, j, k;...

    Java常见面试题208道.docx

    25.ArrayList 和 LinkedList 的区别是什么? 26.如何实现数组和 List 之间的转换? 27.ArrayList 和 Vector 的区别是什么? 28.Array 和 ArrayList 有何区别? 29.在 Queue 中 poll()和 remove()有什么区别? 30....

    JavaITCourses-master

    Java核心 该存储库将包含所有代码,并带有针对Java Core的少量注释。 有关更多信息,请参见和。 变更日志 带有实验室代码并针对以下每个课程进行测试: Java基础 ... HashMap / HashSet,hashCode()

    Java中的HashMap浅析

    在Java的集合框架中,HashSet,HashMap是用的比较多的一种,顺序结构的ArrayList、LinkedList这种也比较多,而像那几个线程同步的容器用的比较少,像Vector和HashTable,因为这两个线程同步的容器已经不被JDK推荐...

    Java容器.xmind

    底层哈希表,基于hashCode的equals的比较方式,线程不安全,存取速度快。 SortedSet 标记: interface TreeSet 标记: class 实现comparable接口,元素是以二叉树的形式存放的。线程不安全 CopyOnWriteArraySet 标记:...

    JAVA中List与Set、Map的区别

    1、List,Set,map都是继承自Collection接口,...  3、List接口有三个实现类:LinkedList,ArrayList,Vector ,Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet  Collection  /   /   / 

    【Java】常用数据集合体系和特点(汇总)

    Collection体系集合1.1 List 表① ArrayList 类(数组)② Vector 类(数组、线程同步)③ LinkedList 类(链表)④ CopyOnWriteArrayList 类(线程安全且高效的List)1.2 Set 集合① HashSet 类(HashCode)② ...

    达内 coreJava 习题答案

    6、输出所有的水仙花数,把谓水仙花数是指一个数3位数,其各各位数字立方和等于其本身, 例如: 153 = 1*1*1 + 3*3*3 + 5*5*5 class DafodilNumber{ public static void main(String[] args){ System.out....

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.3.5 小心使用浮点数进行比较 53 3.3.6 boolean和char 55 3.3.7 不要使用还没有创建出来的变量 57 3.3.8 String——char串起的项链 58 3.3.9 转义符——看不见写得出 61 3.4 小结:基本数据类型—— Java中...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    3.3.5 小心使用浮点数进行比较 53 3.3.6 boolean和char 55 3.3.7 不要使用还没有创建出来的变量 57 3.3.8 String——char串起的项链 58 3.3.9 转义符——看不见写得出 61 3.4 小结:基本数据类型—— Java中...

Global site tag (gtag.js) - Google Analytics