java集合(4)-Set集合

  Set集合,类似于一个罐子,程序可以把多个对象"丢进"Set集合,而Set集合通常不能记住每个元素的添加顺序.Set集合与Collection基本相同,没有提供任何额外的方法.实际上Set就是Collection,只是行为有所不同(Set不允许有重复元素)

  Set集合不允许包含相同的元素,如果试图把两个相同的元素添加入同一个Set集合中,则添加操作失败,add()返回false,且新元素不会被加入.

  上面介绍Set的通用知识,因此完全适合后面介绍的HashSet,TreeSet和EnumSet三个实现类,只是这三个实现类各有特色.

一  HashSet

  HashSet是Set接口的典型实现,大多数时候使用的Set集合时就是使用这个实现类.HashSet按Hash算法来存储集合中的元素,因此具有良好的存取和查找性能。

  HashSet具有以下特点:

    1.不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。

    2.HashSet不是同步的,如果多个线程同时访问一个HashSet。假设有两个或者以上的线程同时修改了HashSet集合时,则必须通过代码来保证其同步。

    3.集合元素可以是null.

  当使用HashSet集合来存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode()值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果有两个元素通过equals()方法比较返回true,但是它们的hashCode()方法返回值不相等,HashSet将会把它们存入不同的位置,依然可以添加成功。

  也就是说,HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。

示例代码:类A,B,C,分别重写了equals()方法,hashCode()方法这两个中的一个或者两个。

package com.j1803.collectionOfIterator;

import java.util.HashSet;
import java.util.Set;

//类A重写了equals()方法,总是返回true,但没有重写hashCode()方法.
class A{
    @Override
    public boolean equals(Object obj){
        return true;
    }
}

//类B重写了hashCode()方法,总是返回2,但没有重写equals()方法
class B{
    @Override
    public int hashCode(){
        return 2;
    }
}
//类C重写了equals()方法,总是返回true,重写了hashCode()方法,总是返回2
class C{
    @Override
    public boolean equals(Object obj){
        return true;
    }
    @Override
    public int hashCode(){
        return 2;
    }
}
public class HashSetTest {
    public static void main(String[] args) {
        Set book=new HashSet();
        HashSet books=new HashSet();
        A a=new A();
        B b=new B();
        C c=new C();
        books.add(a);
        books.add(a);
        books.add(b);
        books.add(b);
        books.add(c);
        books.add(c);
        System.out.println(books);

    }
}
[com.j1803.collectionOfIterator.B@2, com.j1803.collectionOfIterator.A@4554617c]

Process finished with exit code 0

猜你喜欢

转载自www.cnblogs.com/shadow-shine/p/9710892.html