Set的用法

java中Set的用法

 

Set集合的特点:

不能存储相同的元素。

同时因为其是一个抽象的接口:所以不能直接实例化一个set对象。(Set s = new Set() )错误

该接口主要继承于Collections接口,所以具有Collection的一些常见的方法。

Sr.No.Method & Description
1

add( )         向集合中添加元素

2

clear( )        去掉集合中所有的元素

3

contains( )    判断集合中是否包含某一个元素

4

isEmpty( )    判断集合是否为空

5

iterator( )    主要用于递归集合,返回一个Iterator()对象

6

remove( )    从集合中去掉特定的对象

7

size( )        返回集合的大小

Set接口 常用实现:HashSet  TreeSet

TreeSet:会将里面的元素默认排序

Set<Integer> test = new TreeSet<>();
int a = 1;
int b = 8;
int c = 3;
 
test.add(a);
test.add(b);
test.add(c);
 
 //遍历集合test   利用foreach遍历          //输出结果:1   3   8    
 for (Integer value : test) {
     System.out.print(value+" ");
 }    

HashSet:

添加元素:

hashset.add(E e):返回boolean型,如果此 set 中尚未包含指定元素,则添加指定元素;如果此 set 已包含该元素,则该调用不更改 set 并返回 false。

示例:if 中循环添加到hs中  元素不存在最终返回 false  遇到重复时 最终返回true

 1 import java.util.*;  
 2 public class FirstRepeat {  
 3     public static char findFirstRepeat(String A, int n) {  
 4       
 5     char[] a=A.toCharArray();  
 6     HashSet hs=new HashSet<>();  
 7     for(int i=0; i<n;i++)   
 8     {  
 9         if (!hs.add(a[i]))   
10         {  
11             return a[i];  
12         }  
13     }  
14     return 0;  
15     }  
16   
17     public static void main(String[] args)  
18     {  
19         System.out.println(findFirstRepeat("qywyer23tdd",11));  
20     }  
21 }  

我们使用Set存储的是不重复的对象,对象重复与否是根据 hashCode 和 equals进行判断,所以Set存储的对象必须重写这两个方法

1:只要重写equals,就必须重写hashCode

2:如果自定义对象作为Map的键,那么该对象必须重写hashCode和equals

(说明:String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象 作为 key 来使用。)

String 的源码如下

 public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
 public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

下面我们创建一个Bean来测试一下

public class Bean {
    private int id;
    private String name;
    public Bean() {
        super();
    }
    public Bean(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof Bean)) {
            return false;
        }
        Bean b = (Bean)obj;
        if(this.id == b.id) {
            return true;
        }
        return false;
    }
    
    @Override
    public int hashCode() {
        return id;
    }
}
    @Test
    public void test01() {
        Set<Bean> set = new HashSet<>();
        Bean b1 = new Bean(1,"123");
        Bean b2 = new Bean(2,"456");
        set.add(b1);
        set.add(b2);
        Bean b3 = new Bean(1,"789");
        Bean b4 = new Bean(2,"012");
        set.add(b3);
        set.add(b4);
        System.out.println(set.size()+"元素不重复");
    }
    }

运行 结果是  sizi 为 2  元素不重复   如果不重写 hashCode  和 equals 方法   set.size 就为4  元素是重复的

原文地址:https://www.cnblogs.com/Vegeta/p/8759262.html