Java 中的 3 个双引号是什么语法?Java 15 刷新你的认知!
Java 中的 3 个双引号 """ 是什么语法?
这是 Java 15 新出的,刷新你的认知!
一、前言
在 Java 15 的推出的时候,Text Blocks 正式转正,我叫它 “文本块” 好了,栈长也做了简单介绍,没看过的可以点击这里看下。
文本块,是一个多行字符串,它可以避免使用大多数转义符号,自动以可预测的方式格式化字符串,并让开发人员在需要时可以控制格式。
文本块最早准备在 JDK 12 添加的,但最终撤消了,然后在 JDK 13 中作为预览特性进行了添加,然后又在 JDK 14 中再次预览,在 JDK 15 中,文本块终于转正,暂不再做进一步的更改。
二、示例
来看下这个 HTML 语言示例你就懂了:
不使用 Text Blocks::
String html1 = "<html>\n" +
" <body>\n" +
" <p>Hi, Java技术栈</p>\n" +
" <p>欢迎关注,分享更多干货</p>\n" +
" </body>\n" +
"</html>\n";
使用 Text Blocks:
String html2 = """
<html>
<body>
<p>Hi, Java技术栈</p>
<p>欢迎关注,分享更多干货</p>
</body>
</html>
""";
文本块需要用三个双引号包起来,熟悉 Python 的都知道,三个双引号表示多行注释,没想到 Java 竟然用作了多行字符串……
再来看下字节码:

看到了吧?文本块编译后会自动添加换行符,和原始的拼接写法编译结果一致,再也不用再拼接字符串了。
三、详细介绍
其实文本块的作用远不止换行符这么简单,下面栈长详细介绍下。
1、Line terminators(换行符)
如上面介绍,编译期自动增加换行符可以用来增强用非 Java 语言编写的代码的字符串的可读性,比如我们经常要拼接 HTML、XML、SQL 语言代码等,代码非常难看。
"""
Java
line 2
line 3
"""
就等同于:
"line 1\nline 2\nline 3\n"
或者:
"line 1\n" +
"line 2\n" +
"line 3\n"
如果最后一行不需要换行,可以这么写:
"""
line 1
line 2
line 3"""
还可以定义一个空的文本块:
String empty = """
""";
一个空字符串也需要两行代码,所以这个方式是不推荐使用的。
2、Incidental white space(空格编排)
继续看上面那段代码:

注意这根线没有,线前面有一排空格,意味着是不会被编译进去的,只是用来缩进格式化方便阅读,所以我叫它空格编排。
如果 """ 在最后单独占一排,则以它左对齐,否则以最靠左的一列左对齐。


IDEA 真是强大啊,对 JDK 15 都支持这么好了。如果你说没激活码,这都不是事,可以关注公众号Java技术栈,回复:idea,栈长教你免费获取正版。
另外,Java 15 中新增了 String.stripIndent 实例方法,可以直接删除每一行的开头和结尾空白字符。
3、Escape sequences(转义字符)
如下面代码所示:

我在代码中又增加了 \s、\n、\t 之类的转义字符,可以直接拿来用,双引号也不需要转义。
结果输出:
<html>
<body>
<p>Hi, "Java技术栈"</p>
<p>欢迎关注,\分享"更多"干货</p>
</body>
</html>
实际工作中可能出现的 SQL 语句的拼写就有救了!
不使用 Text Blocks:
String query = "SELECT \"EMP_ID\", \"LAST_NAME\" FROM \"EMPLOYEE_TB\"\n" +
"WHERE \"CITY\" = 'INDIANAPOLIS'\n" +
"ORDER BY \"EMP_ID\", \"LAST_NAME\";\n";
使用 Text Blocks:
String query = """
SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB"
WHERE "CITY" = 'INDIANAPOLIS'
ORDER BY "EMP_ID", "LAST_NAME";
""";
当然,拼接 SQL 要注意别造成 SQL 注入漏洞了,这里只是介绍使用。
另外,Java 15 新增了一个 String.translateEscapes 转义方法,可以直接对字符串内容进行转义。
4、格式化参数
Java 15 之前格式化字符串中的参数需要使用 String.format 静态方法,感觉不是很方便,而在 Java 15 中新增了直接格式化字符串的方法:

