01 接口概括
java所有的集合类都位于java.util包下,提供了一个表示和操作对象集合的统一构架,包含大量集合接口,以及这些接口的实现类和操作它们的算法。
集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。
Java集合类型分为单列集合Collection和双列结合Map,Collection和Map是集合的根接口,这两个接口又包含了一些子接口和实现类
02 数据结构简介
01 数组Array
可以在内存中连续存储多个元素的结构,在内存中的分配也是连续,数组中的元素通过下标进行访问,数组下标从零开始
优点:
- 按照索引查询元素速度快
- 按照索引遍历数组方便
缺点:
- 数组的长度固定后无法扩容
- 数组只能存储单一数据类型
02 栈Stack
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。
特点:先进后出或者说后进先出
03 队列Queue
队列与栈样也是一中线性表,不同是,队列可以在一端添加元素在另一端取出元素;
也就是先进先出。
队列从过一端放入元素称为入队,另一端取出元素称为出队
04 链表LinkedList
链表是物理存储非连续、非顺序存储结构,数据元素的逻辑顺序,是通过指针地址实现的。
每个元素有两个结点,一个存储元素的数据域(内存空间),另一个指向下一个结点地址的指针域。
从上图可以可出链表形成不同结构如单向链表和双向链表。
05 图Graph
06 散列表Hash
07 树Tree
08 堆Heap
List
特点:有序可重复
- 有序指的是下标
- 可重复指的是的可以存储相同元素,将相同元素存储在不同下标位置上实现
03 ArrayList存储读取数据
package;
public class Person {
}
public class ArrayListTest {
@Test
public void test() {
List<String> list = new ArrayList<>(List.of("0", "1", "2", "3", "4"));
System.out.println(list);
// 末尾追加
list.add("5");
System.out.println(list);
// 向指定index位置添加
list.add(3, "33");
System.out.println(list);
// 将指定idnex位置上的元素从集合中删除
list.remove(6);
System.out.println(list);
// 在集合中删除指定元素
list.remove("33");
System.out.println(list);
list.add("哇");
list.add("哇");
System.out.println(list);
list.remove("哇");
System.out.println(list);
// 更新指定index位置上元素的值
list.set(3, "三");
System.out.println(list);
// 查询指定ndex位置上元素的值
System.out.println(list.get(3));
}
/*
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 33, 3, 4, 5]
[0, 1, 2, 33, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 哇, 哇]
[0, 1, 2, 3, 4, 哇]
[0, 1, 2, 三, 4, 哇]
三
*/
}
04 集合中的泛型
public class linkedListTest {
@Test
public void test() {
// List<String> list = new ArrayList<String>();
// List<String> list = new ArrayList<>();
// List<String> list = new ArrayList();
List<String> list = new ArrayList<>();
list.add("lll");
list.add(String.valueOf(1));
}
}
05 实例化List并赋值的两中方法
public class linkedListTest {
@Test
public void test() {
List<Integer> list01 = new ArrayList<>();
for (int i = 0; i < 5; i++) {
list01.add(i);
}
System.out.println(list01);
list01.add(6);
System.out.println(list01);
List<Integer> list02 = new ArrayList<>() {{
for (int i = 0; i < 5; i++) {
add(i);
}
}};
System.out.println(list02);
list02.add(6);
System.out.println(list02);
}
/*
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
*/
}
06 List可变集合与不可变集合
public class linkedListTest {
@Test
public void test01() {
// 不可变集合
List<Integer> list = List.of(0, 1, 2, 3, 4);
System.out.println(list);
list.add(6);
list.set(2, 20);
// System.out.println(list);
}
//[0, 1, 2, 3, 4]
@Test
public void test02() {
// 不可变集合转为可变集合
List<Integer> list = new ArrayList<>(List.of(0, 1, 2, 3, 4));
System.out.println(list);
list.add(6);
System.out.println(list);
list.set(2, 20);
System.out.println(list);
}
/*
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
[0, 1, 20, 3, 4, 6]
*/
}
07 使用for循环和foreach遍历集合List
public class linkedListTest {
@Test
public void test() {
List<Integer> list = new ArrayList<>(List.of(0, 1, 2, 3, 4));
for (int i = 0; i < 5; i++) {
System.out.println(list.get(i));
}
System.out.println("元素的数量 >>> " + list.size());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("++++++++++++++++++++++++++++");
// for(集合中元素的数据类型 集合中每一个元的是变量 : 被遍历的结合)
for (int num : list) {
System.out.println(num);
}
}
/*
0
1
2
3
4
元素的数量 >>> 5
0
1
2
3
4
++++++++++++++++++++++++++++
0
1
2
3
4
*/
}
08 使用迭代器遍历集合List
public class linkedListTest {
@Test
public void test() {
List<Integer> list = new ArrayList<>(List.of(0, 1, 2, 3, 4));
Iterator<Integer> it = list.listIterator();
while (it.hasNext()){
Integer next = it.next();
System.out.println(next);
}
System.out.println("第一次遍历完成");
while (it.hasNext()){
Integer next = it.next();
System.out.println(next);
}
System.out.println("第二次遍历完成");
}
/*
0
1
2
3
4
第一次遍历完成
第二次遍历完成
*/
}
09 LinkedList
package;
public class Person {
}
package Test;
import Person;
import org.junit.jupiter.api.Test;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**
* 数组:只能存储单一数据类型
* 优点:线性存储 查询速度快
* 缺点:数组一旦声明长度不可修改
* List:有序可重复
* 泛型:限定数据类型
* <>钻石操作符
*/
public class linkedListTest {
@Test
public void test01() {
List list = new LinkedList();
byte a = 1;
short b = 2;
int c = 3;
long d = 4L;
double e = 5.0d;
float f = 6.0f;
char g = 'a';
boolean h = false;
String i = "lll";
Person person = new Person();
list.add(a);
list.add(b);
list.add(c);
list.add(d);
list.add(e);
list.add(f);
list.add(g);
list.add(h);
list.add(i);
list.add(person);
System.out.println(list.size());
}
//10
@Test
public void test02() {
List list = new LinkedList();
list.add("xm");
list.add("x");
list.add("xm");
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(2));
}
/*
xm
x
xm
*/
@Test
public void test03() {
// List<String> list = new LinkedList<String>();
// List<String> list = new LinkedList<>();
// List<String> list = new LinkedList();
List<String> list = new LinkedList<>();
list.add("lll");
list.add(String.valueOf(1));
}
@Test
public void test04() {
List<Integer> list01 = new LinkedList<>();
for (int i = 0; i < 5; i++) {
list01.add(i);
}
System.out.println(list01);
list01.add(6);
System.out.println(list01);
List<Integer> list02 = new LinkedList<>() {{
for (int i = 0; i < 5; i++) {
add(i);
}
}};
System.out.println(list02);
list02.add(6);
System.out.println(list02);
}
/*
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
*/
@Test
public void test05() {
// 不可变集合
List<Integer> list = List.of(0, 1, 2, 3, 4);
System.out.println(list);
// list.add(6);
// list.set(2, 20);
// System.out.println(list);
}
//[0, 1, 2, 3, 4]
@Test
public void test06() {
// 不可变集合转为可变集合
List<Integer> list = new LinkedList<>(List.of(0, 1, 2, 3, 4));
System.out.println(list);
list.add(6);
System.out.println(list);
list.set(2, 20);
System.out.println(list);
}
/*
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
[0, 1, 20, 3, 4, 6]
*/
@Test
public void test07() {
List<String> list = new LinkedList<>(List.of("0", "1", "2", "3", "4"));
System.out.println(list);
// 末尾追加
list.add("5");
System.out.println(list);
// 向指定index位置添加
list.add(3, "33");
System.out.println(list);
// 将指定idnex位置上的元素从集合中删除
list.remove(6);
System.out.println(list);
// 在集合中删除指定元素
list.remove("33");
System.out.println(list);
list.add("李");
list.add("李");
System.out.println(list);
list.remove("李");
System.out.println(list);
// 更新指定index位置上元素的值
list.set(3, "三");
System.out.println(list);
// 查询指定ndex位置上元素的值
System.out.println(list.get(3));
}
/*
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 33, 3, 4, 5]
[0, 1, 2, 33, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 李, 李]
[0, 1, 2, 3, 4, 李]
[0, 1, 2, 三, 4, 李]
三
*/
@Test
public void test08() {
List<Integer> list = new LinkedList<>(List.of(0, 1, 2, 3, 4));
for (int i = 0; i < 5; i++) {
System.out.println(list.get(i));
}
System.out.println("元素的数量 >>> " + list.size());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("++++++++++++++++++++++++++++");
// for(集合中元素的数据类型 集合中每一个元的是变量 : 被遍历的结合)
for (int num : list) {
System.out.println(num);
}
}
/*
0
1
2
3
4
元素的数量 >>> 5
0
1
2
3
4
++++++++++++++++++++++++++++
0
1
2
3
4
*/
@Test
public void test09() {
List<Integer> list = new LinkedList<>(List.of(0, 1, 2, 3, 4));
Iterator<Integer> it = list.listIterator();
while (it.hasNext()) {
Integer next = it.next();
System.out.println(next);
}
System.out.println("第一次遍历完成");
while (it.hasNext()) {
Integer next = it.next();
System.out.println(next);
}
System.out.println("第二次遍历完成");
}
/*
0
1
2
3
4
第一次遍历完成
第二次遍历完成
*/
@Test
public void test10() {
List<Integer> list = new LinkedList<>(List.of(0, 1, 2, 3, 4));
list.stream().forEach(System.out::println);
}
/*
0
1
2
3
4
*/
}