Java - 集合总结

1:登录注册案例(理解)

了解注册案例的编程框架,实现原理。

2:Set集合(理解)

(1) Set集合的特点
    无序,唯一
(2)HashSet集合(掌握)
    A:底层数据结构是哈希表(是一个元素为链表的数组)
    B:哈希表底层依赖两个方法:hashCode() 和 equals()
       执行顺序:
         首先比较哈希值是否相同
             相同:继续执行equals()方法
                返回true:元素重复了,不添加
                返回false:直接把元素添加到集合
             不同:就直接把元素添加到集合
    C:如何保证元素唯一性的呢?
         由hashCode()和equals()保证的
    D:开发的时候,代码非常的简单,自动生成即可。
    E:HashSet存储字符串并遍历
    F:HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)
(3)TreeSet集合
    A:底层数据结构是红黑树(是一个自平衡的二叉树)
    B:保证元素的排序方式
        a:自然排序(元素具备比较性)
            让元素所属的类实现Comparable接口
        b:比较器排序(集合具备比较性)
            让集合构造方法接收Comparator的实现类对象
    C:把我们练习过的代码再看一遍即可
(4)案例:

A:获取无重复的随机数

package cn.itcast_08;

import java.util.HashSet;
import java.util.Random;
/*
 * 编写一个程序,获取10个1至20的随机数,要求随机数不能重复。
 * 
 * 分析:
 *      A:创建随机数对象
 *      B:创建一个Set集合
 *      C:判断集合的长度是不是小于10
 *          是:就创建一个随机数添加
 *          否:不搭理它
 *      D:遍历Set集合
 */
public class HashSetDemo {
    public static void main(String[] args) {
        // 创建随机数对象
        Random r = new Random();
        // 创建一个Set集合
        HashSet<Integer> ts = new HashSet<Integer>();
        // 判断集合的长度是不是小于10
        while(ts.size() < 10) {
            int num = r.nextInt(20) + 1;
            ts.add(num);
        }
        // 遍历Set集合
        for (Integer i : ts) {
            System.out.println(i);
        }
    }
}
输出结果

17 

18 




12 
14 
15

B:键盘录入学生按照总分从高到低输出

// 创建的学生对象      
package cn.itcast_08;

public class Student {
    // 姓名
    private String name;
    // 语文成绩
    private int chinese;
    // 数学成绩
    private int math;
    // 英语成绩
    private int english;

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Student(String name, int chinese, int math, int english) {
        super();
        this.name = name;
        this.chinese = chinese;
        this.math = math;
        this.english = english;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getChinese() {
        return chinese;
    }
    public void setChinese(int chinese) {
        this.chinese = chinese;
    }
    public int getMath() {
        return math;
    }
    public void setMath(int math) {
        this.math = math;
    }
    public int getEnglish() {
        return english;
    }
    public void setEnglish(int english) {
        this.english = english;
    }
    public int getSum() {
        return this.chinese + this.math + this.english;
    }
}       
// 实现类
package cn.itcast_08;

import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;
/*
 * 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到底输出到控制台
 * 
 * 分析:
 *      A:定义学生类
 *      B:创建一个TreeSet集合
 *      C:总分从高到底如何实现呢?
 *      D:键盘录入5个学生信息
 *      E:遍历TreeSet集合
 * 
 */
public class TreeSetDemo {
    public static void main(String[] args) {
        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                // 总分从高到底
                int num = s2.getSum() - s1.getSum();
                // 总分相同的不一定语文相同
                int num2 = num == 0 ? s2.getChinese() - s1.getChinese() : num;
                // 总分相同的不一定数学相同
                int num3 = num2 == 0 ? s2.getMath() - s1.getMath() : num2;
                // 总分相同的不一定英语相同
                int num4 = num3 == 0 ? s2.getEnglish() - s1.getEnglish() : num3;
                // 姓名还不一定相同
                int num5 = num4 == 0 ? s2.getName().compareTo(s2.getName()) : num4;
                return num5;
            }
        });

        System.out.println("学生信息录入开始");
        // 键盘录入5个学生信息
        for (int x = 1; x <= 5; x++) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入第" + x + "个学生的姓名:");
            String name = sc.nextLine();
            System.out.println("请输入第" + x + "个学生的语文成绩:");
            String chineseString = sc.nextLine();
            System.out.println("请输入第" + x + "个学生的数学成绩:");
            String mathString = sc.nextLine();
            System.out.println("请输入第" + x + "个学生的英语成绩:");
            String englishString = sc.nextLine();

            // 把数据封装到学生对象
            Student s = new Student();
            s.setName(name);
            s.setChinese(Integer.parseInt(chineseString));
            s.setMath(Integer.parseInt(mathString));
            s.setEnglish(Integer.parseInt(englishString));

            // 把学生对象添加到集合
            ts.add(s);
        }
        System.out.println("学生信息录入完毕");

        System.out.println("学生信息从高到底排序如下:");
        System.out.println("姓名\t语文成绩\t数学成绩\t英语成绩");
        // 使用增强for遍历集合
        for (Student s : ts) {
            System.out.println(s.getName() + "\t" + s.getChinese() + "\t" + s.getMath() + "\t" + s.getEnglish());
        }
    }
}
输出结果:

