集合体系image.png

Collection

:::tips

概述:

  • public interface Collection extends Iterable
  • Collection 是 单列集合 的根接口
  • Collection有两个重要的子接口,分别是List和Set接口
  • JDK不提供此接口的如何直接实现,提供更具体的子接口(无序Set 有序List)实现

常用方法:

  • boolean add(E e) 添加单个元素
  • boolean remove(Object o) 从集合中移除指定元素
  • void clear() 清空集合中的元素
  • boolean contains(Object o) 判断集合中是否存在指定元素
  • boolean isEmpty(Object o) 判断集合是否为空
  • addAll() 添加多个元素
  • containsAll() 查找多个元素是否存在
  • removeAll() 删除多个元素
  • int size() 集合的长度,也是集合中元素的个数 :::

    List接口

    :::tips

    概述:

  • List接口下的集合是有索引的,所以List接口在继承Collection方法的基础上,还提供一些特有的方法,可以通过索引操作集合元素。

常用方法:

void add(int index,E element) 在此集合中的指定位置插入指定的元素
E remove(int index) 删除指定索引处的元素,返回被删除的元素
E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
E get(int index) 返回指定索引处的元素 :::

ArrayList集合

:::tips

概述:

  • ArrayList实现了List接口
  • ArrayList:底层数据结构是数组,查询快,增删慢

ArrayList的底层源码分析

  • ArrayList底层是什么数据结构?
    • ArrayList底层是一个Object数组:transient Object = elementData;
  • 底层的数组的初始化长度是多少?
    • 使用无参构造方法创建集合时,数组的初始长度为 0
    • 使用带参构造方法创建集合时,数组长度由参数值指定
  • 首次调用add方法添加元素的时候,数组的长度变为多少?
    • 如果初始化的数组长度为0,首次添加元素时,长度会扩容为10
  • 如果添加的元素超过数组长度,怎么办?

    • 数组会自动扩容,长度在原来的基础上增加一半。 ::: ```java public static void main(String[] args) { //添加元素 ArrayList sAL = new ArrayList<>(); sAL.add(new Student(“张三”, 19)); sAL.add(new Student(“李四”, 17)); sAL.add(new Student(“王五”, 17)); sAL.add(new Student(“赵六”, 18));

      //索引为0的年龄 int minage = sAL.get(0).getAge();

      for (int i = 0; i < sAL.size(); i++) {

      1. int age = sAL.get(i).getAge();
      2. if (age < minage) {
      3. minage = age;
      4. }

      } System.out.println(minage);

      //倒过来遍历防止漏删元素(List集合删掉一个后面元素会替换上) for (int i = sAL.size() - 1; i > 0; i—) {

      if (sAL.get(i).getAge() == minage) {
          sAL.remove(i);
      }
      

      } for (Student student : sAL) {

      System.out.println(student);
      

      } }

class Student { private String name; private int age; //构造方法 setget toString方法 }

<a name="Uw78N"></a>
### LinkedList集合
:::tips
<a name="dI95p"></a>
#### 概述:

- LinkedList的底层是一个双向链表,增删快,查询慢
- 双向链表可以快速对首尾元素进行操作,所以LinkedList中有很多进行首尾操作的API

<a name="HzcZA"></a>
#### 常用方法

- public void addFirst(E e)    在该列表开头插入指定元素
- public void addLast(E e)    将指定的元素追加到此列列表的末尾
- public E getFirst()        返回此列表中的第一元素
- public E getLast()            返回此列表中的最后一个元素
- public E removeFirst()        从此列表中删除并返回第一个元素
- public E removeLast()        从此列表中删除并返回最后一个元素
:::
```java
public static void main(String[] args) {
    LinkedList<String> sLL = new LinkedList<>();
    sLL.add("11");
    sLL.add("22");
    sLL.add("33");

    System.out.println(sLL);

    //头尾添加
    sLL.addFirst("00");
    sLL.addLast("44");

    System.out.println(sLL);

    //头尾删除
    sLL.removeFirst();
    sLL.removeLast();

    System.out.println(sLL);

    //头尾获取
    System.out.println(sLL.getFirst());
    System.out.println(sLL.getLast());
}

Vector

:::tips

