Java笔记总结

《Java 8-21 高频特性实战(下):新特性落地指南》

六、场景 6:字符串处理(Java 11+ 新增实用方法)

特性说明

Java 11 及以上版本给 String 类新增了 isBlank()strip()lines() 等方法,解决了传统字符串处理 "空格判断繁琐、换行符分割复杂" 的问题。

问题场景

判断字符串是否为 "空白(含全空格)"、去除字符串首尾空格(含全角空格)、按换行符分割字符串。

实战代码

java 复制代码
public class StringMethodDemo {
    public static void main(String[] args) {
        String blankStr = "   "; // 全空格字符串
        String fullWidthBlank = " Java 字符串 "; // 含全角空格
        String multiLineStr = "第一行\n第二行\r第三行\r\n第四行"; // 混合换行符

        // 1. 判断是否为空白(空白=null/空字符串/全空格)
        System.out.println("blankStr 是否空白:" + blankStr.isBlank()); // 输出:true
        System.out.println("\"\" 是否空白:" + "".isBlank()); // 输出:true
        System.out.println("\"abc\" 是否空白:" + "abc".isBlank()); // 输出:false

        // 2. 去除首尾空格(支持全角空格,区别于 trim())
        String stripped = fullWidthBlank.strip();
        System.out.println("去除全角空格后:" + stripped); // 输出:Java 字符串

        // 3. 按换行符分割(自动处理 \n、\r、\r\n)
        multiLineStr.lines().forEach(line -> System.out.println("分割后行:" + line));
        // 输出:
        // 分割后行:第一行
        // 分割后行:第二行
        // 分割后行:第三行
        // 分割后行:第四行

        // 4. 重复字符串(Java 11+)
        String repeated = "Java".repeat(3);
        System.out.println("重复3次:" + repeated); // 输出:JavaJavaJava
    }
}

核心亮点

  • isBlank():比 isEmpty() 更实用(isEmpty() 不识别全空格字符串);
  • strip():支持全角空格(trim() 仅支持半角空格);
  • lines():自动兼容所有换行符(\n/\r/\r\n),无需手动写正则分割。

七、场景 7:集合工厂方法(Java 9+ 简化集合创建)

特性说明

Java 9 引入 List.of()Set.of()Map.of() 静态工厂方法,无需手动 new ArrayList<>() 再添加元素,直接创建不可变集合(线程安全),代码更简洁。

问题场景

创建 "固定元素的集合"(如状态列表、字典映射),传统写法需 3 行代码,工厂方法 1 行搞定。

实战代码

java 复制代码
import java.util.List;
import java.util.Map;
import java.util.Set;

public class CollectionFactoryDemo {
    public static void main(String[] args) {
        // 1. 创建不可变 List(元素不可添加/删除/修改)
        List<String> statusList = List.of("待支付", "已支付", "已发货", "已完成");
        System.out.println("订单状态列表:" + statusList); // 输出:[待支付, 已支付, 已发货, 已完成]

        // 2. 创建不可变 Set(自动去重)
        Set<String> tagSet = Set.of("Java", "Spring", "Redis", "Java"); // 重复元素编译报错
        System.out.println("技术标签集合:" + tagSet); // 输出:[Java, Spring, Redis]

        // 3. 创建不可变 Map(最多支持 10 个键值对,超过可使用 Map.ofEntries())
        Map<String, String> dictMap = Map.of(
                "001", "北京",
                "002", "上海",
                "003", "广州"
        );
        System.out.println("城市字典:" + dictMap); // 输出:{001=北京, 002=上海, 003=广州}

        // 4. 不可变集合特性:尝试修改会抛出 UnsupportedOperationException
        // statusList.add("已取消"); // 编译通过,运行时报错
    }
}

核心亮点

  • 简洁高效:1 行代码创建集合,替代传统 "创建 + add" 多步操作;
  • 线程安全:不可变集合无并发修改风险,无需额外同步;
  • 自动校验:Set.of() 禁止重复元素,Map.of() 禁止重复键,编译时校验。

八、场景 8:try-with-resources 增强(Java 9+ 简化资源关闭)

特性说明

Java 9 优化了 try-with-resources 语法,允许将 "已声明的资源变量" 直接传入 try 括号中,无需在括号内重新声明,代码更简洁。

问题场景

读取文件 / 数据库连接等资源时,传统 try-with-resources 需在括号内声明资源,Java 9+ 可直接使用外部已声明的资源变量。

实战代码

java 复制代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TryWithResourcesDemo {
    public static void main(String[] args) throws IOException {
        // 1. 外部声明资源变量(Java 9+ 支持直接传入 try 括号)
        BufferedReader reader = new BufferedReader(new FileReader("test.txt"));

        // 2. try-with-resources 直接使用外部资源(自动关闭,无需手动 close())
        try (reader) { // 无需重新声明:BufferedReader reader = ...
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println("文件内容:" + line);
            }
        } catch (IOException e) {
            System.out.println("文件读取异常:" + e.getMessage());
        }
        // 3. 资源已自动关闭,无需手动调用 reader.close()
    }
}