学生信息录入开始 
请输入第1个学生的姓名: 
小明 
请输入第1个学生的语文成绩: 
80 
请输入第1个学生的数学成绩: 
90 
请输入第1个学生的英语成绩: 
85 
请输入第2个学生的姓名: 
小黄 
请输入第2个学生的语文成绩: 
85 
请输入第2个学生的数学成绩: 
88 
请输入第2个学生的英语成绩: 
90 
请输入第3个学生的姓名: 
小红 
请输入第3个学生的语文成绩: 
95 
请输入第3个学生的数学成绩: 
88 
请输入第3个学生的英语成绩: 
72 
请输入第4个学生的姓名: 
小灰 
请输入第4个学生的语文成绩: 
85 
请输入第4个学生的数学成绩: 
86 
请输入第4个学生的英语成绩: 
87 
请输入第5个学生的姓名: 
小蓝 
请输入第5个学生的语文成绩: 
96 
请输入第5个学生的数学成绩: 
98 
请输入第5个学生的英语成绩: 
94 
学生信息录入完毕 
学生信息从高到底排序如下: 
姓名 语文成绩 数学成绩 英语成绩 
小蓝 96 98 94 
小黄 85 88 90 
小灰 85 86 87 
小红 95 88 72 
小明 80 90 85

3:Collection集合总结(掌握)

Collection
    |--List 有序,可重复
        |--ArrayList
            底层数据结构是数组,查询快,增删慢。
            线程不安全,效率高
        |--Vector   
            底层数据结构是数组,查询快,增删慢。
            线程安全,效率低
        |--LinkedList
            底层数据结构是链表,查询慢,增删快。
            线程不安全,效率高
    |--Set 无序,唯一
        |--HashSet
            底层数据结构是哈希表。
            如何保证元素唯一性的呢?
                依赖两个方法:hashCode()和equals()
                开发中自动生成这两个方法即可
            |--LinkedHashSet
                底层数据结构是链表和哈希表
                由链表保证元素有序
                由哈希表保证元素唯一
        |--TreeSet
            底层数据结构是红黑树
            如何保证元素排序?
                自然排序
                比较器排序
            如何保证元素唯一性?
                根据比较的返回值是否为0来决定

4:针对Collection集合我们到底使用谁呢? (掌握)

唯一吗?
    是:Set
        排序吗?
            是:TreeSet
            否:HashSet
    如果你知道是Set,但是不知道是哪个Set,就用HashSet。
    否:List
        要安全吗?
            是:Vector
            否:ArrayList或者LinkedList
                查询多:ArrayList
                增删多:LinkedList
    如果你知道是List,但是不知道是哪个List,就用ArrayList。

如果你知道是Collection集合,但是不知道使用谁,就用ArrayList。
如果你知道用集合,就用ArrayList。

5:在集合中常见的数据结构(掌握)

ArrayXxx:底层数据结构是数组,查询快,增删慢
LinkedXxx:底层数据结构是链表,查询慢,增删快
HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

猜你喜欢

转载自blog.csdn.net/qq_40395278/article/details/80984144
今日推荐