概述

  • 底层是一个对象数组,protected Object[ ] elementData;
  • Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized
  • 在开发中,需要线程同步安全的考虑用Vector :::

    Collections工具类

    :::tips

    概述:

  • Collections 类在java.util包中,是一个操作集合的工具类

  • Collections 类提供了许多操作集合的静态方法,可以实现集合元素的排序、批量添加,替换等操作

常用方法:

addAll(Collection c, T… e) 将所有指定的e元素,添加到指定的集合c中
shuffle(List<?> list) 随机打乱集合中元素的顺序
sort(List list) 根据自然顺序对list集合的元素进行升序排序
sort(List list, Comparator c) 根据指定的比较器,对list集合元素进行自定义排序。 :::

public static void main(String[] args) {
    ArrayList<String> sAL = new ArrayList<>();
    //Collections批量添加
    Collections.addAll(sAL, "aa", "bb", "cc");

    //Collections打乱顺序
    Collections.shuffle(sAL);

    //根据自然顺序对list集合的元素进行升序排序
    Collections.sort(sAL);

    //根据指定的比较器,对list集合元素进行自定义排序
    sAL.sort((o1, o2) -> o2.charAt(0) - o1.charAt(0));
    //Collections.sort(sAL, (o1, o2) -> o2.charAt(0) - o1.charAt(0));
    sAL.forEach(System.out::println);
}

泛型

:::tips

概述:

  • JDK5中引入的特性,它提供了编译时类型安全检测机制
  • java泛型可以保证如果编译时没有发出警告,运行时就不会产生ClassCastException异常

好处:

  • 把运行时期的问题提前到了编译期间
  • 避免了强制类型转换

    定义格式

  • <类型>

    • 尖括号里面可以任意书写,按照变量的定义规则即可,一般只写一个大写字母
  • <类型2>
    • 指定多种泛型格式,多种类型之间用逗号隔开

定义位置

  • 定义在类后面(泛型类) ArrayList
    • 定义格式:修饰符 class 类名<泛型标记> {}
    • 泛型类在创建对象时确定泛型的真实类型
    • 类中引用到泛型的地方都会替换成具体类型。
  • 定义在接口后面(泛型接口)List
    • 定义格式:修饰符 interface 接口名<泛型标记> {}
    • 实现类实现接口时确定泛型
    • 接口中引用泛型的地方会替换成具体类型
  • 定义在方法声明上(泛型方法)
    • 定义格式:修饰符 <泛型标记> 返回值类型 方法名(类型 变量名) {}
    • 调用方法,传参时确定泛型类型
    • 方法中引用泛型的地方会替换成具体类型

类型通配符 ?

  • 当使用泛型的时候,无法确定泛型的具体类型时,可以使用通配符 ? 来表示某一种类型

类型通配符上下限

  • ? super Car
    • 泛型只能是Car或者Car的父类,规定了下边界
  • ? extends Car
    • 泛型只能是Car或者Car的子类,规定了上边界 ::: ```java public static void main(String[] args) { box stringbox = new box<>(); stringbox.setValue(“qwer”); System.out.println(stringbox.getValue()); }

class box { private E value;

public E getValue() {
    return value;
}

public void setValue(E value) {
    this.value = value;
}

}

```java
public static void main(String[] args) {
    Integer[] arr1 = {1, 2, 3, 4};
    ptintArray(arr1);
    Double[] arr2 = {1.1, 1.2, 1.3, 1.4};
    ptintArray(arr2);
    String[] arr3 = {"1", "2", "3", "4"};
    ptintArray(arr3);
}
public static <T> void ptintArray(T[] arr) {
    System.out.println(Arrays.toString(arr));
}

数据结构

:::tips

概述

  • 数据结构是计算机存储、组织数据的方式
  • 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率

  • 存储类型先进后出

    队列

  • 存储类型先进先出

    数组

  • 查询速度快 删除添加效率低

    链表

  • 增删快 查询慢 ::: | remove | /rɪˈmuːv/ | 删除 | | —- | —- | —- | | clear | /klɪə(r)/ | 清空 | | contains | /kənˈteɪnz/ | 包含 | | empty | /ˈempti/ | 空的 | | shuffle | /ˈʃʌf(ə)l/ | 变换位置 | | sort | /sɔːt/ | 排序 |