数组的进阶操作
Posted Full-Stack-python
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组的进阶操作相关的知识,希望对你有一定的参考价值。
title: 数组的进阶操作
删除数组的元素
现在有这样一个需求:遍历数组的同时,删除数组中的所有元素。
思路:我们可以想到的办法是使用数组的 splice() 方法,此外还有 JS 的 delete 关键字。
需要注意的是:使用数组的 splice() 方法删除数组元素之后,数组的长度会发生变化;使用 delete 删除数组中的元素之后,数组的长度不会发生变化。
下面来看看具体写法。
使用数组的 splice() 方法
写法1:(错误)
let arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++)
console.log(arr.length);
arr.splice(i, 1);
console.log(arr);
打印结果及解释:
数组长度的打印结果:5、4、3
arr最终的值:[2, 4]
写法1的错误在于:没有意识到,splice方法会使 arr 的长度不断变化。
写法2:(错误)
let arr = [1, 2, 3, 4, 5];
const len = arr.length;
for (let i = 0; i < len; i++)
console.log(arr.length);
arr.splice(i, 1);
console.log(arr);
打印结果:
数组长度的打印结果:5、4、3、2、2
arr最终的值:[2, 4]
上方代码,依然没有达到预期的结果。
写法3:(正确写法,从末尾开始删除元素)
let arr = [1, 2, 3, 4, 5];
for (let i = arr.length - 1; i >= 0; i--)
console.log(arr.length);
arr.splice(i, 1);
console.log(arr);
console.log(arr.length);
打印结果及解释:
数组长度的打印结果:// 5、4、3、2、1
arr最终的值:[]
arr最终的长度:0
使用 delete 关键字
let arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++)
console.log(arr.length);
// 注意点: 通过 delete 删除数组中的元素, 数组的长度不会发生变化
delete arr[i];
console.log(JSON.stringify(arr));
打印结果及解释:
数组长度的打印结果:5、5、5、5、5
最终的arr,是空数组,长度为5:[null, null, null, null ,null]
Java基础进阶类名整理
Java进阶基础类名整理
类名综合
数学类:
Math:数学运算
BigDecimal:用于精确计算数据
数组工具类:
Arrays:数组工具类,用于对数组的操作
时间操作:
JDK8以前:
Date:表示一个时间,并面向对象操作时间
SimpleDateFormat:专门用于将时间对象与字符串进行相互转换的工具类
- 常见方法:parse(字符串):将字符串转换为时间对象
- format(Date对象):将时间对象转换为字符串
JDk8以后:
LocalDateTime:包含年月日时分秒的时间对象
常见方法:
- 静态now():获取当前时间
- 静态of(信息)获取指定时间对象
- format(DateTimeFormatter):按照指定格式格式化时间
- parse(字符串,DateTimeFormatter):按照指定格式解析该方法
LocalDate:表示年月日
LocalTime:表示时分秒
DateTimeFormatter:格式化时间类
- 获取方式:利用静态ofPattern(string pattern)
Period:计算年月日
Duration:计算时分秒
集合类类名
单列:
Collection:是单列集合的顶级接口,有两个接口List和Set
- 可重复List:
- ArrayList:单列可重复有索引的集合,底层是数组
- LinkedList:单列可重复有索引的集合,底层是链表
- 不可重复Set:
- TreeSet:不可重复,没有索引,可以对元素进行排序(自然排序Comparable/比较器排序Comparator),底层红黑树
- HashSet:存取无序,不可重复,没有索引,底层哈希表(Jdk7以前:哈希表=数组+链表/Jdk8以后数组+红黑树),自定义类需重写hashCode
双列:
- 特点:
- 键不能重复
- 键与值一一对应
- 键和值组成键值对
- HashMap:底层哈希表,存储对象,必须重写HashCode和equals方法
- TreeMap:底层红黑树,可以排序,自然排序Comparable/比较器排序Comparator
流
- Stream:对集合进行批量数据操作
文件
- File:表示文件或者文件夹
- 特点:只是表示路径名称,可以表示存在的,也可表示不存在的
Io流
字节流父类:
- InputStream:字节输入流
- OutPutStream:字节输出流
字节流子类:
- FileInputStream:字节输入流
- BufferedInputStream:字节缓冲输入流
- FileOutputStream:字节输出流
- BufferedOutputStream:字节缓冲输出流
字符流父类:
- Writer:字符数出流
- Read:字符输入流父类
字符流子类:
- FileWiter:字符输入流
- FileRead:字符输出流
- BufferedWiter:字符缓冲输入流
- BufferedRead:字符缓冲输出流
- InputStreamReader:字节转字符流的桥梁,使用指定编码进行解码
- OutputStreamWriter:字符流到字节流的桥梁,使用指定编码将写入的字符编码为字节
- JDK11之后可以直接使用FileReader进行指定编码
- ObjectOutputStream:对象输入流
- ObjectInputStream:对象输出流
- 想要序列化一个类必须实现Serializable接口
多线程
- synchronized:自动锁
- Lock:手动锁
- ArrayBlockingQueue:阻塞队列,底层数组,有界
- LinkedBlockingQueue:阻塞队列,底层链表,无界
- Executors:默认线程池
- ThreadPoolExecutor:自定义线程池
- AtomicBoolean:原子更新布尔类型
- AtomicInteger:原子更新整型
- AtomicLong:原子更新长整型
- Hashtable:采用悲观锁,效率低下
- ConcurrentHashMap:采用Synchronized+CAS,效率比Hashtable高比HashMap低
- CountDownLatch:一条线程等待其他线程执行完在执行
- Semaphore:控制线程同时访问数量
网络编程
InetAddress:表示ip地址
- 常用getHostName:获取主机名
- getHostAddress:返回ip地址
UDP协议:
- DatagramPacket:数据容器
- DatagramSocket:用于发送和接收DatagramPacket
- sen():发送数据报
- close():关闭数据报
- receive:接收数据报
TCP协议:
- Socket:对象在客户端和服务器之间建立连接
- ServerSocket:对象等待客户端建立连接
- 常用方法accept()等待连接
反射
- ClassLoader.getSystemClassLoader():获取系统类加载器
- InputStream.getResourceAsStream():加载某一个资源文件
- Class.forName(全类名):获取Class对象
- getConstructors:返回公共构造方法数组对象
- getFields():返回所有公共的成员变量数组
- getMethods():返回所有公共方法,包含父类公共方法
- 获取私有使用带Declared的get方法
- 利用反射使用私有成员设置setAccessible(true)
关键字
- transient:被标记的变量不可被实例化
- this 表示当前
- super 表父类
- final 表示最终
- static 表静态
- volatile:内存可见性
- enum:枚举
- abstract:抽象
以上是关于数组的进阶操作的主要内容,如果未能解决你的问题,请参考以下文章