当前位置:网站首页>黑马笔记---List系列集合与泛型
黑马笔记---List系列集合与泛型
2022-06-30 12:17:00 【小夫敲代码】
目录
1.List系列集合
1.1List集合特点、特有API
Collection集合体系

List系列集合特点
ArrayList、LinekdList :有序,可重复,有索引。
有序:存储和取出的元素顺序一致
有索引:可以通过索引操作元素
可重复:存储的元素可以重复
List集合特有方法

import java.util.ArrayList;
public class ListDemo01 {
public static void main(String[] args) {
// 1.创建一个ArrayList集合对象:
// List:有序,可重复,有索引的。
ArrayList<String> list = new ArrayList<>(); // 一行经典代码!
list.add("Java");
list.add("Java");
list.add("HTML");
list.add("HTML");
list.add("MySQL");
list.add("MySQL");
// 2.在某个索引位置插入元素。
list.add(2, "zhangsan");
System.out.println(list);
// 3.根据索引删除元素,返回被删除元素
System.out.println(list.remove(1));
System.out.println(list);
// 4.根据索引获取元素:public E get(int index):返回集合中指定位置的元素。
System.out.println(list.get(1));
// 5.修改索引位置处的元素: public E set(int index, E element)
System.out.println(list.set(1, "zhansan"));
System.out.println(list);
}
}
总结:
1、List系列集合特点
ArrayList、LinekdList :有序,可重复,有索引。
2、List的实现类的底层原理
ArrayList底层是基于数组实现的,根据查询元素快,增删相对慢。
LinkedList底层基于双链表实现的,查询元素慢,增删首尾元素是非常快的。
1.2List集合的遍历方式小结
List集合的遍历方式有几种?
1.迭代器
2.增强for循环
3.Lambda表达式
4.for循环(因为List集合存在索引)
1.3ArrayList集合的底层原理
ArrayList集合底层原理
ArrayList底层是基于数组实现的:根据索引定位元素快,增删需要做元素的移位操作。
第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。

1.4LinkedList集合的底层原理
LinkedList的特点
底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。
LinkedList集合的特有功能

2.集合的并发修改异常问题
当我们从集合中找出某个元素并删除的时候可能出现一种并发修改异常问题。
哪些遍历存在问题?
迭代器遍历集合且直接用集合删除元素的时候可能出现。
增强for循环遍历集合且直接用集合删除元素的时候可能出现。
哪种遍历且删除元素不出问题
迭代器遍历集合但是用迭代器自己的删除方法操作可以解决。
使用for循环遍历并删除元素不会存在这个问题。
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
// 1、准备数据
ArrayList<String> list = new ArrayList<>();
list.add("qq");
list.add("Java");
list.add("Java");
list.add("赵敏");
list.add("赵敏");
list.add("素素");
System.out.println(list);
// [黑马, Java, Java, 赵敏, 赵敏, 素素]
// it
// 需求:删除全部的Java信息。
// a、迭代器遍历删除
Iterator<String> it = list.iterator();
// while (it.hasNext()){
// String ele = it.next();
// if("Java".equals(ele)){
// // 删除Java
// // list.remove(ele); // 集合删除会出毛病
// it.remove(); // 删除迭代器所在位置的元素值(没毛病)
// }
// }
// System.out.println(list);
// b、foreach遍历删除 (会出现问题,这种无法解决的,foreach不能边遍历边删除,会出bug)
// for (String s : list) {
// if("Java".equals(s)){
// list.remove(s);
// }
// }
// c、lambda表达式(会出现问题,这种无法解决的,Lambda遍历不能边遍历边删除,会出bug)
// list.forEach(s -> {
// if("Java".equals(s)){
// list.remove(s);
// }
// });
// d、for循环(边遍历边删除集合没毛病,但是必须从后面开始遍历删除才不会出现漏掉应该删除的元素)
for (int i = list.size() - 1; i >= 0 ; i--) {
String ele = list.get(i);
if("Java".equals(ele)){
list.remove(ele);
}
}
System.out.println(list);
}
}
3.泛型深入
3.1泛型的概述和优势
泛型概述
1.泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。
2.泛型的格式:<数据类型>; 注意:泛型只能支持引用数据类型。
3.集合体系的全部接口和实现类都是支持泛型的使用的。
泛型的好处:
1.统一数据类型。
2.把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。
泛型可以在很多地方进行定义:

