java.集合(Ⅲ).Set.HashSet

原创 2016年05月31日 12:26:20

Set
|——set:元素是无序的(存入的元素和取出的元素顺序不一定一致),元素不可以重复
|——HashSet:底层数据结构是哈希表
HashSet是怎样保证元素的唯一性呢?
通过元素的hashCode和equals来进行比较的
只有当hashCode返回的哈希值相同时,才会调用equals进行比较

对于判断元素是否存在,以及删除等操作,依赖的方法是hashCode和equals
|——TreeSet
Set集合的功能和Collection是一致的。

⑴HashSet:
哈希表结构特点:在进行储存时,先检测哈希值是否一致,若一致,则检查对象是否一样;若对象不一样,则在该地址下延伸
一块内存将对象进行储存;若对象一样,则第二个添加失败。

import java.util.*;
public class Set {
    public static void write(Object obj)
    {
        System.out.println(obj);
    }

   public static void main(String[] args) {
        HashSet hs =new HashSet();

        write(hs.add("java 01"));
        write(hs.add("java 01"));
        hs.add("java 02");
        hs.add("java 03");
        hs.add("java 04");

        for(Iterator it =hs.iterator();it.hasNext();)
        {
            write(it.next());
        }
    }
}

练习与问题:在自定义内容中去掉重复内容(人的信息)

import java.util.*;
class fPerson
{
    private String name;
    private int age;
    fPerson(String name,int age)
    {
        this.name = name;
        this.age = age;
    }

   public boolean equals(Object obj)
    {
        fPerson p = (fPerson)obj;
        System.out.println(this.name+"..equals.."+p.name);
        return this.name.equals(p.name)&&this.age==p.age;
    }
    public String getName()
    {
        return name;
    }
    public int getAge()
    {
        return age;
    }
}

public class Set {

public static void write(Object obj)
    {
        System.out.println(obj);
    }

   public static void main(String[] args) {
        HashSet hs =new HashSet();

        hs.add(new fPerson("java01",11));
        hs.add(new fPerson("java02",12));
        hs.add(new fPerson("java01",11));
        hs.add(new fPerson("java03",11));


        for(Iterator it =hs.iterator();it.hasNext();)
        {
            fPerson p =(fPerson)it.next();
            write(p.getName()+"...."+p.getAge());
        }
    }
}

这里写图片描述
由结果可知,equals没有被调用。为什么为什么会这样呢?
解:

package test;

import java.util.*;
class fPerson
{
    private String name;
    private int age;
    fPerson(String name,int age)
    {
        this.name = name;
        this.age = age;
    }
    //hashCode是返回哈希值的函数
    public int hashCode() //因为在HashSet中,如果哈希值不一样,就不会调用equals对 对象
                          //进行比较。所以如果要对自定义内容进行比较,在HashSet中,必须使哈希值一致
    {                        
        return 60;
    }

    public boolean equals(Object obj)
    {
        fPerson p = (fPerson)obj;
        System.out.println(this.name+"..equals.."+p.name);
        return this.name.equals(p.name)&&this.age==p.age;
    }
    public String getName()
    {
        return name;
    }
    public int getAge()
    {
        return age;
    }
}

public class Set {

    public static void write(Object obj)
    {
        System.out.println(obj);
    }

    public static void main(String[] args) {
        HashSet hs =new HashSet();

        hs.add(new fPerson("java01",11));
        hs.add(new fPerson("java02",12));
        hs.add(new fPerson("java01",11));
        hs.add(new fPerson("java03",11));


        for(Iterator it =hs.iterator();it.hasNext();)
        {
            fPerson p =(fPerson)it.next();
            write(p.getName()+"...."+p.getAge());
        }
    }
}

输出结果

优化版:

package test;

import java.util.*;
class fPerson
{
    private String name;
    private int age;
    fPerson(String name,int age)
    {
        this.name = name;
        this.age = age;
    }
    //hashCode是返回哈希值的函数
    public int hashCode() //因为在HashSet中,如果哈希值不一样,就不会调用equals对 对象
                          //进行比较。所以如果要对自定义内容进行比较,在HashSet中,必须使哈希值一致
    {                        
        System.out.println(this.name+".....hasCode");
        return name.hashCode()+age*39;  //通过返还有对应性的哈希值,能有效的减少比较的次数
        //通过乘一个值,保证不会因为特殊数值导致返回的哈希值一样而增加比较次数
    }

