跳转至

图片

javaSE(五)集合类与IO

一、集合类

集合类是 Java 中用于存储、管理和操作一组对象的数据结构。Java 集合框架提供了丰富的接口和类,方便开发者根据不同需求选择合适的数据结构。

1、集合框架的体系结构

  • 接口

  • Collection:是集合层次结构中的根接口,定义了一些基本的集合操作方法,如添加元素、删除元素、判断是否包含元素等。它有两个主要的子接口:ListSet

  • List:有序的 Collection,允许重复元素,用户可以通过索引访问元素。常见的实现类有ArrayListLinkedList
  • Set:不允许包含重复元素的 Collection,元素的存储顺序通常没有保证。常见的实现类有HashSetTreeSet
  • Map:存储键值对(key-value pairs)的集合,一个键最多映射到一个值。常见的实现类有HashMapTreeMap
  • 实现类

  • 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.缓冲流、转换流

  • 缓冲流:如BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter,通过内部缓冲区减少实际的 IO 操作次数,从而提高读写效率。
  • 转换流InputStreamReaderOutputStreamWriter,用于在字节流和字符流之间进行转换,比如将字节输入流转换为字符输入流,以便按照字符进行读取操作。
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 流使用的最佳实践

  1. 使用 try-with-resources:自动关闭流,避免资源泄露
  2. 选择合适的流:文本文件用字符流,二进制文件用字节流
  3. 使用缓冲流:提高 IO 操作效率,减少磁盘访问次数
  4. 注意编码问题:字符流转换为字节流时需指定编码,如:
  5. 及时关闭流:如果不使用 try-with-resources,需在 finally 块中关闭流
// 指定编码的正确方式
BufferedReader br = new BufferedReader(
    new InputStreamReader(new FileInputStream(filePath), StandardCharsets.UTF_8)
);