## 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
}
}
```
|
|