    public boolean equals(Object obj)
    {
        fPerson p = (fPerson)obj; //多态,父类对象转换为子类类型
        System.out.println(this.name+"..equals.."+p.name);//显示比较的过程
        return this.name.equals(p.name)&&this.age==p.age;
    }
    public String getName()
    {
        return name;
    }
    public int getAge()
    {
        return age;
    }
}

public class Set {

    public static void write(Object obj)
    {
        System.out.println(obj);
    }

    public static void main(String[] args) {
        HashSet hs =new HashSet();

        hs.add(new fPerson("java01",11));
        hs.add(new fPerson("java02",12));
        hs.add(new fPerson("java01",11));
        hs.add(new fPerson("java03",11));


        for(Iterator it =hs.iterator();it.hasNext();)
        {
            fPerson p =(fPerson)it.next();
            write(p.getName()+"...."+p.getAge());
        }
    }
}

这里写图片描述

总的来说
1.HashSet中,比较和删除等主要依靠hashCode和equals两个方法,所以在用HashSet时,覆盖这两个函数极为常见。
2.在HashSet中进行比较时,先比较哈希值,如果相同,再调用equals进行比较

以上。

版权声明:本文为博主原创文章,转载请表明出处

java的Set集合:HashSet集合

Set最大的特性就是不允许在其中存放的元素是重复的。 根据这个特点,我们就可以使用Set 这个接口来实现前面提到的关于商品种类的存储需求。Set 可以被用来过滤在其他集合中存放的元素,从而得到一个没...
  • peach90
  • peach90
  • 2015年05月12日 22:22
  • 311

JAVA基础再回首(十七)——Set集合、增强for、HashSet类、LinkedHashSet类、TreeSet类、二叉树、Comparator 排序

JAVA基础再回首(十七)——Set集合、增强for、HashSet类、LinkedHashSet类、TreeSet类、二叉树、Comparator 排序 版权声明:转载必须注明本文转自程序员杜鹏...
  • m366917
  • m366917
  • 2016年08月21日 17:43
  • 1459

Java基础--集合Set-HashSet

集合Set import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashSet; i...

Java集合框架(Set与Map,HashSet与HashMap,TreeSet与TreeMap)

定义

Java--集合(Set:HashSet,TreeSet)

一、Set集合:无索引,不可以重复,无序(存取不一致) LinkedHashSet:底层是链表实现的,是set集合中唯一一个能保证怎么存怎么取的集合对象            属于HashSet子集,...

Java 集合系列之 Set架构 TreeSet HashSet 详细介绍(源码解析)和使用示例

Java 集合系列之 Set架构 TreeSet HashSet 详细介绍(源码解析)和使用示例

黑马程序员_Java第14天知识总结_集合类(集合框架)_Collection_迭代器_List_Set_HashSet

------- android培训、java培训、期待与您交流! ---------- 今天学习的知识点: 集合类(集合框架)_Collection_迭代器_List_ArrayList_Link...
  • v191211
  • v191211
  • 2013年05月20日 05:19
  • 769

java集合List、Set特点与hashSet存储实现原理

集合 的体系: ------------| Collection 单例集合的根接口 ----------------| List  如果是实现了List接口的集合类,具备的特点: 有序,可重复。 ...

《Java源码解析》集合框架Set之HashSet

《Java源码分析》:HashSet前面几篇把Map、List相关的的几个类看了下,当然Set接口相关的类也相当的重要,我们也用的比较多,因此,我们也需要了解下Set接口的两个实现类HashSet、T...

Java集合框架-2.【Set】【HashSet】【TreeSet】

一、Set集合 1、特点:      ①、元素是无序的(存入和取出的顺序不一定一致),且元素不可以重复。  ②、Set集合的功能和Collection一致。 2、Set集合体系结构: Collecti...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java.集合(Ⅲ).Set.HashSet
举报原因:
原因补充:

(最多只允许输入30个字)