>[success] # List集合
1. `java.util.List`集合是**Collection集合的子集合**,该集合中允许**有重复的元素**并且有先后放入次序
2. 该集合的主要实现类有:`ArrayList类`、`LinkedList类`、`Stack类`、`Vector类`
3. `ArrayList`类的底层是采用动态数组进行数据管理的,支持下标访问,数组结构,支持自动扩容
~~~
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
// 创建ArrayList 实现了接口List ,因此一个List接口类型的引用指向ArrayList类型的对象,形成了多态
// 由源码可知:当new对象时并没有申请数组的内存空间
List lt1 = new ArrayList();
// 第一次增加会申请ArrayList的默认初始容量为10,当然也可以自定义指定初始容量,随着动态的向其中添加元素,
// 其容量可能会动态的增加,那么扩容的公式为:新容量 = 旧容量/2 + 旧容量
// 比如:初始容量为4,其容量的每次扩充后的新容量为:4->6->9->13->19->…即每次扩充至原有基础的1.5倍
lt1.add("one");
}
}
~~~
4. `LinkedList`类的底层是采用双向链表进行数据管理的,链表数据结构更适合于插入和删除
5. `Stack`类的底层是采用动态数组进行数据管理的,该类主要用于描述一种具有**后进先出**特征的数据结构,叫做栈(last in fifirst out LIFO)
~~~
import java.util.Stack;
public class StackTest {
public static void main(String[] args) {
// 1.准备一个Stack类型的对象并打印
Stack s1 = new Stack();
Stack s2 = new Stack();
System.out.println("s1 = " + s1); // [啥也没有]
System.out.println("s2 = " + s2); // [啥也没有]
System.out.println("-----------------------------------------------");
// 2.将数据11、22、33、44、55依次入栈并打印
for (int i = 1; i <= 5; i++) {
Object obj = s1.push(i * 11);
System.out.println("入栈的元素是:" + obj);
//System.out.println("栈中的元素有:" + s1); // 11 22 33 44 55
}
System.out.println("-----------------------------------------------");
// 3.查看栈顶元素值并打印
//Object obj2 = s1.peek();
//System.out.println("获取到的栈顶元素是:" + obj2); // 55
System.out.println("-----------------------------------------------");
// 4.对栈中所有元素依次出栈并打印
int len = s1.size();
for (int i = 1; i <= len; i++) {
Object to = s1.pop();
//System.out.println("出栈的元素是:" + to); // 55 44 33 22 11
s2.push(to);
}
System.out.println("-----------------------------------------------");
// 5.最终打印栈中的所有元素
//System.out.println("s1 = " + s1); // [啥也没有]
System.out.println("-----------------------------------------------");
len = s2.size();
for (int i = 1; i <= len; i++) {
Object to = s2.pop();
System.out.println("出栈的元素是:" + to); // 11 22 33 44 55
}
}
}
~~~
6. `Vector`类的底层是采用动态数组进行数据管理的,该类与ArrayList类相比属于线程安全的类,效率比较低,以后开发中基本不用
>[danger] ##### List 常用api
|方法声明 |功能介绍|
|--|--|
|void add(int index, E element) |向集合中指定位置添加元素|
|boolean addAll(int index, Collection<? extends E> c)| 向集合中添加所有元素|
|E get(int index)| 从集合中获取指定位置元素|
|int indexOf(Object o) |查找参数指定的对象|
|int lastIndexOf(Object o) |反向查找参数指定的对象|
|E set(int index, E element) |修改指定位置的元素|
|E remove(int index)| 删除指定位置的元素|
|List subList(int fromIndex, int toIndex) |用于获取子List|
~~~
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
// 1.创建一个list 集合
List ls = new ArrayList();
// add 向集合中添加元
ls.add("1"); // 末尾插入
ls.add(0, "w"); // 指定插入元素位置 集合头部
// addAll 向集合中添加所有元素
List ls1 = new ArrayList();
ls1.add("1");
ls1.add("2");
ls.addAll(ls1);
System.out.print(ls); // [w, 1, 1, 2]
// get 根据下标获取元素
Object o = ls.get(0);
System.out.print(o); // w
// 向下转型 获取 实际存储的类型值
String str = (String) ls.get(0);
System.out.print(str); // w
// 使用 get 实现 toString 效果
StringBuffer strB = new StringBuffer();
strB.append('[');
for (int i = 0; i < ls.size(); i++) {
strB.append(ls.get(i));
if (ls.size() - 1 == i) {
strB.append(']');
} else {
strB.append(',');
}
}
System.out.print(strB);
// indexOf 根据值获取索引
int index = ls.indexOf("1");
System.out.print(index); // 1
// lastIndexOf 从后往前找
index = ls.lastIndexOf("1");
System.out.print(index); // 2
// set 修改指定位置元素
String s = (String) ls.set(0, "wwwww");
System.out.print("被修改位置元素" + s); // w // w 被修改为 wwwww
System.out.print(ls); // [wwwww, 1, 1, 2]
// remove 删除元素
ls.remove("wwwww");
System.out.print(ls); // [1, 1, 2]
// 删除全部 元素
// for (int i = 0; i < ls.size(); ) { // 利用删除元素 size 改变来删除
/*
* for (int i = ls.size()-1; i >= 0; i--) { // 倒序删除
* //System.out.println("被删除的元素是:" + ls.remove(i));
* 删除元素后,后面的元素补位
* //System.out.println("被删除的元素是:" + ls.remove(0));
* System.out.println("被删除的元素是:" + ls.remove(i));
* }
*/
// subList 获取当前集合中的子集合,也就是将集合中的一部分内容获取出来,子集合和当前集合共用同一块内存空间
List lt2 = ls.subList(1, 3);
System.out.println("lt2 = " + lt2); // [1, 2]
}
}
~~~
- windows -- 环境变量
- Vscode -- 编写java
- 初始java
- java -- 关键字
- 编写第一个java程序
- java -- 注释
- 计算机存储 -- 进制
- java -- 类型
- java -- 变量
- 数字类型
- 布尔类型
- 字符类型
- 类型转换
- 双等比较是什么
- java -- 运算符
- 算数运算符
- 字符串拼接
- 关系/比较运算符
- 自增减运算符
- 逻辑运算符
- 三目运算
- 赋值运算符
- 移位运算符
- 位运算符
- 运算符优先级
- java -- 流程控制语句
- if /else if /if -- 判断
- switch case分支结构
- for -- 循环
- 用双重for循环
- while -- 循环
- do while -- 循环
- 案例练习
- java -- 数组
- 数组的存储
- 数组的增删改查
- 数组的特点
- 数组案例
- 二维数组
- 数组的工具方法
- java -- 方法
- java -- 方法的重载
- java -- 方法的调用流程
- java -- 类方法传参注意事项
- java -- 方法练习案例
- 对比 return break continue
- for each循环
- java -- 基础练习
- java -- 面向对象
- java -- 创建类和对象
- java -- 访问控制符
- java -- 类成员方法
- java -- 构造方法
- java -- this
- java -- 封装
- java -- 对象内存图
- java -- 创建对象案例
- java -- static
- java -- 继承
- super -- 关键字
- java -- 构造块和静态代码块
- java -- 重写
- java -- final
- java -- 多态
- java -- 抽象类
- java -- 接口
- 引用类型数据转换
- 综合案例
- java -- 内部类
- java -- 回调模式
- java -- 枚举类型
- java -- switch 使用枚举
- java -- 枚举方法使用
- java -- 枚举类实现接口
- java -- javaBean
- java -- package 包
- java -- import
- java -- 递归练习
- java -- 设计模式
- 单例模式
- java -- 注解
- java -- 元注解
- Java -- 核心类库
- java -- 处理字符串
- Java -- String
- String -- 常用方法
- String -- 正则
- Java -- StringBuilder 和 StringBuffer
- 知识点
- Java -- StringJoiner 字符串拼接
- 练习题
- 字符串的总结
- Java -- 包装类
- Integer
- Double
- Boolean
- Character
- java -- 集合类
- java -- util.Collection
- Iterator接口
- java -- util.List
- java -- ArrayList
- java -- util.Queue
- java -- util.Set
- java -- util.Map
- java -- util.Collections
- Java -- Math
- Java -- java.lang
- Java -- Object
- Java -- 获取当前时间戳
- Java -- 异常
- Java -- java.util
- java -- Date
- java -- Calender
- Java -- java.text
- Java -- SimpleDateFormat
- Java -- java.time
- Java -- java.io
- java -- io.File
- java -- 泛型
- IDEA -- 用法