set 接口简介:
Set接口和List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。Set接口主要有两个实现类,分别是HashSet和TreeSet。其中,HashSet是根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取和查找性能。TreeSet则是以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序。
HashSet 接口简介:
HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。
package sk;
import java.util.ArrayList;
/*
HashSet集合没有索引,不能存储重复元素,元素存取无序
元素唯一的原理:
1.根据对象的哈希值(通过调用hashCode方法 计数出来的)来计算存储的位置
2.判断当前位置上是否有数据
2.1 没有:直接存储
2.2 有:调用equals()方法来比较一下内部的属性值
2.2.1:属性值相同,不存储了
2.2.2:属性值不同,以链表结构存储
*/
import java.util.HashSet;
import java.util.Iterator;
public class inter {
public static void main(String[]args) {
HashSet<String>list=new HashSet<>() ;
list.add("张三");
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
//普通for循环遍历,结果失败,因为HashSet集合当中,没有索引
/*
for(int i=0;i<list.size();i++)
{
list.get(i);
}
*/
//解决循环方式
//1.迭代器的循环方式
//2.增强for方式
for(String s: list)
System.out.println(s);
}
}
package sk;
public class student /*extends object*/ {
@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;
}
private String name;
private int age;
public student()
{}
public student( String name,int age)
{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 String toString() {
return "student [name=" + name + ", age=" + age + "]";
}
}
package sk;
import java.util.HashSet;
public class HashSetDen02 {
public static void main(String[] args){
// 注意:如果是自定义类型的对象,保存到HashSet集合,必须要重写hashCode()和equals()方法
// 注意:如果想要保证元素存取顺序,可以使用LinkedHashSet集合LinkedHashSet<student> hs=new LinkedHashSet<>();
HashSet<student> hs=new HashSet<>();
student s1 =new student ("张三",23);
student s2 =new student ("张三",23);
student s3 =new student ("李四",24);
student s4 =new student ("王五",25);
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
for(student student:hs){
System.out.println(student);
}
}
}