`

详解HashSet

阅读更多
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
public class Test13 {

/**
* list: 有顺序,可重复
* set:无顺序,不可重复
* @param args
* hashcode值是根据内存地址换算出来的
* 如果查找一个集合是否包含有某个对象,通常是逐一取出每个元素与要查找的对象进行比较,当发现某个元素与要
* 查找的元素equals方法比较相等的时候,则停止继续查找,返回肯定信息,否则返回否定信息。如果一个集合很多
* 元素,譬如一万个元素了。并且没有要包含的对象的时候,则意味着你的程序要取出一万个元素进行比较,得到结论
* 有人发明了一种哈希算法来提高程序的查找元素的效率,这种方式把将集合分成若干个区域。每个对象可以算出一个
* 哈希值。可以将哈希分组,每组分别对应某个区域,根据一个对象的哈希码就可以确定对象存在在哪个区域hashset
* 就是采用哈希算法存取对象的集合,它采用某个数字n进行取于的方式对哈希码进行分组和对象区域的划分。
* Object 类定义了一个hashcode()方法来返回每个对象的哈希码,当从hashset集合中查找某个对象的时候,java系统首先要
* 调用对象的hashcode()方法获取该对象的哈希码,根据哈希码找到对应的区域,最后取出该存储区域内每个元素进行equals比较
* 这样不用遍历所有的元素了
*
*
* 通常来说,一个类的实列对象用equals()方法比较的结果相等的时候,它们的哈希码必须相等,反过来就不成立了。
* 即equals方法比较不相等的对象可以有相同的哈希码,或者说哈希码相同的两个对象的equals方法比较结果可以不相等,
* 例如:字符串"dd"和"ss"他们的equals方法肯定不相等,但是它们可以有相等的哈希码。
* 当一个对象被存储进hashset集合中以后就不能改这个对象中的那个参与运算的哈希码字段了,否则,
* 对象被修改后的哈希值和最初存进去的哈希值就不一样了,在这样的情况下,即使在contains方法使用该对象的当前引用作为的参数去hashset集合中检索
* 也返回找不到对象的结果,这样会导致hashset集合中单独删除当前对象,从而造成内存泄漏
*/
public static void main(String[] args) {
   Collection  set = new HashSet();
       Relection pt1= new Relection(1,1);
       Relection pt2= new Relection(2,2);
       Relection pt3= new Relection(1,1);
       set.add(pt1);
       set.add(pt2);
       set.add(pt3);
       set.add(pt1);
      // 内存泄漏的问题 当hash值的时候
      // 注意:当hash值改变
      // pt1.y=7;
      set.remove(pt1);
      System.out.println(set.size());

}

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

@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString();
}

}



分享到:
评论

相关推荐

    Java编程中的HashSet和BitSet详解

    Java编程中的HashSet和BitSet详解 HashSet和BitSet是Java编程中两个常用的集合类,它们都可以用来存储大量的数据,但它们之间有着明显的差异。那么,为什么Apache Commons作者选择使用BitSet代替HashSet呢?在本文...

    详解Java中HashSet和TreeSet的区别

    Java HashSet 和 TreeSet 的区别详解 HashSet 和 TreeSet 是 Java 中两个常用的集合类,它们都实现了 Set 接口,但它们之间有很大的区别。本文将详细介绍 HashSet 和 TreeSet 的区别,帮助大家更好地理解和使用这些...

    HashSet详解和使用示例_动力节点Java学院整理

    HashSet是Java编程语言中的一种集合类,它是一个不包含重复元素的集合,其内部实现基于HashMap。HashSet不保证元素的顺序,允许存储null元素,并且是非同步的,这意味着在多线程环境下,如果需要保证线程安全,需要...

    c# HashSet的扩容机制需要注意的

    C# HashSet 扩容机制详解 HashSet 是 C# 中的一个集合类型,用于存储唯一元素的集合。HashSet 的扩容机制是指当集合元素个数增加时,HashSet 如何动态地扩展其容量以适应新的元素个数。在本文中,我们将详细介绍 ...

    HashSet去重

    ### HashSet去重原理详解 #### 一、概述 在Java编程语言中,`HashSet`是一种常用的集合类,属于`java.util`包的一部分。它不允许集合中有重复的元素,并且不保证集合中元素的顺序。`HashSet`之所以能够实现去重...

    Java中的HashSet详解和使用示例_动力节点Java学院整理

    Java中的HashSet详解和使用示例 HashSet是Java中一个非常重要的集合类,它继承于AbstractSet,并实现了Set接口。HashSet的主要特点是没有重复元素的集合,它是通过HashMap实现的,不保证元素的顺序,而且HashSet...

    java集合知识点详解,包括ArrayList和 HashSet以及Iterator等

    图文并茂,能让大家很好的理解java中这个重要的知识点。 此文档需要wps或者office软件来查看,如果你没有此软件,到http://www.wps.com.cn 下载wps即可查看此文档。 注:本人所有资源都是共享的,的资源分都是0!

    C# ArrayList、HashSet、HashTable、List、Dictionary的区别详解

    C# ArrayList、HashSet、HashTable、List、Dictionary的区别详解 C# 中有多种集合类,每种集合类都有其特点和应用场景。了解这些集合类的区别可以帮助开发者选择合适的集合类来提高程序的性能和可读性。本文将介绍 ...

    Java—Set集合详解(HashSet/LinkedHashSet/TreeSet/EnumSet)

    本文将深入探讨Java中四个主要的Set实现类:HashSet、LinkedHashSet、TreeSet以及EnumSet。 首先,Set集合的核心特性是不存储重复元素。在尝试通过`add()`方法添加相同元素时,如果集合中已经存在该元素,`add()`...

    Java2编程详解.rar

    7. **集合框架**:Java2引入了丰富的集合框架,包括List、Set、Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类,提供高效的数据存储和操作。 8. **输入/输出流**:Java的IO流系统支持对文件、...

    Java HashMap类详解

    Java HashMap 类详解 本资源详细介绍了 Java 中的 HashMap 类,包括其实现机制、Hash 存储机制、集合存储机制等方面的知识点。 1. HashMap 和 HashSet 的关系 HashMap 和 HashSet 是 Java Collection Framework ...

    最新Java 编程详解

    2. **集合框架**:Java集合框架是处理对象数组的重要工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Map(如HashMap和TreeMap)以及接口如Iterable和Iterator。 3. **异常处理**:Java中...

    Java2编程详解

    4. **集合框架**:Java集合框架提供了丰富的数据结构和算法,如ArrayList、LinkedList、HashSet、HashMap等。了解并熟练使用这些集合类,可以提高代码的效率和可读性。 5. **多线程**:Java2平台引入了强大的多线程...

    java面试考试的详解以及个人对照书的一些详解

    以下是对Java面试考试的一些详解,包括常见知识点和个人对照书的学习建议。 1. **基础语法**:面试通常会从Java的基础知识开始,如变量类型、运算符、流程控制(if、switch、for、while)、数组和集合(ArrayList、...

    Java集合类详解总结

    ### Java集合类详解总结 在Java编程中,集合框架(Collection Framework)是处理一组对象的强大工具,它提供了标准的数据结构来存储和操作这些对象。Java集合框架主要包括`Collection`、`Set`、`List`、`Queue`、`...

    实例讲解Java HashSet

    Java HashSet 详解 Java HashSet 是 Java 集合框架中的一种重要数据结构,它提供了一个不允许有重复元素的集合。HashSet 是基于 HashMap 实现的,它允许有 null 值,但不记录插入的顺序,也不是线程安全的。 ...

    Java应用开发详解

    2. **集合类**:Java集合框架包括接口(如List、Set和Map)和它们的实现类(如ArrayList、LinkedList、HashSet、HashMap等)。这些类提供了存储、检索和操作对象的容器,是Java编程中的基础工具。理解它们的区别和...

    Java集合详解代码.zip

    本资料“Java集合详解代码.zip”涵盖了Java集合框架的主要组成部分,包括List、Set、Map以及Collections工具类,通过代码实现来帮助理解和掌握这些概念。 1. **List接口**:List是有序的集合,允许重复元素,支持...

    java集合类源码分析之Set详解.docx

    Set接口继承自Collection接口,提供了多种实现类,其中最常用的是HashSet和TreeSet。这两个类分别依赖于HashMap和TreeMap实现其功能。 HashSet是通过HashMap内部实现的,这意味着它不保证元素的顺序,同时支持高效...

Global site tag (gtag.js) - Google Analytics