Set集合实现于 collection接口,Set集合与List集合最大的区别就是Set集合不包含重复元素,并且Set集合存放的元素通常不按照顺序存放。最多只包含一个null元素。
HashSet类
HashSet是Set接口的实现,HashSet线程不安全,在多线程的情况下最终取得的结果不确定,HashSet存放的元素没有顺序的。
构造方法:
- HashSet() ;构造一个新的空set,其底层实现HashMap,默认初始化容量为16.
- HashSet(Collection c);通过指定的Collection构造一个新set集合。
- HashSet(int initialCapacity) ;构造一个新的空set集合,设置指定的初始化容量。
- HashSet(int initialCapacity, float loadFactor) ;构造一个新的空set集合,设置指定的初始化容量和指定的加载因子。
常用方法:
方法名 | 说明 |
boolean add(E e) | 如果此集合中未包含指定元素,则添加指定元素 |
void clear() | 清空此Set的所有元素 |
boolean contains(Object o) | 如果此set中包含指定元素,返回true,否则false |
boolean isEmpty() | 如果此set中不包含任何元素则返回true |
boolean remove(Object o) | 如果指定元素存在与set中,则将其移除 |
int size() | 返回此set中的元素 |
示例:
public class dome2{
public static void main(String[] args){
HashSet<String> h=new HashSet<String>();
h.add("c++教程");
h.add("Java教程");
h.add("python教程");
h.add("html教程");
System.out.println("java教程是否存放进去:"+h.add("Java教程"));
System.out.println("此set集合的长度是:"+h.size());
System.out.println("通过迭代器遍历hashset集合,发现顺序不一样");
Iterator<String> it=h.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
结果
java教程是否存放进去:false
此set集合的长度是:4
通过迭代器遍历hashset集合,发现顺序不一样
c++教程
Java教程
html教程
python教程
TreeSet 类
TreeSet 类实现了 Set 接口和 SortedSet 接口,并且可以实现对集合的自然排序,因此使用TreeSet实现Set接口一开始就是按照升序排列的。
构造方法:
- TreeSet() ;构造一个新的空的set,集合元素按照升序排列。
- TreeSet(Collection c);通过包含Collection接口创建 一个新的空set集合,按照升序进行排列。
- TreeSet(Comparator comparator) ;创建一个新的空set集合,按照指定的比较器进行排序。
- TreeSet(SortedSet s) ;构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。
常用方法:
方法名 | 说明 |
boolean add(E e) | 未包含指定元素则添加进去 |
E ceiling(E e) | 返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null |
boolean contains(Object o) | 如过此set有指定元素就返回true |
E first() | 返回此set的第一个元素 |
E floor(E e) | 返回此set中小于等于指定元素的最大元素 |
SortedSet headSet(E toElement) | 返回此set集合中toElement之前的所有元素,不包含toElement |
E last() | 返回此set集合的最后一个元素 |
E pollFirst() | 获取并移除第一个元素 |
E pollLast() | 获取并移除最后一个元素 |
SortedSet subSet(E fromElement, E toElement) | 返回此set集合的部分元素 |
SortedSet tailSet(E fromElement) | 返回此set集合中fromElement之后的所有元素,不包含formElement |
示例:
给定十名学生的成绩,成绩录入的顺序随意,查询成绩中是否有67分的人,查询不及格的成绩有哪些,及格的成绩有哪些?
public class dome2{
public static void main(String[] args){
TreeSet<Integer> tr=new TreeSet<Integer>();
for(int i=0;i<10;i++) {
tr.add((int)(Math.random()*100));
}
System.out.println("十名学生成绩由低到高排列");
Iterator it=tr.iterator();
while(it.hasNext()) {
System.out.print(it.next()+"\t");
}
System.out.println("\n"+(tr.contains(67)?"":"没有")+"查询到67分的人存在");
System.out.println("不及格的成绩有:");
SortedSet<Integer> st1=tr.headSet(60);
for(int i=0;i<st1.toArray().length;i++) {
System.out.print(st1.toArray()[i]+"\t");
}
System.out.println("\n"+"及格的成绩有:");
SortedSet<Integer> st2=tr.tailSet(60);
for(int i=0;i<st2.toArray().length;i++) {
System.out.print(st2.toArray()[i]+"\t");
}
}
}