目录
Set集合特点
不包含重复元素的集合
没有带索引的方法,所以不能使用普通for循环遍历
HashSet对集合的迭代顺序不做保证
- package zyy07;
-
- import java.util.HashSet;
- import java.util.Set;
-
- public class Demo {
- public static void main(String[] args) {
- //创建集合对象
- Set
s=new HashSet<>(); - //添加元素
- s.add("zyy");
- s.add("and");
- s.add("jw");
- s.add("zyy");
- for(String s1: s){
- System.out.println(s1);
- }
- }
- }
哈希值:是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
h=new HashSet<>(); - h.add("zyy");
- h.add("and");
- h.add("kiki");
- for(String s: h){
- System.out.println(s);
- }
- }
- }
重复元素不存储
需求:创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合
要求:学生对象的成员变量值相同,我们就认为是同一个对象
思路:
定义学生类
创建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
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());
- }
- }
- }
LinkedHashSet集合特点
哈希表和链表实现的Set接口,具有可预测的迭代次序
由链表保证元素有序,也就是说元素的存储和取出顺序是一致的由哈希表保证元素唯一,也就是说没有重复的元素
LinkedHashSet集合练习
存储字符串并遍历
- package zyy07;
-
- import java.util.LinkedHashSet;
-
- public class Demo {
- public static void main(String[] args) {
- //创建集合对象
- LinkedHashSet
h=new LinkedHashSet<>(); - //添加元素
- h.add("zyy");
- h.add("and");
- h.add("kiki");
- h.add("kiki");
- //遍历集合
- for(String s: h){
- System.out.println(s);
- }
- }
- }
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
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);
- }
- }
- }
存储学生对象并遍历,创建TreeSet集合使用无参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
结论
用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(To)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
学生类:
- package com.test;
-
- public class student implements Comparable
{ - //成员变量
- 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
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());
- }
- }
- }
存储学生对象并遍历,创建TreeSet集合使用带参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
结论
用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(To1To2)方法重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
学生类:
- package com.test;
-
- public class student implements Comparable
{ - //成员变量
- 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
a=new TreeSet(new Comparator() { - @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());
- }
- }
- }