java集合如Map、Set、List等所有集合只能存放引用类型数据,它们都是存放引用类型数据的容器,不能存放如int、long、float、double等基础类型的数据
Set集合
set集合是Collection集合的子接口的一种
特点:
不包含重复元素
没有索引,不能使用for循环遍历
HashSet方法,对集合的迭代顺序不作任何保证;
哈希值
就JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
获取对象的哈希值:object.hashCode()
特点:
同一个对象多次调用的哈希值是一样的;
默认情况下,不同对象的哈希值的不一样的;
通过方法重写,可以实现不同对象的哈希值是相同的;
HashSet集合特点
底层数据结构是哈希表,保证集合元素的唯一性
对数据的迭代顺序没有任何保证
没有带索引的方法,不能使用普通for方法遍历
由于是Set集合,所以是不包含重复数据的集合
常见数据结构哈希表
哈希表用 数组+链表 实现,是一个元素的链表;
运用哈希结构实现set数组的唯一性
需要在数据表中重写equals和hashcode方法;
在Generate中可以直接选择重写;
贴一下重写的实例:
构造学生类对象:
package hashset;
import java.util.Objects;
public class student {
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 //此处重写了equals方法
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
student student = (student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override //此处重写了hashCode方法
public int hashCode() {
return Objects.hash(name, age);
}
}
建hashset表,并遍历
package hashset;
import java.util.HashSet;
public class hashsetdemo {
public static void main(String[] args) {
HashSet<student> ha = new HashSet<student>();
student s1 = new student("haha",12);
student s2 = new student("haaa",122);
student s3 = new student("haaa",122);
ha.add(s1);
ha.add(s2);
ha.add(s3);
for(student hh:ha) {
System.out.println(hh.getName()+" "+hh.getAge());
}
}
}
LinkedHashSet集合特点
哈希表和链表实现的Set接口,具有可预测的迭代次序。
由链表保持数组的顺序,用hashset保持数组的唯一
该实现与HashSet不同之处在于它保持双向链接列表的所有条目。
TreeSet集合
特点:元素有序,具体的排序方式取决于构造方法
无参构造方法:TreeSet()使用自然排序,就是让所属的类实现
带参构造方法:Comparator接口,就是让集合构造方法接收Comparator 的实现类对象,重写(Compare(To1,To2)方法;
扫描二维码关注公众号,回复:
16185610 查看本文章
代码实例,先按年龄排序,后按姓名排序:
package treeset;
import java.util.Comparator;
import java.util.TreeSet;
public class treeset {
public static void main(String[] args) {
TreeSet<student> tr = new TreeSet<student>(new Comparator<student>() {
@Override
public int compare(student s1, student s2) {
int num = s1.getAge() - s2.getAge();
int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
return num2;
}
});
student s1 = new student("zzha",23);
student s2 = new student("asds",23);
tr.add(s1);
tr.add(s2);
for(student s: tr){
System.out.println(s.getName()+" "+s.getAge());
}
}
}