知识点总结
day06 集合(Collection, 迭代器, 增强for, 泛型, List子集);集合的体系结构- 集合:
- 是一个统称, 包含很多集合的实现类. 根据不同数据结构, 提供了不同的集合类
Collection接口中常用的功能- Collection接口
- 是单列集合体系的顶层
- 如何创建Collection对象?
- 本身是接口, 实际使用的是子类对象. 使用多态,Collection c = new ArrayList<>();
- 常用方法
- 增
- boolean add(E e): 向集合中添加元素, 添加成功返回true, 添加失败返回false. 永远能够添加成功
- 删
- boolean remove(Object o): 删除元素中的指定元素, 删除成功返回true, 删除失败返回false
- void clear(): 清空集合中的元素
- 判断
- boolean contains(Object o): 判断集合中是否包含指定元素, 包含返回true, 否则false
- boolean isEmpty(): 判断集合是否为空集合, 即没有元素. 没有元素返回true, 否则false
- 获取个数
- 转换
- Object[] toArray(): 将集合转换为Object[]
迭代器的概述和测试- Iterator接口:
- 迭代器
- 作用:
- 获取迭代器:
- 使用集合对象调用Interator<E> iterator()方法
- 成员方法
- boolean hasNext(): 是否有下一个元素
- E next(): 返回下一个元素
- void remove(): 从迭代器指向的 collection 中移除迭代器返回的最后一个元素
并发修改异常- 并发修改异常:
- ConcurrentModificationException
- 并发:
- 修改:
- 指的是会改变集合长度的操作
- 增加元素
- 删除元素
- 清空元素
- list的set(int index, Object o)方法可以修改集合中某个索引处的元素值, 但并不会改变集合的长度, 所以不会发生并发修改异常
- 发生原因:
- 迭代器依赖于集合, 相当于集合的一个副本, 当迭代器在操作时, 如果发现迭代器的副本和集合不一样, 则抛出并发修改异常
- 如何避免:
- 方式1: 不使用迭代器
- 方式2: 在使用迭代器遍历时, 使用迭代器的方法修改
- 添加元素:
- List接口中的ListIterator listIterator()获取用于List的迭代器, 然后调用ListIterator的add()方法
- 删除元素: remove()
- List接口
```java // foreach格式 for (元素类型 变量名: 数组或集合对象) { // 每次循环都会遍历出一个元素, 保存到变量名中 } int[] arr = {1,2,3}; for (int i : arr) { System.out.println(i); } - 注意:
- 增强for循环中不能修改集合(改变集合长度), 会发生并发修改异常
- 原因: 因为增强for循环内部使用的是迭代器进行迭代
- 增强for的优缺点:
- 优点: 简单快捷的拿到每一个元素
- 缺点:
- 循环过程中不能修改集合
- 不能像普通for循环那样使用索引
常见数据结构: 数组- 数组的特点:
- 长度一旦确定则不可改变
- 元素有整数索引
- 只能存储同一类型的元素
- 既可以存储基本数据类型, 也可存储引用数据类型
- 数组的增删改查:
- 增加/插入元素:
- 创建一个新数组, 长度为原数组长度+1
- 遍历原数组, 将原数组的元素复制到新数组的相同索引位置, 直到遇到要增加元素的索引位置
- 将要增加的元素值赋值到索引位置
- 继续复制剩余元素
- 删除元素:
- 创建一个新数组, 长度为原数组长度-1
- 遍历原数组, 将原数组的元素复制到新数组的相同索引位置, 直到遇到要删除元素的索引位置
- 跳过要删除的元素, 继续将剩余元素复制到后续索引位置
- 修改元素: arr[0] = 10;
- 获取元素: int i = arr[0];
- 通过以上增删改查的操作, 总结出数组的特点:
List的特点和特有功能- List接口
- 继承自Collection接口. 在java.util包下
- 特点
- 元素有序(存入和取出的顺序一样)
- 有整数的索引
- 元素可以重复
- 特有功能
- void add(int index, E element): 添加元素
- E remove(int index): 删除元素
- E set(int index, E element): 修改元素
- E get(int index): 获取元素
List的子类概述, LinkedList特有功能- List的子类
- ArrayList: 底层数组结构. 查询快, 增删慢
- LinkedList: 底层链表结构. 查询慢, 增删快
- 特有方法, 用于处理开头和结尾的元素
- void addFirst(E e): 将元素添加到开头
- void addLast(E e): 将元素添加到末尾
- E getFirst(): 获取开头的元素
- E getLast(): 获取结尾的元素
- E removeFirst(): 删除第一个元素, 并返回删除的元素
- E removeLast(): 删除最后一个元素, 并返回删除的元素
使用LinkedList实现栈和队列- 栈: 先进后出
- 进: 元素添加到末尾, addLast(E e)
- 出: 删除末尾的元素, removeLast(E e)
- 队列: 先进先出
- 进: 元素添加到末尾, addLast(E e)
- 出: 删除开头的元素, E removeFirst()
File类的概述和常用功能
- 注意: 目录路径字符串写2个斜线: a\\b, 或a/b
- 原因: 一个斜线可以和字母组合编程特殊字符, 如\t, 所以要把斜线转义为普通的斜线, 即\\t
- java.io.File类: 是文件和目录的路径名的抽象表现形式(也就是文件和目录在Java中的形式, 既能表示文件, 也能表示目录)
- 构造方法(创建了File对象, 并将其指向该路径. 注意: 不会在磁盘上创建这个文件)
- File(String pathname): 使用指定的路径名创建一个File对象.
- File(String parent, String child): 根据指定的父路径和文件路径创建File对象.
- File(File parent, String child): 根据指定的父路径File对象和文件路径创建File对象
- 常用成员方法
- 创建:
- boolean createNewFile(): 创建一个新文件. 返回是否创建成功
- boolean mkdir(): 创建目录, 返回是否创建成功
- boolean mkdirs(): 创建多层目录, 包括指定路径中缺少的父级目录. 返回是否创建成功
- 注意: 创建目录就只创建目录, 不会创建文件. 即使有a.txt也会把他作为目录名创建目录
- 删除
- boolean delete(): 删除文件或目录. 返回是否删除成功
- 获取
- String getPath(): 获取创建File对象时使用的路径(创建时是相对路径则返回相对路径, 是绝对路径则返回绝对路径)
- String getAbsolutePath(): 获取File对象的绝对路径字符串
- File getAbsoluteFile(): 获取包含绝对路径的File对象
- String getParent(): 获取File对象的父路径字符串
- File getParentFile(): 获取File对象的父路径的File对象
- String getName(): 获取File对象代表的文件名或目录名(不含上层目录)
- long length(): 获取File对象所表示的文件的大小, 单位byte
- 注意: 如果File对象是一个目录, 则返回值不确定; 如果文件不存在, 则返回0L
- long lastModified(): 获取文件上次修改时间
- 判断
- boolean exists(): 判断文件或目录是否存在
- boolean isAbsolute(): 判断File中保存的是否是绝对路径
- 注意: 无论该文件是否真实存在, 只判断创建File时使用的路径字符串
- boolean isDirectory(): 判断该File对象是否为目录
- boolean isFile(): 判断该File对象是否为文件
- boolean isHidden(): 判断该文件或目录是否为隐藏的
- 修改
- boolean renameTo(File dest): 修改文件名
- 重要获取功能(稍后知识点讲解)
- String[] list(): 获取当前路径下所有文件和目录名称(不包括父路径). File对象必须是目录, 否则会报错
- File[] listFiles(): 获取当前路径下的所有文件和目录的File对象. File对象必须是目录
- static File[] listRoots(): 返回系统的所有根路径. windows系统就是各种盘符
File的重要获取功能- File类的重要获取功能
- String[] list(): 获取当前路径下所有文件和目录名称(不包括父路径).
- File[] listFiles(): 获取当前路径下的所有文件和目录的File对象.
- static File[] listRoots(): 返回系统的所有根路径. windows系统就是各种盘符
字节流: InputStream和OutputStream概述- FileInputStream类
- int read(): 读取一个字节, 读完返回-1
- int read(byte[] b): 读取字节到数组中, 返回读取的长度. 读完返回-1
- close(): 释放资源
- FileOutputStream类
- void write(byte b): 写一个字节
- void write(byte[] b, int offset, int len): 从字节数组的指定索引开始写入指定长度个字节
- close(): 释放资源
- 静态方法
- static InetAddress getLocalHost(): 获取本机的InetAddress对象
- static InetAddress getByName(String host): 根据主机名或IP的字符串获取主机的InetAddress对象
- static InetAddress getLoopbackAddress(): 获取回环地址的InetAddress对象
- 成员方法
- String getHostAddress(): 返回主机的IP地址
- String getHostName(): 返回主机名
- String getCanonicalHostName(): 获取此IP地址的完全限定域名
|