Java基础十六

1 Set接口概述

  • 一个不包含重复元素的Collection。

2 HashSet类

2.1 HashSet类的概述

  • 它不保证Set的迭代顺序,特别是它不保证该顺序恒久不变。
  • 底层数据结构是哈希表。
  • 添加功能依赖于两个方法:
public int hashCode()
public boolean equals(Object obj)

2.2 HashSet的应用

  • 应用:
package com.xuweiwei;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * @author 许威威
 * @version 1.0
 */
public class SetDemo {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();

        set.add("hello");
        set.add("world");

        for(Iterator<String> iterator = set.iterator();iterator.hasNext();){
            String str = iterator.next();
            System.out.println("str = " + str);
        }

        System.out.println("------------------------");

        for (String s : set) {
            System.out.println("s = " + s);
        }

    }
}
  • 示例:
package com.xuweiwei;

import java.util.Objects;

/**
 * @author 许威威
 * @version 1.0
 */
public class Student {
    private String name;
    private Integer age;

    public Student() {
    }

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(name, student.name) &&
                Objects.equals(age, student.age);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Student{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ‘}‘;
    }
}
package com.xuweiwei;

import java.util.HashSet;
import java.util.Set;

/**
 * @author 许威威
 * @version 1.0
 */
public class SetDemo2 {
    public static void main(String[] args) {
        Set<Student> set = new HashSet<>();

        set.add(new Student("张三",20));
        set.add(new Student("李四",20));
        set.add(new Student("张三",20));
        set.add(new Student("李四",30));
        set.add(new Student("王五",20));
        set.add(new Student("王五",35));
        set.add(new Student("王五",25));

        for (Student student : set) {
            System.out.println("student = " + student);
        }

    }
}

3 LinkedHashSet类

3.1 LinkedHashSet类概述

  • 元素有序且唯一。
  • 由链表保证元素有序。
  • 由哈希表保证元素唯一。

3.2 LinkedHashSet的应用

  • 示例:
package com.xuweiwei;

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * @author 许威威
 * @version 1.0
 */
public class LinkedHashSetDemo {
    public static void main(String[] args) {
        Set<String> set = new LinkedHashSet<>();

        set.add("hello");
        set.add("world");
        set.add("java");
        set.add("hello");

        for (String s : set) {
            System.out.println("s = " + s);
        }

    }
}

4 TreeSet类

4.1 TreeSet类概述

  • 使用元素的自然顺序对元素进行排序(自然排序)。
  • 可以根据创建set时候提供的Comparator进行排序(比较器排序)。
  • 具体取决于使用的构造方法。

4.2 TreeSet是如何保证元素的排序和唯一性的

  • 底层数据结构是红黑树。

4.3 TreeSet的应用

  • 示例:自然排序
package com.xuweiwei;

import java.util.Set;
import java.util.TreeSet;

/**
 * @author 许威威
 * @version 1.0
 */
public class TreeSetDemo {
    public static void main(String[] args) {
        Set<Integer> set = new TreeSet<>();

        set.add(20);
        set.add(18);
        set.add(23);
        set.add(22);
        set.add(17);
        set.add(24);
        set.add(19);
        set.add(18);
        set.add(24);

        for (Integer i : set) {
            System.out.println("i = " + i);
        }

    }
}
  • 示例:TreeSet存储自定义对象并保证排序和唯一(自然排序)
package com.xuweiwei;

/**
 * @author 许威威
 * @version 1.0
 */
public class Student implements Comparable<Student> {
    private String name;
    private Integer age;

    public Student() {
    }

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public int compareTo(Student o) {
        int num = this.getAge() - o.getAge();
        return num == 0 ? this.getName().compareTo(o.getName()) : num;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ‘}‘;
    }
}
package com.xuweiwei;

import java.util.Set;
import java.util.TreeSet;

/**
 * @author 许威威
 * @version 1.0
 */
public class TreeSetDemo {
    public static void main(String[] args) {
        Set<Student> set = new TreeSet<>();

        set.add(new Student("张三",20));
        set.add(new Student("张三",30));
        set.add(new Student("李四",20));
        set.add(new Student("王五",90));
        set.add(new Student("赵六",7));
        set.add(new Student("田七",10));
        set.add(new Student("王八",35));

        for (Student student : set) {
            System.out.println("student = " + student);
        }

    }
}
  • 示例:比较器排序
package com.xuweiwei;

/**
 * @author 许威威
 * @version 1.0
 */
public class Student {
    private String name;
    private Integer age;

    public Student() {
    }

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ‘}‘;
    }
}
package com.xuweiwei;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

/**
 * @author 许威威
 * @version 1.0
 */