核心亮点

  • 代码简化:避免资源变量重复声明,尤其适合 "资源创建逻辑复杂" 的场景;
  • 自动关闭:所有实现 AutoCloseable 接口的资源(文件、流、数据库连接)均可自动关闭,杜绝资源泄漏;
  • 兼容性:向下兼容 Java 8 的语法,可混合使用。

九、场景 9:模式匹配(Java 14+ 简化类型判断与转换)

特性说明

Java 14 引入 "模式匹配 instanceof",Java 16 正式转正,允许在 instanceof 判断后直接声明变量,避免手动强制类型转换,减少代码冗余和错误。

问题场景

判断对象类型后进行强制转换(如判断 Object 是否为 String/Integer),传统写法需 2 行代码,模式匹配 1 行搞定。

实战代码

java 复制代码
public class PatternMatchingDemo {
    public static void main(String[] args) {
        Object obj1 = "Java 模式匹配";
        Object obj2 = 2025;
        Object obj3 = 3.14;

        printObjectType(obj1);
        printObjectType(obj2);
        printObjectType(obj3);
    }

    // 模式匹配 instanceof:判断+转换一步完成
    private static void printObjectType(Object obj) {
        if (obj instanceof String str) { // 直接声明变量 str,无需手动转换
            System.out.println("类型:字符串,内容:" + str + ",长度:" + str.length());
        } else if (obj instanceof Integer num) { // 声明变量 num
            System.out.println("类型:整数,值:" + num + ",平方:" + num * num);
        } else if (obj instanceof Double d) { // 声明变量 d
            System.out.println("类型:浮点数,值:" + d + ",整数部分:" + d.intValue());
        } else {
            System.out.println("未知类型:" + obj.getClass().getName());
        }
    }
}

核心亮点

  • 简化代码:instanceof 判断与类型转换合并为一行,避免 "重复变量名 + 强制转换";
  • 类型安全:变量仅在 if 分支内有效,避免外部误使用;
  • 可读性:逻辑更清晰,减少 "模板代码",聚焦业务逻辑。

十、场景 10:文本块(Java 15+ 简化多行字符串)

特性说明

Java 15 引入文本块(Text Blocks),用 """ 包裹多行字符串,无需手动添加 \n/\t 转义字符,支持直接换行和缩进,尤其适合 HTML、JSON、SQL 等多行文本。

问题场景

定义多行 SQL 语句或 JSON 字符串,传统写法需拼接 \n 和引号,代码混乱且易出错。

实战代码

java 复制代码
public class TextBlockDemo {
    public static void main(String[] args) {
        // 1. 多行 SQL 语句(无需转义,直接换行)
        String sql = """
                SELECT id, name, age
                FROM user
                WHERE age > 18
                ORDER BY create_time DESC;
                """;
        System.out.println("SQL 语句:" + sql);

        // 2. 多行 JSON 字符串(格式清晰,无拼接错误)
        String json = """
                {
                    "name": "Java 文本块",
                    "version": "15+",
                    "features": [
                        "无需转义",
                        "直接换行",
                        "支持缩进"
                    ]
                }
                """;
        System.out.println("JSON 字符串:" + json);
    }
}

核心亮点

  • 格式清晰:多行文本直接按原始格式编写,无需 \n/\t 转义;
  • 减少错误:避免字符串拼接导致的引号不匹配、转义字符遗漏问题;
  • 适配场景:HTML、XML、SQL、JSON 等多行文本场景均可使用,大幅提升代码可读性。

总结:Java 版本特性学习建议

  1. 优先掌握高频特性:Lambda+Stream、Optional、LocalDateTime(Java 8)是工作中最常用的,必须熟练;
  2. 跟进实用新特性:虚拟线程(Java 21)、模式匹配(Java 16)、文本块(Java 15)能显著提升开发效率,适合项目升级后使用;
  3. 代码实战优先:所有特性均通过 "场景 + 代码" 落地,避免只记概念不写代码;
  4. 兼容性考虑:若项目仍使用 Java 8,可优先掌握前 4 个场景;若已升级到 Java 11+,可逐步引入集合工厂、字符串新方法等。
相关推荐
长桥夜波21 小时前
【第二十五周】机器学习笔记
人工智能·笔记·机器学习
菜的不敢吱声21 小时前
swift学习第一天
开发语言·学习·swift
Pith_21 小时前
模式识别与机器学习复习笔记(上)
人工智能·笔记·机器学习
培林将军21 小时前
C语言指针
c语言·开发语言·算法
云栖梦泽21 小时前
鸿蒙分布式应用全链路性能调优实战
开发语言·鸿蒙系统
jyd012421 小时前
Spring Boot 文件上传大小限制问题:413 与 MaxUploadSizeExceededException 解决方案
java·spring boot·后端
wdfk_prog21 小时前
[Linux]学习笔记系列 -- [fs]namespace
linux·笔记·学习
L.fountain21 小时前
图像自回归生成(Auto-regressive image generation)实战学习(四)
人工智能·深度学习·学习·数据挖掘·回归
yongui4783421 小时前
基于卡尔曼滤波的电池荷电状态(SOC)估计的MATLAB实现
开发语言·算法·matlab