java的HasSet遍历可以使用迭代器遍历,增强for遍历,lambda表达式遍历。
HasSet底层会创建一个默认长度为16,默认加载因子为0.75的数组,数组名table,当长度为0.75*16=12时扩容为32
根据元素的哈希值跟数组长度计算出应存入的位置
判断当前位置是否为null,如果是null直接存入 如果位置不为null,调用equals方法比较属性值
若一样则不存,不一样则存入数组,形成链表
JDK8以前新元素存入数组,老元素挂在新元素下面
JDK8及以后新元素直接挂在老元素下面(当链表长度超过8以后且数组长度大于64时,自动转为红黑树)
代码如下:
public class HashSetTest {
public static void main(String[] args) {
Set<String> s=new HashSet<>();
s.add("zhangsan");
s.add("lisi");
s.add("wangwu");
System.out.println("------------------------");
System.out.println("迭代器遍历:");
Iterator<String> it = s.iterator();
while (it.hasNext()){
String str = it.next();
System.out.println(str);
}
System.out.println("------------------------");
System.out.println("增强for遍历:");
for (String str : s) {
System.out.println(str);
}
System.out.println("------------------------");
System.out.println("内部类遍历:");
s.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
System.out.println("------------------------");
System.out.println("lambda表达式:");
s.forEach((String str) -> {System.out.println(str);});
// System.out.println("------------------------");
// s.forEach(str -> System.out.println(str));
}
}
结果如下:
注意HasSet存储和取出的顺序不一定一致。