今日内容

1.Set集合概述

  • Set特点:

    • 案例演示: 无序(存储和取出的顺序)和唯一
public class Test {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("aaaa");set.add("张三");set.add("张三");set.add("aaaa");set.add("王五");set.add("赵六");set.add("王五");set.add("赵六");for (String s : set) {System.out.println(s);}}
}

2.HashSet

  • HashSet存储字符串并遍历

    案例演示: HashSet存储字符串并遍历

public class Test {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");list.add("aaaa");list.add("cccc");list.add("dddd");list.add("aaaa");/*  HashSet(Collection < ? extends E > c)*/// 构造一个包含指定 collection 中的元素的新 set。HashSet<String> set = new HashSet<>(list);System.out.println(set);}
}
  • HashSet保证元素唯一性

    HashSet 底层数据结构是哈希表. HashSet 不是线程安全的 集合元素可以是 null

  • 哈希表:是一个元素为链表的数组,综合了数组和链表的优点 (像新华字典一样) (JDK1.7之前)

    • 当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,

    • 根据 hashCode 值决定该对象在 HashSet 中的存储位置

    • HashSet 集合判断两个元素相等的标准:
      两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。

    • 重写了hashCode()和equals()方法来保证的,如果不重写则无法保证。

       @Overridepublic int hashCode() {// return 0;// 因为成员变量值影响了哈希值,所以我们把成员变量值相加即可// return this.name.hashCode() + this.age;// 看下面//s1:name.hashCode()=40,age=30//s2:name.hashCode()=20,age=50//尽可能的区分,我们可以把它们随变乘以一些整数return this.name.hashCode() + this.age * 15;}
      
  • HashSet遍历练习

    HashSet存储自定义对象并遍历练习

//测试类
public class MyTest4 {public static void main(String[] args) {HashSet<Student> set = new HashSet<>();Student s1 = new Student("张三", 23);int i = hash2(s1);System.out.println(i);set.add(s1);set.add(s1);set.add(new Student("张三", 23));set.add(new Student("李四", 24));set.add(new Student("李四", 24));set.add(new Student("王五", 25));set.add(new Student("王五", 25));set.add(new Student("赵六", 26));set.add(new Student("赵六", 26));for (Student student : set) {System.out.println(student.getName() + "===" + student.getAge());}}//学生类
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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}

3.LinkedHashSet的概述

  • LinkedHashSet的概述: 底层数据结构是链表和哈希表,元素有序 , 并且唯一。

  • 案例演示

public class MyTest {public static void main(String[] args) {LinkedHashSet<Integer> linkedList = new LinkedHashSet<>();linkedList.add(1);linkedList.add(2);linkedList.add(3);linkedList.add(4);linkedList.add(1);linkedList.add(2);linkedList.add(3);linkedList.add(4);for (Integer integer : linkedList) {System.out.println(integer);}ArrayList<String> list = new ArrayList<>();list.add("aaaa");list.add("bbb");list.add("aaaa");list.add("cccc");list.add("dddd");list.add("aaaa");LinkedHashSet<String> strings = new LinkedHashSet<>(list);System.out.println(strings);}
}

4.TreeSet存储Integer类型的元素并遍历

  • TreeSet集合的特点: 元素唯一,并且可以对元素进行排序
    排序:
  • ​ 自然排序
  • ​ 使用比较器排序
    ​ 到底使用的是哪一种的排序取决于,构造方法.
  • 案例演示: TreeSet存储Integer类型的元素并遍历
    存储下列元素: 20 , 18 , 23 , 22 , 17 , 24, 19 , 18 , 24
public class MyTest {public static void main(String[] args) {TreeSet<Integer> treeSet = new TreeSet<>();treeSet.add(20);treeSet.add(18);treeSet.add(23);treeSet.add(22);treeSet.add(17);treeSet.add(24);treeSet.add(19);treeSet.add(18);treeSet.add(24);System.out.println(treeSet);}
}

注意:
(1)使用TreeSet集合进行元素的自然排序,那么对元素有要求,要求这个元素
(2)必须实现Comparable接口 否则无法进行自然排序
(3)保证元素的唯一性是靠compareTo方法的返回值来确定如果返回0 表示两个元素相等,则不重复存储

5.TreeSet保证元素唯一和自然排序的原理和图解

练习1:TreeSet存储自定义对象并遍历

​ 注意自然排序 此对象 必须实现Comparable接口 否则报错

//学生类
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 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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}//比较元素大小的方法@Overridepublic int compareTo(Student obj) {//System.out.println("compareTo 方法调用了" + obj);//要求按照年龄大小来排序//如果年龄一样,不能说明是同一个对象,还得比较一下,姓名是否一样。int i = this.age - obj.age;/*  if (this.name.equals(obj.name) && i == 0) {return 0;}if (!this.name.equals(obj.name) && i == 0) {return -1;}*///如果年龄一样,不能说明是同一个对象,还得比较一下,姓名是否一样。int num = i == 0 ? this.name.compareTo(obj.name) : i;return num; //正 负  0}
}//测试类
public class Test {public static void main(String[] args) {TreeSet<Student> set = new TreeSet<>();set.add(new Student("张三55555", 23));set.add(new Student("王菲444", 23));set.add(new Student("李四8888888888888888888", 20));set.add(new Student("钟楚红", 18));set.add(new Student("张曼玉444", 25));set.add(new Student("王祖贤7777", 36));set.add(new Student("刘德华", 26));set.add(new Student("赵六", 27));for (Student student : set) {System.out.println(student.getName() + "===" + student.getAge());}

练习2:TreeSet保证元素唯一和比较器排序的原理及代码实现

//学生类
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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}//测试类
public class Test {public static void main(String[] args) {// TreeSet()// 构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。// TreeSet(Comparator < ? super E > comparator)// 构造一个新的空 TreeSet,它根据指定比较器进行排序。/*   Comparator 比较器强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。//Comparator*/MyComparator myComparator = new MyComparator();TreeSet<Student> set = new TreeSet<>(myComparator);set.add(new Student("张三55555", 23));set.add(new Student("王菲444", 23));set.add(new Student("李四8888888888888888888", 20));set.add(new Student("钟楚红", 18));set.add(new Student("张曼玉444", 25));set.add(new Student("王祖贤7777", 36));set.add(new Student("刘德华", 26));set.add(new Student("赵六", 27));set.add(new Student("赵六", 26));set.add(new Student("赵六", 26));set.add(new Student("老王", 27));for (Student student : set) {System.out.println(student.getName() + "===" + student.getAge());}}
}

练习1:产生10个1-20之间的随机数要求随机数不能重复

