set为什么可以去重?
直接给出几个小案例,进行分析。
示例1:使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符。aaabbbccc -> a b c
分析:
1,创建Scanner对象
2,创建HashSet对象,将字符存储,去掉重复
3,将字符串转换为字符数组,获取每一个字符存储在HashSet集合中,自动去除重复
4,遍历HashSet,打印每一个字符
package Demo;
import java.util.HashSet;
import java.util.Scanner;
/**
* @author wangtengfei
* @ClassName test01_scanner
* @date 2019/7/3 9:24
*
* 1. 使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符
* aaaabbbcccddd -> a b c d
*
* 分析:
* 1,创建Scanner对象
* 2,创建HashSet对象,将字符存储,去掉重复
* 3,将字符串转换为字符数组,获取每一个字符存储在HashSet集合中,自动去除重复
* 4,遍历HashSet,打印每一个字符
*/
public class test01_scanner {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入一行字符串:");
//创建Hashset对象,将字符储存,去掉重复
HashSet<Character> hs = new HashSet<>();
//将字符串转换为字符数组,获取每一个字符存储在HashSet集合中,自动去除重复
String line = sc.nextLine();
char[] arr=line.toCharArray();
//遍历字符数组
for (char c : arr) {
hs.add(c);
}
//遍历Hashset,打印每一个字符
for (Character h : hs) {
System.out.print(h);
}
}
}
运行效果:
示例2:需求:将集合中的重复元素去掉
分析:
1、获得一个ArraryList
2、把该集合的所有元素放到HashSet集合中
3、set内的元素放回List
package Demo;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
/**
* @author wangtengfei
* @date 2019/7/3 9:48
*
* 2.需求:将集合中的重复元素去掉
* 分析:
* ①获得一个ArraryList
* ②把该集合的所有元素放到HashSet集合中
* ③set内的元素放回List
* */
public class test02_set {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
HashSet<Integer> set = new HashSet<>();
list.add(111);
list.add(111);
list.add(111);
list.add(111);
list.add(111);
list.add(222);
list.add(222);
list.add(222);
list.add(222);
list.add(333);
list.add(333);
list.add(333);
list.add(333);
list.add(333);
list.add(333);
for (Integer integer : list) {
set.add(integer);
}
list.clear();//清空list集合,再重新填充
for (Integer integer : set) {
list.add(integer);
}
System.out.println("List: "+list);
}
}
运行结果:
示例3:重写Person类的hashCode()、equals()两个方法
person.java
package bean;
import java.util.Objects;
/**
* @author wangtengfei
* @ClassName Person
* @date 2019/7/3 10:21
*/
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//重写了equals()方法和hashcode()方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
Demo05.java
package Demo;
import bean.Person;
import java.util.HashSet;
/**
* @author wangtengfei
* @ClassName Demo5
* @date 2019/7/3 10:23
*/
public class Demo5 {
public static void main(String[] args) {
//在没有重写hashcode()和equal()之前,这两个person同样会被添加进set内。
Person person = new Person("kobe", 41);
Person person2 = new Person("kobe", 41);
HashSet<Person> set = new HashSet<>();
set.add(person);
set.add(person2);
for (Person person1 : set) {
System.out.println(person1.toString());
}
}
}
没重写方法之前的结果:
重写equals()方法和hashcode()方法后的结果之后的结果:(尽管是两个person,但是由于姓名和年龄一样,所以去重。)
总而言之:set之所以可以去重,是因为重写如下两个方法hashCode()、equals()。。。。希望帮到你!!谢谢~~