一、Set集合特点
练习Set常用方法 :
package com.JinJie.MySet;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
//练习使用Set系列集合使用多种方式遍历
public class demo01 {
public static void main(String[] args) {
//Set也是接口,通过多态创建它的实现类对象调用方法
Set<String> set = new HashSet<>();
//Set系列集合无法添加相同元素
//如果添加相同元素,则add()方法将返回false,重复的元素不会添加成功
set.add("Set");
set.add("集");
set.add("合");
//1,迭代器遍历
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String str = iterator.next();
System.out.println(str);
}
System.out.println("=================");
//2,增强for遍历
for (String s : set) {
System.out.println(s);
}
System.out.println("=================");
//3,lambda表达式遍历
set.forEach((str)->{
System.out.println(str);
});
}
}
二、HashSet
哈希值练习:
package com.JinJie.MySet.hashset;
//测试哈希值
public class demo02 {
public static void main(String[] args) {
Student s1 = new Student("zhangsan", 23);
Student s2 = new Student("zhangsan", 23);
//未重写hashCode方法,比较两对象地址,计算出的哈希值不同
System.out.println(s1.hashCode());//356573597
System.out.println(s2.hashCode());//1735600054
//重写hashCode方法,比较对象的属性值,属性值相同则哈希值也相同
System.out.println(s1.hashCode());//-1461067292
System.out.println(s2.hashCode());//-1461067292
//有一种小概率情况,即使对象属性不同,计算出的哈希值也想通(哈希碰撞)
String abc = ("abc");
String acD = ("acD");
System.out.println(abc.hashCode());//96354
System.out.println(acD.hashCode());//96354
}
}
package com.JinJie.MySet.hashset;
import java.util.HashSet;
//利用hashcode去除重复元素
//创建一个集合存放学生对象,比较属性值,相同则认为是同一个对象
//利用程序遍历输出集合
public class demo03 {
public static void main(String[] args) {
HashSet<Student> students = new HashSet<>();
Student s1 = new Student("zhangsan", 24);
Student s2 = new Student("zhangsan", 24);
Student s3 = new Student("lisi", 20);
Student s4 = new Student("ergou", 21);
System.out.println(students.add(s1));//true添加成功,false添加失败
System.out.println(students.add(s2));
System.out.println(students.add(s3));
System.out.println(students.add(s4));
System.out.println(students);
}
}
三、LinkedHashSet