对上面的 SQL 语句进行扩展下,参数使用占位符进行格式化:
String query = """
SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB"
WHERE "CITY" = '%s' AND author = '%s'
ORDER BY "EMP_ID", "LAST_NAME";
""";
System.out.println(query.formatted("深圳", "栈长"));
结果输出:
SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB"
WHERE "CITY" = '深圳' AND author = '栈长'
ORDER BY "EMP_ID", "LAST_NAME";
直接使用字符串对象的 formatted 实例方法感觉更方便了!
四、结语
解读 Text Blocks(文本块)远比想象中要难很多,没想到一个文本块这么多细节,文中只是对文本块作了一个部分总结,并不是文本块的全部内容,反正暂时也用不到,大家简单了解即可。
对文本块感兴趣的、想深入了解更多文本块细节的同学,可以参考官方说明:
官方介绍文本块用了 3 万多字……可想而知解读它的难度。
本次栈长的分享就到这里了,希望对大家有用。觉得不错,在看、转发分享一下哦~
最后,Java 系列教程还会继续更新,关注Java技术栈公众号第一时间推送,还可以在公众号菜单中获取历史 Java 教程,都是干货。
近期热文推荐:
1.Java 15 正式发布, 14 个新特性,刷新你的认知!!
2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!
3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。
觉得不错,别忘了随手点赞+转发哦!
Java 中的 3 个双引号是什么语法?Java 15 刷新你的认知!的更多相关文章
- PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大、小写
原文:PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大.小写 若要将 CDM 中将 Entity的标识符都设为指定的大小写,则可以这么设定: 打开cdm的情况下,进入T ...
- C头文件中尖括号与双引号的区别及编译搜索顺序
这两天被问到一个很有意思的问题:C头文件中尖括号与双引号有什么区别,以前只大约知道 <> 常用在系统库文件,"" 常用在自定义的借口文件中,那具体在gcc编译搜索过程中 ...
- Bug2020011601,在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现
在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现. 加上少的双引号,解决了.
- Java中访问控制修饰符的详解和示例——Java学习
Java中的四个访问控制修饰符 简述 在Java中共有四个: public -- 对外部完全可见 protected -- 对本包和所有子类可见 默认(不需要修饰符)-- 对本包可见 private ...
- shell中定义变量用双引号和单引号以及不用引号的区别
1. 单引号 使用单引号的情况下,不管里面的是否有变量或者其他的表达是都是原样子输出 2. 双引号 如果其定义变量的时候使用双引号的话,则里面的变量或者函数会通过解析,解析完成后再输出内容,而不是把双 ...
- js方法参数中含有单引号双引号的处理
最近在做项目时,遇到一个问题.当在js脚本中,拼接生成一个tr,然后添加到一个表格里. //假定testval是从后台传过来的数据 var testval = "含有'半角单引号的字符串&q ...
- python中的单引号双引号和三引号
python的单引号和双引号没有本质的区别,而三引号有两种作用:注释和换行 一. 单引号中可以包含双引号,双引号中可以包含单引号 print("好好学习,'天天向上'") 结果: ...
- C语言中 单引号与双引号的区别
在C语言中,字符用单引号,字符串用双引号.在c1='a';中,'a'是字符常量,必须用单引号."a"表示字符串,包含两个字符,一个是'a',一个是'\0'. 用数组来存储字符串. ...
- php接收到的json格式不标准,某个字段中的文本包含双引号的处理
$str = '[{"Count":"1789"},{"裁判要旨段原文":"本瑶","案件类型":& ...
随机推荐
- java虚拟机配置
-XXSurvivorRatio 设置两个survivor和eden的比,8表示两个survivor:eden:2:8.survivor的比例影响新生代向老年代移动的数度.survivor比例越小,新 ...
- goto 无条件跳转
0. 基本模型 goto 顾言思义,是跳转的意思. goto 后接一个标签,这个标签的意义是告诉 Go程序下一步要执行哪里的代码. 所以这个标签如何放置,放置在哪里,是 goto 里最需要注意的. g ...
- Docker:一、开始部署第一个Asp.net应用
工具: docker desktop :一个使用Docker的IDE工具,可以理解为SourceTree,也是使用git的一个桌面化工具: kitematic :配合desctop,用来管理本地的镜像 ...
- 能否使用GHDL+GTKWave代替Quartus ii (续——vhdl_testbench_cli)
vhdl_testbench_cli项目介绍 这是我放在gitee上的一个项目. 项目是用于Mac系统下生成vhdl testbench的工具. 主要就是续着这篇文章<能否使用GHDL+GTKW ...
- 基础Web漏洞-SQL注入入门(手工注入篇)
一.什么是SQL注入 SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL.而SQL注入是将Web页面的原URL.表单域或数据包输入的参数,修改拼接成SQ ...
- Python-joypy和 R-ggridges 峰峦图制作
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于DataCharm,作者 宁海涛 转载地址 https://www ...
- “工程师思维” VS. “学院派思维”
1.与"工程师"交流,他们致力于"更快.高质量"交付,他们会借助时下最稳定.最完善的中间件或者框架,他们更谦虚,喜欢和志同道合的朋友交流分享协作,视角更宽,往往 ...
- 【题解】 [GZOI2017]小z玩游戏
题目戳我 \(\text{Solution:}\) 考虑建图.操作可以看作对\(1\)进行的操作,于是有以下运行过程: \(1\to w[i]\to e[i]\to...\) 考虑倍数,一个数可以走到 ...
- Sprign-mvc系列之Spring快速入门 什么是sprign-mvc spring-mvc的作用及其基本使用+组件解析+注解解析
Spring-mvc 什么是SpringMvc SpringMvc是一种基于java的实现Mvc设计模式的请求驱动类型的轻量级web框架,属于SpringFrameWork的后续产品,已经融合在Spr ...
- 看动画学算法之:linkedList
目录 简介 linkedList的构建 linkedList的操作 头部插入 尾部插入 中间插入 删除节点 简介 linkedList应该是一种非常非常简单的数据结构了.节点一个一个的连接起来,就成了 ...