A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

## 2.1 List接口介绍

#### List集合的特点

```java
有序(存取顺序一致),有索引,元素可重复,基于数组结构
```

#### List集合常用子类

```java
ArrayList
LinkedList
```

## 2.2 List接口中常用方法

```java
public void add(int index, E element): 将指定的元素添加到指定的位置
public E get(int index): 根据索引获得指定位置的元素
public E remove(int index): 删除指定位置的元素,返回被删除的元素
boolean remove(Object o): 删除指定的元素,删除成功返回true,否则false
public E set(int index, E element): 将指定位置的元素修改为指定的值element
```

- 示例代码

```java
public class ListDemo02 {
    public static void main(String[] args){
        // 创建集合对象
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        // 将元素4添加到索引1位置
        list.add(1,4);

        // 将索引0的元素修改为6
        list.set(0,6);

        System.out.println(list); // [6,4,2,3]
        // 要注意索引越界问题
        // list.add(5,6);
        // 根据索引获得元素
        System.out.println(list.get(2)); // 2

        // 删除指定位置的元素
        // System.out.println(list.remove(1)); // 4

        // 删除元素1
        System.out.println(list.remove(Integer.valueOf(5))); // false

        System.out.println(list);
    }
}
```

## 2.3 List接口常用子类

```java
ArrayList
LinkedList
```

### 2.3.1 ArrayList集合

```java
/**
    ArrayList集合的特点
        * 有序(存取顺序一致),有索引,元素可重复
        * 底层是数组结构:增删慢,查询快,线程不安全的,效率高
*/
public class ArrayListDemo {
    public static void main(String[] args){
        // 创建ArrayList集合对象
        ArrayList<String> list = new ArrayList<>();

        list.add("a") ;
        list.add("b") ;
        list.add("c") ;

        System.out.println(list);
    }
}
```

### 2.3.2 LinkedList集合

#### LinkedList集合特点

```java
* 实现了List接口
* 有序(存取顺序一致),有索引,元素可重复
* 底层是双链表结构,查询慢,增删快,线程不安全的,效率高
```

#### LinkedList集合特有方法方法

```java
public void addFirst(E e):  将元素添加到链表头
public void addLast(E e):   将元素添加到链表尾部
public E getFirst():         获得链表头元素
public E getLast():          获得链表尾部元素
public E removeFirst():      删除链表头元素
public E removeLast():       删除链表尾部元素
```

- 示例代码

```java
public class LinkedListDemo {
    public static void main(String[] args){
        // 创建LinkedList集合对象
        LinkedList<String> list = new LinkedList<>();
        list.add("a");
        list.add(0,"b");

        // 将元素添加到链表头
        list.addFirst("c");
        // 将元素添加到链表尾部
        list.addLast("d");
        list.add("e");

        // 获得链表头元素
        System.out.println(list.getFirst()); // c
        // 获得链表尾部元素
        System.out.println(list.getLast()); // e

        System.out.println(list);
        System.out.println(list.get(3)); //

        // 删除链表头元素
        System.out.println(list.removeFirst()); // c
        // 删除链表尾部元素
        System.out.println(list.removeLast()); // e
    }
}
```

## 2.4 ArrayList和LinkedList的选择

```java
如果需要执行大量的增删操作,则选择LinkedList
如果不需要执行增删操作,则选择ArrayList
```

# 第三章 Set集合

## 3.1 Set接口介绍

```java
Set集合的特点
    * 无序(存取顺序不一致),无索引,元素不可重复

Set集合常用子类
    * HashSet
    * LinkedHashSet
```

## 3.2 HashSet集合

#### HashSet集合特点

```java
HashSet集合的特点
    * 无序(存取顺序不一致),无索引,元素不可重复
    * 底层结构是哈希表

什么是哈希表
    * JDK1.8之前,是数组+链表
    * JDK1.8之后,是数组+链表+红黑树
```

#### HashSet集合基本使用

```java
public class HashSetDemo02 {
    public static void main(String[] args){
        // 创建Set集合对象
        HashSet<String> set = new HashSet<>();
        set.add("aa"); // "aa".hashCode() ==> 12345 % 16 = 3
        set.add("bb"); // "bb".hashCode() ==> 56654 % 16 = 3
        set.add("cc"); // "cc".hashCode() ==> 56776 % 16 = 3
        System.out.println(set);
    }
}
```

## 3.3 对象的哈希值概述

```java
* 对象的哈希值就是一个十进制的整数。
* 哈希值是通过调用Object类的hashCode方法获得,如果子类没有重写该方法,则返回值默认是地址值。
* 哈希值是对象存储到哈希表的重要依据。
```

- 示例代码

```java
public class Student {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public Student() {
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", 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 age == student.age &&
                Objects.equals(name, student.name);
    }
   
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

public class HashSetDemo01 {
    public static void main(String[] args){
        // 定义一个字符串
        String str1 = "abc";
        String str2 = "abc";
        System.out.println(str1.hashCode()); // 96354
        System.out.println(str2.hashCode()); // 96354


        System.out.println("Aa".hashCode());  // 2112
        System.out.println("BB".hashCode());  // 2112


        // 创建学生对象
        Student stu1 = new Student();
        Student stu2 = new Student();
        System.out.println(stu1.hashCode()); //  1971489295
        System.out.println(stu2.hashCode()); //  985655350

    }
}
```

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马