  • 需求:编写一个程序,获取10个1至20的随机数,要求随机数不能重复。
    并把最终的随机数输出到控制台。
    选HashSet 可以不重复
    选TreeSet 不重复还可以排序

  • 分析:
    a: 定义一个HashSet集合
    b: 产生随机数,把随机数添加到集合中
    c: 判断集合的长度,使用while循环实现

public class Test {public static void main(String[] args) {//1,有Random类创建随机数对象Random r = new Random();//2,需要存储10个随机数,而且不能重复,所以我们用HashSet集合HashSet<Integer> hs = new HashSet<>();//3,如果HashSet的size是小于10就可以不断的存储,如果大于等于10就停止存储while(hs.size() < 10) {//4,通过Random类中的nextInt(n)方法获取1到20之间的随机数,并将这些随机数存储在HashSet集合中hs.add(r.nextInt(20) + 1);}// 5,遍历HashSetfor (Integer integer : hs) {System.out.println(integer);}}
}

键盘录入学生信息按照总分排序后输出在控制台

  • 需求:键盘录入3个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。
    /**
    * 步骤:
    * a: 自定义一个学生类
    * b: 创建一个TreeSet集合对象(使用比较器进行排序)
    * c: 键盘录入学生的数据,然后把学生的数据封装成一个学生对象,把学生对象添加到集合中
    * d: 遍历集合
    */
//学生类
public class Student implements Comparable {private String name;private int chinesePerformance;private int mathPerformance;private int englishResults;private int zongfen;public int getZongfen() {return zongfen;}public void setZongfen(int zongfen) {this.zongfen = zongfen;}public Student() {}public Student(String name, int chinesePerformance, int mathPerformance, int englishResults, int zongfen) {this.name = name;this.chinesePerformance = chinesePerformance;this.mathPerformance = mathPerformance;this.englishResults = englishResults;this.zongfen = zongfen;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getChinesePerformance() {return chinesePerformance;}public void setChinesePerformance(int chinesePerformance) {this.chinesePerformance = chinesePerformance;}public int getMathPerformance() {return mathPerformance;}public void setMathPerformance(int mathPerformance) {this.mathPerformance = mathPerformance;}public int getEnglishResults() {return englishResults;}public void setEnglishResults(int englishResults) {this.englishResults = englishResults;}@Overridepublic String toString() {return name + "\t" +chinesePerformance + "\t" +mathPerformance + "\t" ++englishResults + "\t" ++zongfen;}@Overridepublic int compareTo(Object o) {Student s = (Student) o;int num = this.getZongfen() > s.getZongfen() ? -1 : 1;return num;}
}
//测试类
public class Test {public static void main(String[] args) {TreeSet<Student> set = new TreeSet<>();for (int i = 0; i < 3; i++) {Student s = new Student();System.out.println("请输入第"+(i+1)+"个学生姓名:");Scanner sc1 = new Scanner(System.in);String s1 = sc1.nextLine();s.setName(s1);System.out.println("请输入"+s.getName()+"的语文成绩:");Scanner sc2 = new Scanner(System.in);int i1 = sc2.nextInt();s.setChinesePerformance(i1);System.out.println("请输入"+s.getName()+"的数学成绩:");Scanner sc3 = new Scanner(System.in);int i2 = sc3.nextInt();s.setMathPerformance(i2);System.out.println("请输入第"+s.getName()+"的英语成绩:");Scanner sc4 = new Scanner(System.in);int i3 = sc4.nextInt();s.setEnglishResults(i3);s.setZongfen(s.getChinesePerformance()+s.getEnglishResults()+s.getMathPerformance());set.add(s);}System.out.println("姓名"+"\t"+"语文"+"\t"+"数学"+"\t"+"英语"+"\t"+"总分");for (Student student : set) {System.out.println(student);}}
}

JAVA SE之面向对象12:集合3(Set)相关推荐

