网站首页 > 技术文章 正文
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(文本块)远比想象中要难很多,没想到一个文本块这么多细节,文中只是对文本块作了一个部分总结,并不是文本块的全部内容,反正暂时也用不到,大家简单了解即可。
对文本块感兴趣的、想深入了解更多文本块细节的同学,可以参考官方说明:
https://openjdk.java.net/jeps/378
官方介绍文本块用了 3 万多字……可想而知解读它的难度。
本次栈长的分享就到这里了,希望对大家有用。觉得不错,在看、转发分享一下哦~
最后,Java 系列教程还会继续更新,点击下面的了解更多关注Java技术栈第一时间推送。
猜你喜欢
- 2024-10-27 从bitmap到布隆过滤器,再到高并发缓存设计策略
- 2024-10-27 强大 WebView2 + 不用写 JavaScript 的 htmx.js 「小轻快」开发桌面程序
- 2024-10-27 《JSP》第13节:JSP中的四大作用域介绍
- 2024-10-27 Java,FreeMarker,模板引擎,通过案例代码,学懂模板引擎
- 2024-10-27 面向对象的三大特性(c++面向对象的三大特性)
- 2024-10-27 教你分析9种 OOM 常见原因及解决方案
- 2024-10-27 可动态调节参数的线程池实现(动态调试工具有哪些)
- 2024-10-27 Java,基本类型和引用类型,强引用、软引用、弱引用、虚引用
- 2024-10-27 深入理解Java:类加载机制及反射(java常见类加载器)
- 2024-10-27 JVM系列-6.javap指令介绍(jvm调优)
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)