目录
3. Set
3.1Set集合概述和特点
Set集合特点
不包含重复元素的集合
没有带索引的方法,所以不能使用普通for循环遍历HashSet对集合的迭代顺序不做保证
package zyy07;
import java.util.HashSet;
import java.util.Set;
public class Demo {
public static void main(String[] args) {
//创建集合对象
Set<String> s=new HashSet<>();
//添加元素
s.add("zyy");
s.add("and");
s.add("jw");
s.add("zyy");
for(String s1: s){
System.out.println(s1);
}
}
}
3.2 哈希值
哈希值:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
Object类中有一个方法可以获取对象的哈希值
public int hashCode():返回对象的哈希码值对象的哈希值特点
同一个对象多次调用hashCode)方法返回的哈希值是相同的
默认情况下,不同对象的哈希值是不同的。而重写hashCode0方法,可以实现让不同对象的哈希值相后
package zyy07;
import java.util.HashSet;
import java.util.Set;
public class Demo {
public static void main(String[] args) {
//创建集合对象
HashSet<String> h=new HashSet<>();
h.add("zyy");
h.add("and");
h.add("kiki");
for(String s: h){
System.out.println(s);
}
}
}
3.3常见数据结构之哈希表
重复元素不存储
案例:HashSet集合存储学生对象并遍历
需求:创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合
要求:学生对象的成员变量值相同,我们就认为是同一个对象思路:
定义学生类
创建HashSet集合对象创建学生对象
把学生添加到集合遍历集合(增强for)
在学生类中重写两个方法
hashCode()和equals()自动生成即可
学生类:
package com.test;
public class student {
//成员变量
private String name;
private int age;
//构造方法
public student(){
}
public student(String name,int age){
this.name=name;
this.age=age;
}
//成员方法
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
//为了保证元素的唯一性要重写equals和hashcode两个方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
student student = (student) o;
if (age != student.age) return false;
return name != null ? name.equals(student.name) : student.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
测试类:
package com.test;
import java.util.HashSet;
public class studentdemo {
public static void main(String[] args) {
//创建对象
HashSet<student> a=new HashSet<>();
//创建学生对象
student s1=new student("zyy",14);
student s2=new student("jwei",18);
student s3=new student("hwj",14);
student s4=new student("hwj",14);
//把学生添加到集合
a.add(s1);
a.add(s2);
a.add(s3);
a.add(s4);
//增强for
for(student s: a){
System.out.println(s.getName()+","+s.getAge());
}
}
}
3.4LinkedHashSet集合概述和特点
LinkedHashSet集合特点
哈希表和链表实现的Set接口,具有可预测的迭代次序
由链表保证元素有序,也就是说元素的存储和取出顺序是一致的由哈希表保证元素唯一,也就是说没有重复的元素
LinkedHashSet集合练习
存储字符串并遍历
package zyy07;
import java.util.LinkedHashSet;
public class Demo {
public static void main(String[] args) {
//创建集合对象
LinkedHashSet<String> h=new LinkedHashSet<>();
//添加元素
h.add("zyy");
h.add("and");
h.add("kiki");
h.add("kiki");
//遍历集合
for(String s: h){
System.out.println(s);
}
}
}
3.5TreeSet集合概述和特点
TreeSet集合特点
1、元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法
TreeSet):根据其元素的自然排序进行排序
TreeSet(Comparatorcomparator):根据指定的比较器进行排序2、 没有带索引的方法,所以不能使用普通for循环谝历
3、由于是Set集合,所以不包含重复元素的集合
TreeSet集合练习
存储整数并遍历
package zyy07;
import java.util.TreeSet;
public class Demo {
public static void main(String[] args) {
//创建集合对象
TreeSet<Integer> h=new TreeSet<>();
//添加元素
h.add(12);
h.add(11);
h.add(16);
h.add(14);
h.add(14);
//遍历集合
for(Integer s: h){
System.out.println(s);
}
}
}
3.6自然排序Comparable的使用
存储学生对象并遍历,创建TreeSet集合使用无参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序结论
用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(To)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
学生类:
package com.test;
public class student implements Comparable<student> {
//成员变量
private String name;
private int age;
//构造方法
public student(){
}
public student(String name,int age){
this.name=name;
this.age=age;
}
//成员方法
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
@Override
public int compareTo(student o) {
//return 0;返回0认为相同元素,所以不添加
//return 1;返回正数按升序存储
//return -1;返回复数按降序存储
int num= this.age-o.age;//升序
//int num1=o.age-this.age;//降序
int num2=num==0?this.name.compareTo(o.name):num;
return num2;
}
}
测试类:
package com.test;
import java.util.TreeSet;
public class studentdemo {
public static void main(String[] args) {
//创建对象
TreeSet<student> a=new TreeSet<>();
//创建学生对象
student s1=new student("zyy",14);
student s2=new student("jwei",18);
student s3=new student("hwj",13);
student s4=new student("kiki",12);
//把学生添加到集合
a.add(s1);
a.add(s2);
a.add(s3);
a.add(s4);
//增强for
for(student s: a){
System.out.println(s.getName()+","+s.getAge());
}
}
}
3.7比较器排序Comparator的使用
存储学生对象并遍历,创建TreeSet集合使用带参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序结论
用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(To1To2)方法重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
学生类:
package com.test;
public class student implements Comparable<student> {
//成员变量
private String name;
private int age;
//构造方法
public student(){
}
public student(String name,int age){
this.name=name;
this.age=age;
}
//成员方法
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
@Override
public int compareTo(student o) {
//return 0;返回0认为相同元素,所以不添加
//return 1;返回正数按升序存储
//return -1;返回复数按降序存储
int num= this.age-o.age;//升序
//int num1=o.age-this.age;//降序
int num2=num==0?this.name.compareTo(o.name):num;
return num2;
}
}
测试类:
package com.test;
import java.util.Comparator;
import java.util.TreeSet;
public class studentdemo {
public static void main(String[] args) {
//创建对象
TreeSet<student> a=new TreeSet<student>(new Comparator<student>() {
@Override
public int compare(student o1, student o2) {
int num=o1.getAge()-o2.getAge();
int num2=num==0?o1.getName().compareTo(o2.getName()):num;
return num2;
}
});
//创建学生对象
student s1=new student("zyy",14);
student s2=new student("jwei",18);
student s3=new student("hwj",13);
student s4=new student("kiki",12);
//把学生添加到集合
a.add(s1);
a.add(s2);
a.add(s3);
a.add(s4);
//增强for
for(student s: a){
System.out.println(s.getName()+","+s.getAge());
}
}
}