JDK17新特性之--JDK9到JDK17 String 新增的新方法

JDK9之后对String底层存储数据结构进行了重大的修改1,同步也增加了许多新的方法,主要有Text Blocks、chars()、codePoints()、describeConstable()、formatted()、indent()、isBlank()、isEmpty()、lines()、repeat()、strip()、stripLeading()、stripIndent()、stripTrailing()、translateEscapes(),接下来就逐一看看每个方法怎么用。

Text Blocks

在JDK8之前我们想定义一个JSON String必须要各种转义、拼接,可读性非常差,看起来也比较乱,JDK17里我们可以使用"""来定义一个text block,看起来清爽多了

        //JDK8之前想要定义一个JSON数据格式
        String json = "{\n" +
                "    \"name\": \"admin\",\n" +
                "    \"id\": 1\n" +
                "}";
        String json2 = """
                {
                    "name": "admin",
                    "id": 1
                }""";
        //JDK17+
        System.out.println(json);
        System.out.println(json2);
        //true
        System.out.println(json.equals(json2));

使用Text Blocks需要注意以下几点:

  1. Text Blocks就是个语法糖,编译后还是和之前一样
  2. 前后"““必须放在两行,不能放同一行代码中,第一行的””"后面不能放字符串,不然会报Illegal text block start: missing new line after opening quotes

chars()

        String name = "12345工😃";
        //JDK9+ 获取String中所有char字符,一个emoji会获取到多个char
        IntStream chars = name.chars();
        chars.forEach(x -> System.out.println(Character.toChars(x)));
        //输出
        1
        2
        3
        4
        5?
        ?

codePoints()

        String name = "12345工😃";  
        //JDK9+ 获取String中所有char emoji会拆一个  
        IntStream chars = name.codePoints();  
        chars.forEach(x -> System.out.println(Character.toChars(x)));  
        //输出  
        1  
        2  
        3  
        4  
        5  
        工  
        😃

chars()和codePoints()都是获取String中的char,主要区别是codePoints()获取char支持的编码更多了,如果是emoji chars()会得到两个char,codePoints()只会获取一个,想要了解具体的char编码可以参考《其实你并不懂 Unicode》2;

describeConstable()、resolveConstantDesc()

        String name = "12345工😃";
        //JDK12+
        Optional<String> optionalString = name.describeConstable();
        System.out.println(optionalString.get());
        
        public Optional<String> describeConstable() {
             return Optional.of(this);
         }

这个方法比较简单,就是返回一个Optional对象,加入这个方法的主要原因是String实现了Constable和ConstantDesc两个接口,实现这两个接口的目的是JAVA
引入了新的API以对关键类文件和运行时工件的名义描述进行建模,尤其是可以从常量池中加载的常量3

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence,
               Constable, ConstantDesc {
        }
        
    public interface Constable {
        Optional<? extends ConstantDesc> describeConstable();
    }
    
    public sealed interface ConstantDesc
        permits ClassDesc,
                MethodHandleDesc,
                MethodTypeDesc,
                Double,
                DynamicConstantDesc,
                Float,
                Integer,
                Long,
                String {
            Object resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException;
    }

formatted()

        String name = "12345工😃%s-%d";
        //JDK15+
        String formattedString = name.formatted("admin",1);
        Assertions.assertEquals(String.format(name,"admin",1),formattedString);

formatted()方法等同步于String.format()

indent()

        String name = "1\n2\n3\r4";
        //JDK11 按行缩进
        String indentString = name.indent(20);
        System.out.println("|" + indentString + "|");
        //输出 
        |            1
                    2
                    3
                    4
        |

indent()可以缩进字符串,并且可以按\n、\r、\r\n拆分后将每一行都缩进指定空格

isBlank()、isEmpty()

        //true
        System.out.println("".isBlank());
        //true
        System.out.println("".isEmpty());
        //true        
        System.out.println(" ".isBlank());
        //false
        System.out.println(" ".isEmpty());
        //true
        System.out.println("\t\n".isBlank());
        //false
        System.out.println("\n\n".isEmpty());

这两个方法可以方便我们判断字符串是否为空了

lines()

        String name = "1\n2\r3\r\n4";
        //JDK11+ 按\n\r拆分String
        List<String> lines = name.lines().collect(Collectors.toList());
        lines.forEach(System.out::println);
      //输出
        1
        2
        3
        4

lines()方法可以快速的帮我们将String 按\n、\r、\r\n拆分成一行一行

repeat()

        String name = "Admin";
        //JDK11+ 重复String
        String jdkRepeatString = name.repeat(3);
        /AdminAdminAdmin
        System.out.println(jdkRepeatString);
       

repeat()将字符串重复拼接n次

strip()

        String name = "\u0020 \t admin\0";
        //JDK11+
        System.out.println(name.strip() + "|");
        System.out.println(name.trim() + "|");
        //输出
        admin |
        admin|

strip()和trim()有点类似,不同的是trim()仅删除字符 <= U+0020(空格);strip()删除所有 Unicode 空白字符(但不是所有控制字符,例如 \0)

stripLeading()、stripIndent()、stripTrailing()

        String name = " admin \n admin ";
        //JDK11+
        System.out.println("|"+name.stripLeading()+"|");
        System.out.println("-------------");
        System.out.println("|"+name.stripIndent()+"|");
        System.out.println("-------------");
        System.out.println("|"+name.stripTrailing()+"|");
        //输出
        |admin 
         admin |
        -------------
        |admin
        admin|
        -------------
        | admin 
         admin|

stripLeading()去除前面的空格,stripIndent()可以按\n、\r、\r\n拆分后按行去除前后空格,stripTrailing()去除后面空格

translateEscapes()

        String name = "\b\r\t\f";
        //JDK15+
        String transform = name.translateEscapes();
        System.out.println(transform);

将\b\t\n\f等字面字符转义

image.png


  1. JDK17新特性之–新的Compact Strings(JEP 254) - 掘金 (juejin.cn) ↩︎

  2. 其实你并不懂 Unicode - 知乎 ↩︎

  3. JEP 334: JVM Constants API ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/18132.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DolphinScheduler 3.1.4详细教程

文章目录 第一章 DolphinScheduler介绍1.1 关于DolphinScheduler1.2 特性1.3 名词解释1.3.1 名词解释1.3.2 模块介绍 第二章 DolphinScheduler系统架构2.1 系统架构图2.2 架构说明该服务包含&#xff1a; 2.3 启动流程活动图2.4 架构设计思想2.4.1 去中心化vs中心化2.4.1.1 中心…

北京地铁:充分发挥数据价值,全面提升业财融合能力

4月19日-4月21日&#xff0c;一年一度的用友BIP技术大会圆满召开。来自行业领先企业的CIO/CDO、生态伙伴、开发者、分析师、媒体等共聚北京用友产业园&#xff0c;了解最新技术发展趋势、探讨行业热点话题。会上&#xff0c;北京地铁运营有限公司&#xff08;以下简称“北京地铁…

使用 ChatGPT 辅助学习——为自己找一个老师

我们每个人都有许多标签&#xff0c;例如高中生、成绩中等、文科&#xff0c;根据这些标签我和其他拥有相同标签的人分配了相同的教程、班级和老师&#xff0c;这可以带来效率上的提升&#xff0c;因为同一份教程、老师就可以服务几十上百人&#xff0c;而无须为每个人定制&…

2023年腾讯云轻量服务器性能评测

腾讯云轻量应用服务器性能评测 轻量应用服务器是腾讯云推出的一款开箱即用的轻量级的云服务器&#xff0c;轻量服务器CPU内存带宽配置更高&#xff0c;价格却又很便宜&#xff0c;很多同学认为是不是轻量应用服务器性能不行呀&#xff0c;轻量服务器和云服务器有什么区别&…

浪潮盒子IPBS9505-多遥控版-S905L/M2芯片-安卓4.4.2-线刷固件包

浪潮盒子IPBS9505-多遥控版-S905L&#xff0f;M2芯片-安卓4.4.2-线刷固件包-内有教程和短接点-当贝纯净桌面。 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&…

因子挖掘框架cs优缺点介绍和使用说明

cs框架的优点和缺点 优点和ts一样,就是速度非常快缺点有好几个:必须使用根据过去一定天数计算因子值,持有一定天数之后再平衡的模式;必须使用连续的数据,如果是期货期权等需要合成连续数据。资金不足的时候不会拒单。cs框架使用方法 设计理念 计算因子由用户进行计算,因…

Springboot +Flowable,任务认领和回退(一)

一.简介 有的时候&#xff0c;一个任务节点会存在多个候选人&#xff0c;例如&#xff1a;张三提交一个任务&#xff0c;这个任务即可以由李四处理&#xff0c;又可以由王五处理&#xff0c;那么针对这种多个任务候选人的情况&#xff0c;该如何处理&#xff1f; 二.绘制流程…

项目管理-数据管理能力DCMM模型

DCMM 数据管理能力成熟度评估模型简介 DCMM&#xff08;Data Management Capability Maturity Assessment Model&#xff0c;数据管理能力成熟度评估模型&#xff09;是我国首个数据管理领域国家标准。该标准将组织对象的数据管理划分为八大能力域&#xff08;数据战略、数据治…

python4delphi之初体验

最近需要做一个excel导入的工具, excel表格是python的强项,于是想delphi结合python实现 delphi环境xe2 python 3.6.6 上图可以看到,真的很爽,我在vscode写python脚本,然后给delphi调用 读取了一个excel文件,打印出了列头。 最爽的是,我在没wps,office环境的机…

( “图“ 之 二分图 ) 785. 判断二分图 ——【Leetcode每日一题】

❓785. 判断二分图 难度&#xff1a;中等 存在一个 无向图 &#xff0c;图中有 n 个节点。其中每个节点都有一个介于 0 到 n - 1 之间的唯一编号。给你一个二维数组 graph &#xff0c;其中 graph[u] 是一个节点数组&#xff0c;由节点 u 的邻接节点组成。形式上&#xff0c;…

MySQL一次大量内存消耗的跟踪

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。文章来源&#xff1a;GreatSQL社区原创 线上使用MySQL8.0.25的数据库&#xff0c;通过监控发现数据库在查询一个视图(80张表的u…

xcode打包导出ipa

xcode打包导出ipa 众所周知&#xff0c;在开发苹果应用时需要使用签名&#xff08;证书&#xff09;才能进行打包安装苹果IPA&#xff0c;作为刚接触ios开发的同学&#xff0c;只是学习ios app开发内测&#xff0c;并没有上架appstore需求&#xff0c;对于苹果开发者账号认证需…

Java基础(十九)反射机制

1. 反射(Reflection)的概念 1.1 反射的出现背景 Java程序中&#xff0c;所有的对象都有两种类型&#xff1a;编译时类型和运行时类型&#xff0c;而很多时候对象的编译时类型和运行时类型不一致。 Object obj new String(“hello”); obj.getClass() 例如&#xff1a;某些变…

Pytorch对机器学习模型的安全漏洞攻击方法之Fast Gradient Sign Attack(FGSM,快速梯度符号攻击)

原论文:EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES 一般本人的习惯是先看论文熟悉它,然后代码去实现它,这样感觉要好点。因为论文讲解的比较全面和一些实验对比还有很多的引用等,另外大家知道好论文基本都是英文,所以对于英文弱点的伙伴们可能需要多花点时间去研读了…

Linux 多线程(1)线程概念与线程控制

多线程&#xff1a;概念、线程控制&#xff08;创建、终止、等待、分离&#xff09;&#xff0c;线程安全&#xff08;问题&实现&#xff09;&#xff0c;应用&#xff08;生产者与消费者模型&#xff0c;线程池&#xff0c;单例模式&#xff09; &#xff08;重要&#xf…

6个月的测试,来面试居然要15K,我一问连5K都不值

2023年4月份我入职了深圳某家创业公司&#xff0c;刚入职还是很兴奋的&#xff0c;到公司一看我傻了&#xff0c;公司除了我一个自动化测试&#xff0c;公司的测试人员就只有2个开发3个前端1个测试还有2个UI&#xff0c;在粗略了解公司的业务后才发现是一个从零开始的项目&…

Java版本-招投标采购系统源代码-高效管控招采流程-降低采购成本

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

计算机网络面试题(上)

1.TCP/IP 网络模型有哪几层&#xff1f; TCP/IP 网络通常是由上到下分成 4 层&#xff0c;分别是应用层&#xff0c;传输层&#xff0c;网络层和网络接口层。 每一层的封装格式&#xff1a; 网络接口层的传输单位是帧&#xff08;frame&#xff09;&#xff0c;IP 层的传输单位…

构造函数的复习,析构函数,拷贝构造函数与由此关于引用的思考

TIPS 在类当中不受访问限定符的限制&#xff0c;在类外面才会受到限制由于内存栈区的使用习惯是先使用高地址&#xff0c;再使用低地址&#xff1b;因此比方说有两个实例化对象依次创建&#xff0c;并且这两个实例化对象当中都有析构函数&#xff0c;也就是当退出销毁的时候&a…

CompletableFutrue异步处理

异步处理 一、线程的实现方式 1. 线程的实现方式 1.1 继承Thread class ThreadDemo01 extends Thread{Overridepublic void run() {System.out.println("当前线程:" Thread.currentThread().getName());} }1.2 实现Runnable接口 class ThreadDemo02 implements …