• Java----HashSet集合、equals(判断两个字符串是否相等)、LinkedHashSet集合、迭代器、可变参数


    1.HashSet 集合

            java.util.HashSet 是 Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。I

            HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。

            保证元素唯一性的方式依赖于: hashCode与equals方法。

            例子: 

    1. import java.awt.print.PrinterGraphics;
    2. import java.util.*;
    3. public class Test {
    4. public static void main(String[] args) {
    5. Set a = new HashSet<>();
    6. a.add("aaa");
    7. a.add("bbb");
    8. a.add("aaa");
    9. System.out.println(a);
    10. HashSet integers = new HashSet<>();
    11. //Integer 是int的封装类,Integer类型是表示集合里面的内容都是Int类型的
    12. integers.add(10);
    13. integers.add(20);
    14. integers.add(10);
    15. System.out.println(integers);
    16. //集合中的内容不重复
    17. }
    18. }

            创建一个student类型的HashSet对象,并输出集合中的内容,此时会输出Hash地址,若想输出实际内容,可以重新定义toString方法。

    如果存在重复的元素,则重写equals和hashCode方法

    1. import java.awt.print.PrinterGraphics;
    2. import java.util.*;
    3. public class Test {
    4. public static void main(String[] args) {
    5. Set students = new HashSet<>();
    6. Student s1 = new Student("刘备",50);
    7. students.add(s1);
    8. students.add(new Student("关羽",48));
    9. System.out.println(students);
    10. }
    11. }
    1. import java.util.Objects;
    2. public class Student {
    3. private String name;
    4. private int age;
    5. //重写toString方法
    6. @Override
    7. public String toString() {
    8. return "Student{" +
    9. "name='" + name + '\'' +
    10. ", age=" + age +
    11. '}';
    12. }
    13. //重写equals(用来比较和判断重复的)和HashCode方法(这个方法是返回哈希地址)
    14. @Override
    15. public boolean equals(Object o) {
    16. if (this == o) return true;
    17. if (o == null || getClass() != o.getClass()) return false;
    18. Student student = (Student) o;
    19. return age == student.age && Objects.equals(name, student.name);
    20. }
    21. @Override
    22. public int hashCode() {
    23. return Objects.hash(name, age);
    24. }
    25. //空构造
    26. public Student() {
    27. }
    28. //满构造
    29. public Student(String name, int age) {
    30. this.name = name;
    31. this.age = age;
    32. }
    33. //get和set方法
    34. public String getName() {
    35. return name;
    36. }
    37. public void setName(String name) {
    38. this.name = name;
    39. }
    40. public int getAge() {
    41. return age;
    42. }
    43. public void setAge(int age) {
    44. this.age = age;
    45. }
    46. }

    字符串对象.equals(另一个字符串对象):

            判断两个对象是否相等,继承于Object类

    2.LinkedHashSet集合

            HashSet保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,需要使用它的一个子类LinkedHashSet,它是链表和哈希表组合的一个数据存储结构。 (保证集合元素唯一,谁在前面,谁输出就在前面)

    1. import java.awt.print.PrinterGraphics;
    2. import java.util.*;
    3. public class Test {
    4. public static void main(String[] args) {
    5. LinkedHashSet stringss = new LinkedHashSet();
    6. stringss.add("a");
    7. stringss.add("b");
    8. stringss.add("a");
    9. System.out.println(stringss);
    10. }
    11. }

    练习:

            判断给定元素在集合中出现的次数

    1. import java.util.ArrayList;
    2. import java.util.Collection;
    3. import java.util.HashSet;
    4. import java.util.Set;
    5. public class Test {
    6. public static void main(String[] args) {
    7. ArrayList strings = new ArrayList<>
    8. ();
    9. strings.add("a");
    10. strings.add("a");
    11. strings.add("b");
    12. strings.add("b");
    13. strings.add("c");
    14. System.out.println("a:" +
    15. listTest(strings,"a"));
    16. System.out.println("b:" +
    17. listTest(strings,"b"));
    18. System.out.println("c:" +
    19. listTest(strings,"c"));
    20. }
    21. public static int listTest(ArrayList strings, String c) {
    22. //形参列表 形参类型 形参名,形参类型,形参名
    23. //ArrayList代表一个全是String类型的列表类型
    24. int count = 0;
    25. for (String s : strings) {
    26. if(s.equals(c)) {
    27. count++;
    28. }
    29. }
    30. return count;
    31. }
    32. }

    三.迭代器

            在程序开发中,经常需要遍历集合中的所有元素。针对这种需求, JDK专门提供了一个接口 java.util.lterator。lterator 接口也是Java集合中的一员,但它与Collection 、Map 接口有所不同,
            Collection 接口与 Map 接口主要用于存储元素,而 Iterator 主要用于迭代访问(即遍历)Collection 中的元素,因此 lterator 对象也被称为迭代器。
    每一个集合都实现了迭代器接口,那么使用迭代器遍历集合的方法为:

            。 创建集合对应的迭代器

            public lterator iterator():获取集合对应的迭代器,用来遍历集合中的元素的。

    创建公式:

            Iterator 迭代器名 = 对象列表.iterator();

    注意:set是没有序的,所以没有get方法,可以使用foreach和迭代器来访问内部元素

    1. import java.util.*;
    2. public class Test {
    3. public static void main(String[] args) {
    4. Collection strings = new ArrayList<>();
    5. strings.add("a");
    6. strings.add("a");
    7. strings.add("b");
    8. strings.add("c");
    9. System.out.println(strings);
    10. Iterator it = strings.iterator();//创建集合迭代器
    11. Set set = new HashSet<>();//创建一个set集合的迭代器
    12. set.add(10);//添加元素
    13. set.add(20);
    14. Iterator it1 = set.iterator();
    15. while(it.hasNext()){//判断是否有下一个元素
    16. System.out.println(it.next());//输出strings集合的元素
    17. System.out.println(it1.next());
    18. }
    19. }
    20. }

    四.可变参数

            如果我们定义一个方法需要接受多个参数,并且多个参数类型-致,我们可以对其简化成如下格式:

            修饰符 返回值类型 方法名(参数类型... 形参名){ }

            …. 用在参数上,称之为可变参数

    此时调用printMassage可以直接输出数值,及同等类型的数组(把你传的参数(无论是不是数组)变成数组一个一个的输出)

    这样就很方便,不需要把所传参数和函数接收参数的类型对应,将参数传到函数后可做出相应操作。

    1. import java.util.*;
    2. public class Test {
    3. public static void main(String[] args) {
    4. int a = 10;
    5. int b = 20;
    6. printMessage(a,b);
    7. int[] arr = {1,2,3};
    8. printMessage(arr);
    9. }
    10. private static void printMessage(int... num) {
    11. for(int t:num)
    12. System.out.println(t);
    13. }
    14. }

    泛型

            我们在定义集合时,实际上时可以放任意对象的,这是因为集合不身存放的是Object类型,由于任意对象都是Object对象的子类,用以程序不会报错。

            泛型的好处:泛型一旦规定了泛型的类型,就只能存规定的类型

    1. import java.io.*;
    2. import java.util.ArrayList;
    3. import java.util.Collection;
    4. import java.util.Iterator;
    5. public class Test {
    6. public static void main(String[] args) throws IOException {
    7. Collection a=new ArrayList();
    8. a.add(10);
    9. a.add("abc");
    10. Iterator iterator = a.iterator();
    11. while(iterator.hasNext())
    12. System.out.println(iterator.next());
    13. }
    14. }

            但是当我们在取出每一个对象,并且对每个对象进行相应的操作,这时必须采用类型转换。这是因为尽管Collection存储任意对象,但实际上通常Collection只存储同一类型对象。因此在IDK5之后,新增了泛型(Generic)语法,让你在设计API时可以指定类或方法支持泛型,这样我们使用API的时候也变得更为简洁。 

            自定义泛型的定义和使用

                    在定义泛型时,可以自己定义泛型的名字

    1. public class MyGenericclass{
    2. //没有MVP类型,在这里代表未知的一种数据类型 未来传递什么就是什么类型
    3. private MVP mvp;
    4. public void setMVP(MVP mvp){
    5. this.mvp = mvp;
    6. }
    7. public MVP getMVP(){
    8. return mvp;
    9. }
    10. }
  • 相关阅读:
    App测试中ios和Android的区别
    如何制作传统节日网站(纯HTML代码)
    2024年1月京东洗衣机行业数据分析:TOP10品牌销量销额排行榜
    一款集成了主流大语言模型以及绘图模型的 APP, 采用 Flutter 开发,代码完全开源!!
    MySQL表的增删查改(CRUD)
    qizhidao参数分析
    深入浅出Seata的AT模式
    JWT详细介绍
    【网络篇】第四篇——网络字节序
    基于nodejs+vue教学辅助管理系统
  • 原文地址:https://blog.csdn.net/m0_56501550/article/details/128038583