Java-集合框架-HashSet

1. HashSet

collection下面有:
List:元素的有序的,元素可以重复,因为该集合体系有索引
______ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删速度慢
______LinkedList:底层的数据结构使用的是链表结构。特点:查询速度慢,但是增删速度快
______Vector:底层的数据结构使用的是数组结构,线程同步,被ArrayList替代了
Set: 元素是无序,元素不可以重复
______HashSet:底层的数据结构使用的是哈希表。保证元素的唯一性的原理:判断元素的HashCode值是否相同。如果相同,还会继续判断元素的equals方式,是否为true
______TreeSet

Set集合的功能和Collection一样

package collectionDemo;

import java.util.HashSet;
import java.util.Iterator;

public class HashSetDemo {
    public static void main(String[] args) {

        HashSet hashSet = new HashSet();

        sop(hashSet.add("shh01")); // 返回true,说明存进去了
        sop(hashSet.add("shh01"));  // 返回false,说明没有存进去,验证了Set集合的不可重复性
        hashSet.add("shh02");
        hashSet.add("shh03");
        hashSet.add("shh04");

        Iterator it = hashSet.iterator();
        while (it.hasNext()){
            sop(it.next());
        }
		/*
            输出:
            shh02
            shh01
            shh04
            shh03
            
            验证了Set集合的无序性。
   		*/
    }
    public static void sop(Object obj){
        System.out.println(obj);
    }
}

2. HashSet存储自定义对象

往HashSet集合中存入自定义对象。
姓名和年龄相同为同一个人,重复元素。

总结:
HashSet是如何保证元素的唯一性的呢?

  1. 通过元素的两个方法,hashCode和equals来完成
  2. 如果元素的hashCode值相同,才会判断equals是否为true
  3. 如果元素的hashCode值不同,不会调用equals
package collectionDemo;

import java.util.HashSet;
import java.util.Iterator;

class Person{
    private String name;
    private int age;
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    public String getName(){
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean equals(Object obj){
        if(obj instanceof Person){
            Person p = (Person)obj;
            System.out.println("调用equals......"+this.name+"..."+p.getName());
            return this.name.equals(p.getName()) && this.age==p.getAge();
        }
        return false;
    }

    //定义Person自己的hash值
    public int hashCode(){
        System.out.println("计算哈希值......"+this.name);
        return 60; //设置所有的元素的hashCode值都是一样的,这样都会使用equals方法
        /*
        return this.name.hashCode()+age*39; 
        这样设置hash值,就只有名字和年龄一样的,hash值才相同,才会调用equals,输出结果如下:
        计算哈希值......shh1
		计算哈希值......shh2
		计算哈希值......shh3
		计算哈希值......shh4
		计算哈希值......shh4
		调用equals......shh4...shh4
		shh4::14
		shh3::13
		shh2::12
		shh1::11
        */
    }

}
public class HashSetTest {
    public static void main(String[] args) {
        HashSet hashSet = new HashSet();
        hashSet.add(new Person("shh1",11));
        hashSet.add(new Person("shh2",12));
        hashSet.add(new Person("shh3",13));
        hashSet.add(new Person("shh4",14));
        hashSet.add(new Person("shh4",14));

        Iterator it = hashSet.iterator();
        while (it.hasNext()){
            Person p = (Person)it.next();
            sop(p.getName()+"::"+p.getAge());
        }

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


输出:

计算哈希值......shh1
计算哈希值......shh2
调用equals......shh2...shh1
计算哈希值......shh3
调用equals......shh3...shh1
调用equals......shh3...shh2
计算哈希值......shh4
调用equals......shh4...shh1
调用equals......shh4...shh2
调用equals......shh4...shh3
计算哈希值......shh4
调用equals......shh4...shh1
调用equals......shh4...shh2
调用equals......shh4...shh3
调用equals......shh4...shh4
shh1::11
shh2::12
shh3::13
shh4::14

3. HashSet判断和删除的依据

注意:
对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCodeequals方法。

package collectionDemo;

import java.util.HashSet;
import java.util.Iterator;

class Person{
    private String name;
    private int age;
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    public String getName(){
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean equals(Object obj){
        if(obj instanceof Person){
            Person p = (Person)obj;
            System.out.println("调用equals......"+this.name+"..."+p.getName());
            return this.name.equals(p.getName()) && this.age==p.getAge();
        }
        return false;
    }

    //定义Person自己的hash值
    public int hashCode(){
        System.out.println("计算哈希值......"+this.name);
        //return 60;
        return this.name.hashCode()+this.age*39;
    }

}
public class HashSetTest {
    public static void main(String[] args) {
        HashSet hashSet = new HashSet();
        hashSet.add(new Person("shh1",11));
        hashSet.add(new Person("shh2",12));
        hashSet.add(new Person("shh3",13));
        hashSet.add(new Person("shh4",14));

        sop("shh1 is contains? "+hashSet.contains(new Person("shh1",11)));

        sop("删除shh3:"+hashSet.remove(new Person("shh3",13)));
        
        Iterator it = hashSet.iterator();
        while (it.hasNext()){
            Person p = (Person)it.next();
            sop(p.getName()+"::"+p.getAge());
        }

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

输出:

计算哈希值......shh1
计算哈希值......shh2
计算哈希值......shh3
计算哈希值......shh4
计算哈希值......shh1
调用equals......shh1...shh1
shh1 is contains? true
计算哈希值......shh3
调用equals......shh3...shh3
删除shh3:true
shh2::12
shh4::14
shh1::11
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值