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;
}
@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;
}