  1. java se系列(十二)集合

    1.集合 1.1.什么是集合 存储对象的容器,面向对象语言对事物的体现,都是以对象的形式来体现的,所以为了方便对多个对象的操作,存储对象,集合是存储对象最常用的一种方式.集合的出现就是为了持有对象.集 ...

  2. 【java学习之路】(java SE篇)008.集合

    集合 什么情况使用集合框架? ​ 如果不知道程序运行时需要多少对象,或者需要更复杂的方式存储对象 比较重要的 学习路线 Collection类 import java.util.ArrayList; ...

  3. java SE(七)——集合

    集合 常见数据结构 数据结构概述 栈 队列 数组 链表 二叉树 二叉查找树 平衡二叉树 红黑树 数据结构小结 集合概述 集合体系结构 Collection集合体系(单列) Collection集合体系 ...

  4. JAVA语言基础-面向对象(集合框架02List、泛型)

    2019独角兽企业重金招聘Python工程师标准>>> 16.01_集合框架(去除ArrayList中重复字符串元素方式)(掌握) A:案例演示 需求:ArrayList去除集合中字 ...

  5. JAVA SE 学习day_10:集合、聊天室练习最终版

    一.集合 集合框架 java.util.Collection接口:该接口是所有集合的顶级接口,规定了所有集合都应当具备的 功能方法 * Collection下面又分为不同的集合类型,常见的有两个: j ...

  6. JAVA SE之面向对象9:正则表达式以及一些常用类

    今日学习: 正则表达式 Pattern和Matcher类 Math类 Random类 System类 BigDecimal类 Date类 SimpleDateFormat类 Calendar类 正则表 ...

  7. 【Java SE】面向对象三大特性之多态

    何为多态? 多态,通俗一点说就是在完成某一个行为的时候,不同的对象会产生不同的形态. 比如说:打印机在完成打印行为的时候,可以根据不同的对象打印不同的类型,有黑白,有彩色等等,打印的结果是不一样的. ...

  8. Java SE 基础知识

    Java SE 基础知识 1 2 @(Notes)[J2SE, Notes] VICTORY LOVES PREPARATION. 特别说明: 该文档在马克飞象查阅最佳: 本部分知识还在迭代中,欢迎补 ...

  9. 面试必会系列 - 1.1 Java SE 基础

    本文已收录至 github,完整图文:https://github.com/HanquanHq/MD-Notes Java SE 基础 面向对象 Java 按值调用还是引用调用? 按值调用指方法接收调 ...

最新文章

  1. 理解 IntelliJ IDEA 的项目配置和Web部署
  2. SAP RETAIL MM41 创建的商品主数据里为啥会有Vendor Char.按钮?
  3. 知物由学 | 未来安全隐患:AI的软肋——故意欺骗神经网络
  4. php中数组生成下拉选项,php利用数组填充下拉列表框
  5. NSMutableDictionary中 setValue和setObject的区别
  6. 第五十九期:如何在Windows 10中执行Windows Defender离线扫描?
  7. 计算机网络中的高层应用,第四章计算机网络中的高层应用-.ppt
  8. java search 不能使用方法_java – 无法使用TERMS QUERY从ELASTIC SEARCH查询字母数字字段...
  9. python 京东签到在哪里_python 使用selenium登陆京东签到哪京豆
  10. quartus仿真17:T触发器的时序逻辑电路
  11. HNOI2002(伸展树)
  12. C++ Primer 5th Edition(英文版)kindle.mobi
  13. 【开源】DA14580-中断实验教程——疯壳·ARM双处理器开发板系列
  14. vi编辑器的使用   快捷键
  15. Material Design系列,自定义Behavior实现Android知乎首页
  16. 三个数中寻找最大值的5种方法-C语言实现
  17. Daily Growing 的歌词
  18. 没有大招的火山引擎,拿下70%大模型玩家
  19. AMBA总线协议的学习-AHB,ASB,APB三种总线以及AXI接口
  20. DehazeNet: An End-to-End System for Single ImageHaze Removal(图像去雾2016)

热门文章

  1. MDK keil 图标显示异常的解决办法
  2. 代码分享-SQLServer设置表或者列的说明
  3. 快手公布于香港联交所主板上市计划详情;木莲庄酒管全线开放加盟合作 | 美通企业日报...
  4. 安装配置webpack webpack不是内部或外部命令
  5. MyBatis框架的优缺点及其适用场合
  6. web前端就业怎么样
  7. DAS、SAN、NAS三种存储方式的概念及应用
  8. 总结我的验证思路:怎样追波形
  9. Qt线程错误记录registered using qRegisterMetaType()
  10. Java程序优雅关闭的两种方法(程序停止前做一些善后工作)