
javaSE(五)集合类与IO
一、集合类
集合类是 Java 中用于存储、管理和操作一组对象的数据结构。Java 集合框架提供了丰富的接口和类,方便开发者根据不同需求选择合适的数据结构。
1、集合框架的体系结构
-
接口:
-
Collection:是集合层次结构中的根接口,定义了一些基本的集合操作方法,如添加元素、删除元素、判断是否包含元素等。它有两个主要的子接口:
List和Set。 - List:有序的 Collection,允许重复元素,用户可以通过索引访问元素。常见的实现类有
ArrayList、LinkedList。 - Set:不允许包含重复元素的 Collection,元素的存储顺序通常没有保证。常见的实现类有
HashSet、TreeSet。 - Map:存储键值对(key-value pairs)的集合,一个键最多映射到一个值。常见的实现类有
HashMap、TreeMap。 -
实现类:
-
ArrayList:基于数组实现的可变大小的列表,查询元素效率高,增删元素尤其是在中间位置增删时效率较低。
- LinkedList:基于双向链表实现的列表,增删元素效率高,查询元素效率相对较低,还提供了一些操作链表两端元素的特殊方法。
- HashSet:基于哈希表实现的 Set,插入和查询元素的平均时间复杂度为 O (1),但不保证元素的顺序。
- TreeSet:基于红黑树实现的 Set,元素会按照自然顺序或自定义顺序进行排序,插入和查询元素的时间复杂度为 O (log n)。
- HashMap:基于哈希表实现的 Map,允许 null 键和 null 值,插入和查询键值对的平均时间复杂度为 O (1)。
- TreeMap:基于红黑树实现的 Map,键会按照自然顺序或自定义顺序进行排序,插入和查询键值对的时间复杂度为 O (log n)。
2.常用操作示例
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
public class CollectionExample {
public static void main(String[] args) {
// List示例
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
System.out.println("List元素: " + list);
System.out.println("获取第一个元素: " + list.get(0));
// Map示例
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
System.out.println("Map键值对: " + map);
System.out.println("获取键为one的值: " + map.get("one"));
}
}
二、IO(Input/Output,输入/输出)
IO 操作用于处理设备之间的数据传输,比如从文件读取数据、向文件写入数据,与网络进行数据交互等。Java 的 IO 体系非常庞大,主要分为字节流和字符流两大类。
1. 字节流
- InputStream:是所有字节输入流的抽象类,常见的实现类有
FileInputStream(用于从文件读取字节数据)、ByteArrayInputStream(用于从字节数组读取数据)等。 - OutputStream:是所有字节输出流的抽象类,常见的实现类有
FileOutputStream(用于向文件写入字节数据)、ByteArrayOutputStream(用于向字节数组写入数据)等。
2. 字符流
- Reader:是所有字符输入流的抽象类,常见的实现类有
FileReader(用于从文件读取字符数据)、BufferedReader(提供缓冲功能,提高读取效率,还提供了按行读取的方法)等。 - Writer:是所有字符输出流的抽象类,常见的实现类有
FileWriter(用于向文件写入字符数据)、BufferedWriter(提供缓冲功能,提高写入效率)等。
3.常用操作示例
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class IOExample {
public static void main(String[] args) {
// 读取文件内容
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
// 写入文件内容
try (FileWriter fw = new FileWriter("output.txt")) {
fw.write("Hello, IO!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.缓冲流、转换流
- 缓冲流:如
BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter,通过内部缓冲区减少实际的 IO 操作次数,从而提高读写效率。 - 转换流:
InputStreamReader和OutputStreamWriter,用于在字节流和字符流之间进行转换,比如将字节输入流转换为字符输入流,以便按照字符进行读取操作。
try (BufferedWriter bw = new BufferedWriter(new FileWriter(filePath));
BufferedReader br = new BufferedReader(new FileReader(filePath))) {
// 写入字符
bw.write(content);
bw.newLine(); // 跨平台的换行符
bw.write("这是第二行内容");
// 读取字符:按行读取
String line;
System.out.println("\nBufferedReader读取:");
while ((line = br.readLine()) != null) { // 读取一行,直到null表示结束
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
5.文件字节流
- 直接操作文件,属于节点流
- 操作字节数据,适合处理二进制文件
- 使用 try-with-resources 语法,自动关闭流资源
- 需要手动处理缓冲区和字节数组转换
try (FileOutputStream fos = new FileOutputStream(filePath);
FileInputStream fis = new FileInputStream(filePath)) {
// 写入字节:将字符串转换为字节数组写入
fos.write(content.getBytes());
// 读取字节:创建缓冲区,一次读取多个字节
byte[] buffer = new byte[1024];
int bytesRead = fis.read(buffer); // 返回实际读取的字节数
System.out.println("FileInputStream读取: " + new String(buffer, 0, bytesRead));
} catch (IOException e) {
e.printStackTrace();
}
6.IO 流使用的最佳实践
- 使用 try-with-resources:自动关闭流,避免资源泄露
- 选择合适的流:文本文件用字符流,二进制文件用字节流
- 使用缓冲流:提高 IO 操作效率,减少磁盘访问次数
- 注意编码问题:字符流转换为字节流时需指定编码,如:
- 及时关闭流:如果不使用 try-with-resources,需在 finally 块中关闭流