public class TreeSetDemo {
    public static void main(String[] args) {
        Set<Student> set = new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int num = o1.getAge() - o2.getAge();
                return num == 0 ? o1.getName().compareTo(o2.getName()) : num;
            }
        });

        set.add(new Student("张三", 20));
        set.add(new Student("张三", 30));
        set.add(new Student("李四", 20));
        set.add(new Student("王五", 90));
        set.add(new Student("赵六", 7));
        set.add(new Student("田七", 10));
        set.add(new Student("王八", 35));

        for (Student student : set) {
            System.out.println("student = " + student);
        }

    }
}

原文地址:https://www.cnblogs.com/xuweiweiwoaini/p/9350923.html

时间: 2024-08-28 16:53:23

Java基础十六的相关文章

Bootstrap&lt;基础十六&gt; 导航元素

Bootstrap 提供的用于定义导航元素的一些选项.它们使用相同的标记和基类 .nav.Bootstrap 也提供了一个用于共享标记和状态的帮助器类.改变修饰的 class,可以在不同的样式间进行切换. 表格导航或标签 创建一个标签式的导航菜单: 以一个带有 class .nav 的无序列表开始. 添加 class .nav-tabs. 下面的实例演示了这点: <!DOCTYPE html> <html> <head> <title>Bootstrap 实

“全栈2019”Java第十六章:下划线在数字中的意义

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第十六章:下划线在数字中的意义 下一章 "全栈2019"Java第十七章:赋值运算符和算术运算符 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组&q

“全栈2019”Java第九十六章:抽象局部内部类详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第九十六章:抽象局部内部类详解 下一章 "全栈2019"Java第九十七章:在方法中访问局部内部类成员详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学

Java基础十二--多态是成员的特点

Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println(f.num);//是父类,答案是3 2,成员函数(非静态). 编译看左边,运行看右边. 因为成员函数存在覆盖特性. Fu f = new Zi();//f.show();输出的是子类里面的show方法 3,静态函数. 编译和运行都看左边. 静态函数不具备多态性,多态性是对象的多态性,然后静态函数不涉

Java基础十--接口

Java基础十--接口 一.接口的定义和实例 1 /* 2 abstract class AbsDemo 3 { 4 abstract void show1(); 5 abstract void show2(); 6 } 7 8 当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用 9 另一种形式定义和表示,就是 接口 interface. 10 */ 11 12 //定义接口使用的关键字不是class,是interface. 13 //interface编译后还是.class文件,其实本质

java基础(六)

JAVA基础(六) 数组 数组是一组相关变量的集合. 数组是一组相关数据的集合,一组数据实际上就是一连串的的变量,数组按照使用可以分为一维数组.二维数组.多维数组. 数组能够进行一组数据的管理. 一维数组的定义:     类型 数组名[] = new 数组名[数组长度]; 一维数组的读取:    数组名[下标] = input.next(); 一个数组的最大索引号(下标)是它的元素个数(数组的长度)-1 获得数组长度:数组名.length 数组中每一个元素类型都是一样的 若要取出或写入数组中指定

Java基础复习(六)

1. 接口的实现类中的实现接口中的抽象方法的方法必须为public,为什么? 接口中所有的方法与变量都默认是 public 的,在接口中可以不写出来.但在实现类中,如果不明写的话,就变成了 friend  的了,也就是 “包访问权限”.而JAVA又规定,在实现接口或者覆写父类方法时,不能降低父类方法的访问权限,但是可以提高.也就是可以按照  friend protected public 来提高访问权限,但不能按照 public protected friend 来降低访问权限. 反证法: 接口

Java 基础(六)java JVM内存

Java虚拟机 java虚拟机是用执行java文件生成的class文件的,class文件即是字节码,jvm可以解释字节码成为目标机器的机器码,所以,java程序可以一次编译后到处运行真正的实现了跨平台的特性,在跨平台特性中jvm是关键. 包括我们自己建的类文件需要虚拟机来解释执行.当然了实现这一特性并不是一件简单的事情,jvm在这一过程中为我们做了很多事情,它也有自己的一套标准设计结构来适应不同程序运行状况. 了解了程序如何在虚拟机中运行就可以设计出更优秀的.性能更好的程序,对于了解虚拟机的运行

系统学习 Java IO (十六)----这么多类,应该用哪个?

目录:系统学习 Java IO---- 目录,概览 ### Java IO目的和功能 Java IO 包含 InputStream,OutputStream,Reader 和 Writer 类的许多子类. 原因是,所有这些子类都在解决各种不同的目的. 所涉及的目的总结如下: 网络访问 内部缓冲区访问 线程间通信(管道) 缓冲 过滤 解析 阅读和写作文本(Reader/Writer) 读写原始数据(long,int等) 读和写对象 Java IO类概述表 在讨论了 Java IO 类所针对的源,目