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是最类似数学中集合概念的,不仅具有唯一性,还有无序性。
- HashSet可以存
- HashSet中的元素是不能保证顺序
- HashSet中的元素不能重复
- 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;}@Overridepublic 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; }