Set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持完全一致。我们在前面通过List学习的方法,在Set中仍然适用。因此,学习Set的使用将没有任何难度。
Set容器特点:无序、不可重复。无序指Set中的元素没有索引,我们只能遍历查找;不可重复指不允许加入重复的元素。更确切地讲,新元素如果和Set中某个元素通过equals()方法对比为true,则不能加入;甚至,Set中也只能放入一个null元素,不能多个。
Set常用的实现类有:HashSet、TreeSet等,我们一般使用HashSet。
一、Hashset
HashSet是采用哈希算法实现,底层实际是用HashMap实现的(HashSet本质就是一个简化版的HashMap),因此,查询效率和增删效率都比较高。
下面是HashSet的源代码
观察源代码可以看出,它的add方法底层是用map.put实现的,在map中键值不能重复,所以在set中也不能重复。
二、Treeset
它与Treemap基本差不多,调用的方法与Hashset一样
三、迭代器
迭代器是对容器里面内容的遍历
下面是对list的遍历:
public static void test1(){
List<String> list=new ArrayList<>();
list.add("lan1");
list.add("lan2");
list.add("lan3");
for(Iterator<String> iterator=list.iterator();iterator.hasNext();){
String temp=iterator.next();
System.out.println(temp);
}
}
下面是对set的遍历:
public static void test2(){
Set<String> set=new HashSet<>();
set.add("lan1");
set.add("lan2");
set.add("lan3");
for(Iterator<String> iterator=set.iterator();iterator.hasNext();){
String temp=iterator.next();
System.out.println(temp);
}
}
下面是对Map的遍历
public static void test3(){
Map<Integer,String> map=new HashMap<>();
map.put(0,"lan0");
map.put(1,"lan1");
Set<Map.Entry<Integer,String>> set=map.entrySet();
for(Iterator<Map.Entry<Integer,String>> iterator=set.iterator();iterator.hasNext();){
Map.Entry<Integer,String> temp=iterator.next();
System.out.println(temp);
}
}