3.2自定义泛型类
泛型类的概述
定义类时同时定义了泛型的类就是泛型类。
泛型类的格式:修饰符 class 类名<泛型变量>{ }
此处泛型变量T可以随便写为任意标识,常见的如E、T、K、V等。
作用:编译阶段可以指定数据类型,类似于集合的作用。
泛型类的原理:把出现泛型变量的地方全部替换成传输的真实数据类型。
模拟ArrayList集合自定义一个集合MyArrayList集合,完成添加和删除功能的泛型设计即可。
import java.util.ArrayList;
public class MyArrayList<E> {
private ArrayList lists = new ArrayList();
public void add(E e){
lists.add(e);
}
public void remove(E e){
lists.remove(e);
}
@Override
public String toString() {
return lists.toString();
}
}
public class Test {
public static void main(String[] args) {
// 需求:模拟ArrayList定义一个MyArrayList ,关注泛型设计
MyArrayList<String> list = new MyArrayList<>();
list.add("Java");
list.add("Java");
list.add("MySQL");
list.remove("MySQL");
System.out.println(list);
MyArrayList<Integer> list2 = new MyArrayList<>();
list2.add(23);
list2.add(24);
list2.add(25);
list2.remove(25);
System.out.println(list2);
}
}
总结:
1、泛型类的核心思想:把出现泛型变量的地方全部替换成传输的真实数据类型
2、泛型类的作用:编译阶段约定操作的数据的类型,类似于集合的作用。
3.3自定义泛型方法
泛型方法的概述
定义方法时同时定义了泛型的方法就是泛型方法。
泛型方法的格式:修饰符 <泛型变量> 方法返回值 方法名称(形参列表){}
作用:方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性。
泛型方法的原理:把出现泛型变量的地方全部替换成传输的真实数据类型。
给你任何一个类型的数组,都能返回它的内容。也就是实现Arrays.toString(数组)的功能!
public class GenericDemo {
public static void main(String[] args) {
String[] names = {"小璐", "蓉容", "小何"};
printArray(names);
Integer[] ages = {10, 20, 30};
printArray(ages);
Integer[] ages2 = getArr(ages);
String[] names2 = getArr(names);
}
public static <T> T[] getArr(T[] arr){
return arr;
}
public static <T> void printArray(T[] arr){
if(arr != null){
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]).append(i == arr.length - 1 ? "" : ", ");
}
sb.append("]");
System.out.println(sb);
}else {
System.out.println(arr);
}
}
}3.4自定义泛型接口.
自定义泛型接口
使用了泛型定义的接口就是泛型接口。
泛型接口的格式:修饰符 interface 接口名称<泛型变量>{}
作用:泛型接口可以让实现类选择当前功能需要操作的数据类型
泛型接口的原理:实现类可以在实现接口的时候传入自己操作的数据类型,这样重写的方法都将是针对于该类型的操作。
3.5泛型通配符、上下限
通配符:?
? 可以在“使用泛型”的时候代表一切类型。
E T K V 是在定义泛型的时候使用的。
泛型的上下限:
? extends Car: ?必须是Car或者其子类 泛型上限
? super Car : ?必须是Car或者其父类 泛型下限
边栏推荐
- How do different types of variables compare with zero
- 视频按每100帧存一个文件夹,处理完再图片转视频
- grep匹配查找
- Double dqn notes
- SuperMap iDesktop 常见倾斜数据处理全流程解析
- 【OpenGL】OpenGL Examples
- 【一天学awk】运算符
- Substrate 源码追新导读: 修复BEEFY的gossip引擎内存泄漏问题, 智能合约删除队列优化
- Wechat launched the picture big bang function; Apple's self-developed 5g chip may have failed; Microsoft solves the bug that causes edge to stop responding | geek headlines
- 电机控制Clarke(α/β)等幅值变换推导
猜你喜欢

Some commonly used hardware information of the server (constantly updated)

机器学习笔记 - 自相关和偏自相关简介

Hisilicon 3559 universal platform construction: introduction to YUV format

Redis-緩存問題

Construction de la plate - forme universelle haisi 3559: obtenir le codage après modification du cadre de données

Shell基础入门

Redis cache problem

Q-learning notes

Linux系统Redis的安装

【目标跟踪】|pytracking 配置 win 编译prroi_pool.pyd
随机推荐
【OpenGL】OpenGL Examples
LeetCode_栈_中等_227.基本计算器 II(不含括号)
NoSQL - redis configuration and optimization
Basic interview questions for Software Test Engineers (required for fresh students and test dishes) the most basic interview questions
【一天学awk】运算符
Redis的配置文件及新数据类型
解决numpy.core._exceptions.UFuncTypeError: ufunc ‘add‘ did not contain a loop with signature matchin问题
江西财经大学智慧江财登录分析
Grep match lookup
Remove invalid parentheses [simulate stack with array]
Visual studio configures QT and implements project packaging through NSIS
Clipboardjs - development learning summary 1
市值蒸发650亿后,“口罩大王”稳健医疗,盯上了安全套
MySQL判断执行条件为NULL时,返回0,出错问题解决 Incorrect parameter count in the call to native function ‘ISNULL‘,
[surprised] the download speed of Xunlei is not as fast as that of the virtual machine
Instructions for legend use in SuperMap iclient3d 11i for cesium 3D scene
Solve the problem that the server cannot be connected via SSH during reinstallation
Flinksql customizes udatf to implement topn
电机控制park变换公式推导
Redis installation on Linux system