(day11) 自学Java——集合进阶(单列集合)

目录

1.集合体系结构

2.Collection集合

(1)迭代器

(2)增强for

(3)lambda表达式

3.List集合

4.数据结构

5.ArrayList集合

6.LinkedList集合

7.泛型深入

8.数据结构(树)

(1)二叉树

(2)平衡二叉树旋转机制

(3)红黑树

9.Set系列集合

(1) HashSet

(2)LinkedHashSet

(3)TreeSet


非原创,为方便后期复习

1.集合体系结构

2.Collection集合

1. List系列集合:添加的元素是有序、可重复、有索引

(有序:“存”和“取”的顺序一样)

2. Set系列集合:添加的元素是无序、不重复、无索引

(1)迭代器

(2)增强for

(3)lambda表达式

3.List集合

4.数据结构

什么是数据结构?

计算机存储、组织数据的方式。

 

 

5.ArrayList集合

6.LinkedList集合

添加“aaa”,在LinkedList里的尾节点是null,所以l=last=null,尾结点last=newNode=0x0011,因为l==null,所以头结点为first=0x0011。

添加“bbb”,l=last=0x0011,尾结点last=newNode=0x0022,不满足l==null,所以l.next=newNode(就是0x0011.next=0x0022)

添加“ccc”,l=last=0x0022,尾结点last=newNode=0x0033,不满足l==null,所以l.next=newNode(就是0x0022.next=0x0033)

 迭代器底层原理

7.泛型深入

 

1.泛型中不能写基本数据类型,因为数据在存入之后会变成Object类型,int无法转Object类型,要写成Integer包装类才可以转Object。

2.存入数据的时候,会检查数据类型,数据进入后会转成Object类型,取出时又强转回一开始的数据类型。

3.指定泛型类型后,可以传入该类类型或者子类类型。比如Animal类型,还可以传cat,dog类型。

4.如果不写泛型,就默认为Object类型。

泛型方法:1.在类名后面定义泛型(所有方法都能用)

                 2.在方法后面定义泛型(只有本方法能用)

 练习:定义一个工具类:ListUtil,类中定义一个静态方法addAll,用来添加多个集合的元素

方式1:public class MyArrayList1 implements List<String>{}  类型可替换

方式2:public class MyArrayList2<E> implements List<E>{}

8.数据结构(树)

(1)二叉树

 

1.普通二叉树,没有规律,只能遍历查找,麻烦。

2.二叉查找树,方便,查找方法,拿数据跟根节点比较,比根节点小/大,就跟左/右子节点比较......

 

度<=2就是二叉树

普通二叉树,查找效率低,只能遍历。

二叉查找树,效率提升,但是存储时可能会造成左右子树的高度差很大,查询效率也降低。

平衡二叉树,任意节点子树的高度差不能超过1。

(2)平衡二叉树旋转机制

 

 

 

平衡二叉树缺点:添加节点时,旋转次数太多,导致添加节点时间浪费。

(3)红黑树

 

添加节点默认红色,效率更高

9.Set系列集合

 

(1) HashSet

1.加载因子0.75,就是扩容,比如数组长度为16,16*0.75=12,12个位置都存满了就扩容,

  扩大2倍,16*2 =32

2.

重写是为了使用属性值进行计算,或者比较是否相等。不重写,就是用地址值计算,或比较

(用hashcode获得哈希值,哈希值确定数据存储在数组中的位置,用equals比较数据内部属性值是否相同)

hashset中存储自定义对象,一定要重写hashcade和equals

创建集合,需要去重,用hashset,不需要就用ArrayList

练习:创建一个存储学生对象的集合,存储多个学生对象,遍历该集合。

        要求:学生对象的成员变量值相同,我们就认为是同一个对象。

import java.util.HashSet;

public class Test {
    public static void main(String[] args){
        Student s1=new Student("zhangsan",20);
        Student s2=new Student("lisi",23);
        Student s3=new Student("zhaowu",21);
        Student s4=new Student("zhaowu",21);
        HashSet<Student> hs=new HashSet<>();
        System.out.println(hs.add(s1));
        System.out.println(hs.add(s2));
        System.out.println(hs.add(s3));
        System.out.println(hs.add(s4));
        System.out.println(hs);
    }
}

