Set接口:
1、不允许存储重复的元素
2、没有索引,没有索引的方法,也不能使用普通的for循环遍历
HashSet集合是Set接口的实现类
3、是一个无序的集合,存储元素和取出元素的顺序可能不同
4、底层是一个哈希表结构(查询速度非常快)
set集合不允许存储重复元素的原理:
set集合在用add方法的时候,add、方法会调用元素的hashCode方法和equals方法判断元素是否重复。
步骤如下:
首先计算元素的hashCode值,根据哈希值找到相应的位置,如果没有元素存在,(也就是是说这个值对应的hash值暂时还未存入元素),那就直接插入。如果有元素存在,就调用equals方法,来判断两元素是是否相同。不相同则存在表尾。相同就不存储,add方法改为false。
以下是set集合,存储值的代码,与字符串hashCode()值的判断。
public static void main(String[] args) {
Set set = new HashSet();//多态,Set是一个接口不能被实例化
//set中存放一组无序、唯一的元素
String str1 = "java";
String str2 = new String("java");
String str3 = "java";
System.out.println(str1 == str2);//false
System.out.println(str1 == str3);//true 可以看出1,3地址相同,存放在同一个常量池中
//而1、3和2不是同一个地址
//将str1、str2、str3添加到set集合中
set.add(str1);
set.add(str2);
set.add(str3);
System.out.println(set.size());// 1 可见,set中地址一样和内容一样的内容都无法保存
//判断三个字符串的hashCode()值
System.out.println(str1.hashCode());//3254818
System.out.println(str2.hashCode());//3254818
System.out.println(str3.hashCode());//3254818
}
Iterator迭代器:
由于set集合中的元素是无序的,并且也没有索引,无法访问,那么我如何将set集合中的元素取出来呢?两个方法,一个迭代器,一个增强for。
什么是迭代?迭代就是Collection集合的通用获取方式。再取出元素之前要判断集合中有没有,如果有就把这个元素取出来,继续再判断。直到元素全部被取出,这就叫做迭代。
取出元素要用到迭代器中的两个方法:
boolean hasNext() 如果仍有元素可以迭代,则返回true,否则返回false
E next()返回迭代的下一个元素。也是取出集合中的下一个元素。
Iterator迭代器是一个接口,无法直接使用。需要实现类对象,且获取方式比较特殊:
Collection接口中有一个方法,iterato(),这个方法的返回值就是迭代器的实现类对象。
迭代器的使用步骤:
1、使用集合中的方法iterator()获取迭代器的实现类对象,使用Itreator接口接收(是一种多态的写法)。
2、使用Iterator接口的方法hasNext()来判断是否还有元素。
3、使用Iterator中的方法next取出集合中的下一个元素。
增强for循环:
底层使用的也是迭代器,使用for循环的格式,简化了迭代器的书写。
遍历集合的代码:
public static void main(String[] args) {
Set set = new HashSet();
set.add("绿蚁新焙酒");
set.add("红泥小火炉");
set.add("晚来天欲雪");
set.add("能饮一杯无");
//遍历结合:
Iterator<String> iterator = set.iterator();//调用方法,获得Iterator的实现类对象
while(iterator.hasNext()){
//打印结果:
System.out.println(iterator.next());//晚来天欲雪
//绿蚁新焙酒
//红泥小火炉
//能饮一杯无
}
System.out.println("--------------------------");
//增强for遍历
for ( Object o : set) {
System.out.println(o);//晚来天欲雪
//绿蚁新焙酒
//红泥小火炉
//能饮一杯无
}
//直接打印集合
System.out.println("-------------------------------");
System.out.println(set);//[晚来天欲雪, 绿蚁新焙酒, 红泥小火炉, 能饮一杯无]
}