Java中Set集合

Set集合类似于数学中集合的概念,具有和数学中集合一样的唯一性(就是说Set集合中的元素不能重复),在Java中我们最长使用的集合有HashSet、LinkedHashSet和TreeSet,这里最常使用的就是HashSet。

一、HashSet

        1.HashSet的定义

HashSet<引用类型> set = new HashSet<引用类型>(); 

注意:如果是基本类型请用包装类,比如:int的包装类Integer

        2.add 添加元素 

        3.size 返回HashSet中的元素个数

        HashSet<String> set = new HashSet<String>();
        set.add(null);
        set.add("null");
        System.out.println(set.size());
        for (String s:set){
            System.out.println(s==null);
            System.out.println(s);
        }

 输出结果

        2        System.out.println(set.size());
        true
        null
        false
        null

 可以看到HashSet中可以添加null进去。

        4.remove(obj) 删除HashSet集合中的obj对象,删除成功返回true,否则返回false  

        5.isEmpty 判断HashSet集合是否为空。

        HashSet<String> set = new HashSet<String>();
        set.add("a");
        System.out.println(set.isEmpty());
        System.out.println(set.remove("b"));
        System.out.println(set);
        System.out.println(set.remove("a"));

 输出结果

        false
        false
        [a]
        true

        6.clear(): 移除HashSet中的所有元素。 

        HashSet<String> set = new HashSet<String>();
        set.add("abc");
        set.add("def");
        System.out.println(set);
        set.clear();
        System.out.println(set);

输出结果: 

        [abc, def]
        []

         7.遍历HashSet

                <1>使用迭代器 iterator()

    set.add("a");
    set.add("b");
    set.add("c");
    set.add("d");
    set.add("e");
    Iterator<String> ite =set.iterator();
    while(ite.hasNext())
    {
        System.out.println(ite.next());
    }

                <2>使用增强for循环

        HashSet<String> set = new HashSet<String>();
        set.add("e");
        set.add("嘟噜");
        set.add("a");
        set.add("芜湖");
        set.add("d");
        set.add("咕咕");
        Iterator<String> ite =set.iterator();
        while(ite.hasNext())
        {
            System.out.println(ite.next());
        }
        System.out.println(set);
        for (String s:set){
            System.out.print(s+" ");
        }

 输出结果

a
d
e
嘟噜
芜湖
咕咕
[a, d, e, 嘟噜, 芜湖, 咕咕]
a d e 嘟噜 芜湖 咕咕 

        8.contains(obj):判断集合中是否包含obj元素。 

        HashSet<String> set = new HashSet<String>();
        set.add("a");
        set.add("ba");
        System.out.println(set.contains("b"));

输出结果:false

        9.HashSet的特点

        HashSet是最类似数学中集合概念的,不仅具有唯一性,还有无序性。

  1. HashSet可以存
  2. HashSet中的元素是不能保证顺序
  3. HashSet中的元素不能重复
  4. HashSet的集成实现是使用的HashMap

HashSet 的add方法实质是map全局变量调用了put方法,将数据存到了key,因为HashMap的 key是唯一的,所以HashSet添加的元素也不允许重复。

二、LinkedHashSet集合 

LinkedHashSet集合的特点

        <1>LinkedHashSet是使用HashSet实现的

        <2>LinkedHashSet使用了链表可以保证该集合是有序的

        <3>LinkedHashSet中使用了hash表元素是唯一的。

三、TreeSet集合

1.TreeSet中的元素是有序的 

        TreeSet ts=new TreeSet();
        ts.add("agg");
        ts.add("abcd");
        ts.add("激光人");
        ts.add("ffas");
        ts.add("咕咕");
        ts.add("露露");
        Iterator it=ts.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }

输出结果:

abcd
agg
ffas
咕咕
激光人
露露

2.如果想要插入自定义对象,就需要实现Comparable 接口

class Person implements Comparable{
    
    String name;
    int age;
    Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }

    @Override
    public int compareTo(Object o) {
        Person p=(Person)o;
        //先对姓名字典序比较 如果相同 比较年龄
        if(this.name.compareTo(p.name)!=0) {
            return this.name.compareTo(p.name);
        }
        else
        {
            if(this.age>p.age) return 1;
            else if(this.age<p.age) return -1;
        }
        return 0;
    }

}

public class Test {
    public static void main(String args[])
    {
        TreeSet ts=new TreeSet();
        ts.add(new Person("瑞贝卡",21));
        ts.add(new Person("路飞",12));
        ts.add(new Person("三镇",8));
        ts.add(new Person("路飞",11));
        Iterator it=ts.iterator();
        while(it.hasNext())
        {
            Person p=(Person)it.next();
            System.out.println(p.name+":"+p.age);
        }
    }
}

输出结果:

三镇:8
瑞贝卡:21
路飞:11
路飞:12 

四、三个集合的使用要怎么挑选呢?

LinkedHashSet:要求当插入顺序和取出顺序一致的时候使用LinkedHashSet。

TreeSet:只有在需要对元素进行排序时使用

HashSet:在不使用上面两个集合的时候使用HashSet

五、Set在算法中的应用 (求一个字符串的最长无重复字符子字符串长度)

题目描述:求一个字符串的最长无重复字符子字符串长度

实例:

输入:abcabcabc

输出:3

解析:

abcabcabc的子字符串有abca, abc, ab, a,无重复字符的子字符串: abc, ab, a,无重复字符的最长子字符串是abc,它的长度是3。

 题目详见:LCR 016. 无重复字符的最长子串

    public static int norepeat(String s){
        //哈希set用来存储不重复字符
        Set<Character> cset =  new HashSet<Character>();
        int rk = 0,ans = 0;
        int n = s.length();
        for(int i = 0;i<n;i++){
            if(i!=0){
                cset.remove(s.charAt(i-1));    
            }
            while(rk<n&&!cset.contains(s.charAt(rk))){
                cset.add(s.charAt(rk++));         
            }
             ans = Math.max(ans,rk-i);       
        } 
            return ans;   
    }

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值