(2)LinkedHashSet

(3)TreeSet

 练习:存储整数并进行排序

import java.util.Iterator;
import java.util.TreeSet;

public class Test {
    public static void main(String[] args){
        TreeSet<Integer> ts=new TreeSet<>();
        ts.add(5);
        ts.add(1);
        ts.add(3);
        ts.add(2);
        ts.add(4);
        System.out.println(ts); //结果:[1, 2, 3, 4, 5]
        //迭代器
        Iterator it=ts.iterator();
        while (it.hasNext()){
            Object i = it.next();
            System.out.println(i);
        }
        //增强for
        for (Integer t : ts) {
            System.out.println(t);
        }
        //lambda
        ts.forEach(i-> System.out.println(i));
    }
}

练习:TreeSet对象排序练习题
需求:请自行选择比较器排序和自然排序两种方式;
要求:存入四个字符串,“c”,“ab”,“df”,“qwer”
按照长度排序,如果一样长则按照首字母排序

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

public class Test {
    public static void main(String[] args){
        TreeSet<String> ts=new TreeSet<>(new Comparator<String>() {
            @Override
            //o1是要添加的数据,o2是已经存在于红黑树的数据
            public int compare(String o1, String o2) {
                int i=o1.length()-o2.length();
                i=i==0?o1.compareTo(o2):i;
                return i;
            }
        });
        ts.add("c");
        ts.add("ab");
        ts.add("df");
        ts.add("qwer");
        System.out.println(ts);//结果:[c, ab, df, qwer]
    }
}

练习:需求:创建5个学生对象
属性:(姓名,年龄,语文成绩,数学成绩,英语成绩),
按照总分从高到低输出到控制台
如果总分一样,按照语文成绩排
如果语文一样,按照数学成绩排
如果数学成绩一样,按照英语成绩排
如果英文成绩一样,按照年龄排
如果年龄一样,按照姓名的字母顺序排
如果都一样,认为是同一个学生,不存。

public class Test {
    public static void main(String[] args){
        Student s1=new Student("zhangsan",18,89,85,88);
        Student s2=new Student("lisi",22,97,65,78);
        Student s3=new Student("wangwu",20,79,99,44);
        Student s4=new Student("zhaoliu",19,69,95,78);
        Student s5=new Student("qianqi",25,79,75,74);
        TreeSet<Student> ts=new TreeSet<>();
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        for (Student t : ts) {
            System.out.println(t);
        }
    }
}
package study.api;

public class Student implements Comparable<Student>{
    private String name;
    private int age;
    private int chinese;
    private int math;
    private int english;

    public Student() {
    }

    public Student(String name, int age, int chinese, int math, int english) {
        this.name = name;
        this.age = age;
        this.chinese = chinese;
        this.math = math;
        this.english = english;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return chinese
     */
    public int getChinese() {
        return chinese;
    }

    /**
     * 设置
     * @param chinese
     */
    public void setChinese(int chinese) {
        this.chinese = chinese;
    }

    /**
     * 获取
     * @return math
     */
    public int getMath() {
        return math;
    }

    /**
     * 设置
     * @param math
     */
    public void setMath(int math) {
        this.math = math;
    }

    /**
     * 获取
     * @return english
     */
    public int getEnglish() {
        return english;
    }

    /**
     * 设置
     * @param english
     */
    public void setEnglish(int english) {
        this.english = english;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + ", chinese = " + chinese + ", math = " + math + ", english = " + english + "}";
    }

    @Override
    public int compareTo(Student o) {
        int sum1=this.getChinese()+this.getMath()+this.getEnglish();
        int sum2=o.getChinese()+o.getMath()+o.getEnglish();
        int i=sum1-sum2;
        i=i==0?this.getChinese()-o.getChinese():i;
        i=i==0?this.getMath()-o.getMath():i;
        i=i==0?this.getEnglish()-o.getEnglish():i;
        i=i==0?this.getName().compareTo(o.getName()):i;
        return i;
    }

//        如果总分一样,按照语文成绩排
//        如果语文一样,按照数学成绩排
//        如果数学成绩一样,按照英语成绩排
//        如果英文成绩一样,按照年龄排
//        如果年龄一样,按照姓名的字母顺序排
//        如果都一样,认为是同一个学生,不存。
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值