Set集合的简单理解

Set集合

前面我们学习了Collection 集合有两个子集合ListSetList集合在前面我们已经介绍过了,接下来让我们看看Set集合以及他的子实现类:

先让我们看看Set集合和List集合的区别:

Set集合:不允许出现重复元素,存储和输出的顺序不一致(无序性),可以使元素为null

List集合:可以出现重复元素,存储和输出的顺序是一致的(有序性)

 

例如:

package com.SetDome;
 
import java.util.HashSet;
import java.util.Set;
 
public class SetDome2 {
public static void main(String[] args) {
//创建一个set集合对象
Set<String> set=new HashSet<String>();
//添加元素给集合对象
set.add("Hello");
set.add("World");
set.add("Hello");
set.add("javaSE");
set.add("javaSE");
//增强for循环
for(String s:set) {
System.out.println(s);
}
} 
}
运行结果:
Hello
javaSE
World

由上例可以看出,set集合中的元素如果有重复元素,在输出时就会出现去重的效果,会达到这一效果的原因是Set的子实现类HashSet

 

HashSet的存储原理:

当你向其中存储元素的时候,首先会调用该方法底层的HashCode方法将元素中的哈希码值(地址值)算出来,通过这个哈希码值就可以算出元素在哈希表中的位置

1)如果根据哈希码值算出来的位置上没有任何元素,则将该元素放在这个位置上

2)如果算出来的位置上有元素的存在,就要运用equals方法将输入的元素与位置上已经存在的元素进行比较,如果返回的是true,就不理睬它,如果返回的是false,就将该元素添加到哈希表中去

 

接下来我们再看看向set集合中添加自定义对象时会怎么样?

先创建一个自定义学生类:

package com.SetDome;
 
public class Student {
 
private String name;
private int age;
public Student() {
super();
}

public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
 
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
 
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}


}

再来创建一个测试类进行测试

package com.SetDome;
 
import java.util.HashSet;
import java.util.Set;
 
public class SetDome {
 
public static void main(String[] args) {
//创建一个set集合对象
Set<Student> set=new HashSet<Student>();
Student s1=new Student("迪丽热巴",25);
Student s2=new Student("赵星星",24);
Student s3=new Student("吴宣仪",23);
Student s4=new Student("迪丽热巴",25);
set.add(s1);
set.add(s2);
set.add(s3);
set.add(s4);
for(Student str: set) {
System.out.println(str.getName()+"---"+str.getAge());
}

}
}
运行结果:
赵星星---24
吴宣仪---23
迪丽热巴---25

大家可以看到上面的学生类里面我多写了HashCode方法和equals方法,因为是自定义类,系统不会在底层帮你重写这些方法,只能我们自己手动去重写,不然的话就达不到去重的效果

猜你喜欢

转载自blog.csdn.net/j_better/article/details/80275847