三、List、Set、数据结构和Collections.m

一、数据结构

1.1 常见的数据结构

进:123

出:321

现进后出

类似子弹弹夹

队列

进:123

出:123

先进先出

类似排队安检

数组

特点:查询快,增删慢

查询快:数组地址是连续的,可以通过数组索引快速查到某个元素

增删慢:数组长度是固定的,想增加/删除必须创建一个新数组,把源数组的数据复制过来

链表

特点:查询慢,增删快

查询慢:每次查询都必须从头开始查询

增删快:链表结构,增加或删除一个元素,对整体结构没有影响

红黑树

趋*于*衡树,查询的速度非常快,查询叶子节点最大次数和最小次数不能超过2倍

二、List集合

java.util.List接口 extends Collection接口

2.1 三大特点:

1.有序的集合,存储元素和取出元素顺序是一致的

2.有索引,包含一些有索引的方法

3.允许存放重复的元素

2.2 List接口常用的带索引的接口

public boolean add(int index,E element)将指定元素添加到指定位置

public E remove(int index)将指定位置的元素删除,返回删除的元素

public E set(int index,E element)用指定元素替换指定位置的元素,返回更新前的元素

public E get(int index)返回指定位置的元素

三、 List集合的子类

3.1 ArrayList集合

java.util.ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的是查询数据,遍历数据,所以ArrayList是最常用的集合。

3.2 LinkedList集合

java.util.LinkedList集合数据存储的结构是链表结构

特点:

  1. 底层是一个链表结构:查询慢,增删快

  2. 里面包含大量操作首尾元素的方法

    注意:LinkedList集合特有的方法,不能使用多态

常用的方法:

public boolean addFirst(E e):将指定元素插入此列表的开头
public boolean addLast(E e):将指定元素插入此列表的结尾 等效于add
public boolean push(E e):将元素推入此列表所表示的堆栈 等效于addFirst

public E getFirst()获取并返回第一个元素
public E getLast()获取并返回第二个元素

public boolean isEmpty()此列表不包含元素 则返回ture

public E removeFirst()移除并返回元素
public E removeLast()移除并返回元素

3.3 Vector集合

可以实现可增长的对象数组,单线程

四、Set集合

4.1 HashSet集合及介绍

java.util.Set接口 extends Collection接口
Set接口的特点:

  1. 不允许存储重复元素

  2. 没有索引,没有带索引的方法,不能使用普通的for循环遍历

java.util.HashSet实现了implements Set接口
HashSet特点:

  1. 不允许存储重复元素
  2. 没有索引,没有带索引的方法,不能使用普通的for循环遍历
  3. 是一个无序的集合,存储元素和取出元素的顺序有可能不一样
  4. 底层是一个哈希表结构(查询速度非常快)

4.2 HashSet集合存储结构(哈希表)

哈希值

哈希值:是一个十进制整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,模拟出来得到的地址,不是数据实际存储的物理地址)

在Object类里面有一个方法可以获取对象的哈希值

public int hashCode();

toString()返回的也是哈希值,是16进制

重写hashCode方法 ,就算两个哈希值一样,物理地址也不相等(==)

哈希表

Set集合不允许创建重复元素的原理:

Set集合在调用add方法时,add会调用元素的hashCode和equals方法,判断元素是否重复

4.3 HashSet存储自定义元素

4.4 LinkedHashSet集合

java.util.LinkedHashSet

特点:

底层是哈希表(数组+链表/红黑树)+链表:多了一条链表,记录元素的存储顺序,保证元素有序。

有序,不允许重复

五、Collections集合工具

5.1 常用方法

public static boolean addAll(Collection c,T ... elements);往集合中添加一些元素

public static void suffle(List<?> list);打乱集合顺序

public static void sort(List list);将集合中元素按默认规则排序(升序)

注意:

​ sort(List list)使用前提

​ 被排序的集合里面存储的元素必须实现Comparable,重写接口中的方法compareTo的排序规则

​ Comparable接口的排序规则:

​ 自己(this)-参数:升序

​ 参数-自己(this):降序

ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,83,1,32,77,10,3);
System.out.println(list);
Collections.shuffle(list);
System.out.println(list);
Collections.sort(list);
System.out.println(list);

ArrayList<Person> person = new ArrayList<>();
Person p1 = new Person("小红",20);
Person p2 = new Person("小明",27);
Person p3 = new Person("小黄",18);
Collections.addAll(person,p1,p2,p3);
Collections.sort(person);
System.out.println(person);

Person类

package com.dy.list;

public class Person implements Comparable<Person>{
    private String name;
    private Integer age;

    public Person() {
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", 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(Person o) {
        return this.age-o.age;
    }
}

public static void sort(List list);将集合中元素按默认规则排序(升序)

public static void sort(List list,Comparator<? super T>);将集合中元素按指定规则排序

Comparable和Comparator的区别:

​ Comparable:自己(this)和别人(参数)做比较,自己需要实现Comparable接口,重写比较的规则compareTo方法

​ Comparator:相当于找一个第三方裁判,比较两个

Comparator排序规则:

​ o1-o2 升序

posted @ 2021-09-09 09:25  盐汽水mua  阅读(59)  评论(0)    收藏  举报