1. 首页
  2. IT资讯

不能用 + 拼接字符串?这次我要吊打面试官

“u003Cblockquoteu003Eu003Cpu003E转载:https:u002Fu002Fmp.weixin.qq.comu002Fsu002F7xEjUyGjazL4Rm1xTIoRAwu003Cu002Fpu003Eu003Cpu003E作者:Java技术栈u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E我们做 Java 程序员以来,不管是工作当中,还是面试过程中,都知道:字符串拼接不能用 String,要用 StringBuilder 或者是 StringBuffer,以至于它们都被滥用了。u003Cu002Fpu003Eu003Cpu003EStringBuilder、StringBuffer 简称:SB,下文统一用 SB 代替。u003Cu002Fpu003Eu003Cpu003ESB它们都是可变的字符串,它们之间的区别也是 Java 初中级面试战场上出现几率十分高的一道题,上场率没有 90% 也有 80% 吧。u003Cu002Fpu003Eu003Cpu003E这两个的具体区别请看这篇文章:StringBuffer 和 StringBuilder 的 3 个区别。u003Cu002Fpu003Eu003Cpu003E我们反过来想下,String真的是不可变的么?不一定,看下这篇:Java 中的 String 真的是不可变的吗?u003Cu002Fpu003Eu003Cpu003E当然,本文不是讨论字符串可变与不可变的问题,而是讨论:字符串拼接一定要用SB 吗?为什么不能用 + ?能不能用 + ?什么时候可以用 + ?u003Cu002Fpu003Eu003Cpu003E为什么不能用 + 号拼接字符串?我不服,接下来我要吊打面试官!u003Cu002Fpu003Eu003Ch1 class=”pgc-h-arrow-right”u003E什么时候不能用 `+`u003Cu002Fh1u003Eu003Cpu003E通过多个表达式完成一个字符串拼接操作。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F25a4f52967e44d01a8e8afcd3e0a3117″ img_width=”593″ img_height=”121″ alt=”不能用 + 拼接字符串?这次我要吊打面试官” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E字节码如下:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Eu002Fu002F access flags 0xAprivate static test2()VL0LINENUMBER 14 L0LDC "www."ASTORE 0L1LINENUMBER 15 L1ALOAD 0ASTORE 1L2LINENUMBER 16 L2NEW javau002Flangu002FStringBuilderDUPINVOKESPECIAL javau002Flangu002FStringBuilder.<init> ()VALOAD 1INVOKEVIRTUAL javau002Flangu002FStringBuilder.append (Ljavau002Flangu002FString;)Ljavau002Flangu002FStringBuilder;LDC "javastack."INVOKEVIRTUAL javau002Flangu002FStringBuilder.append (Ljavau002Flangu002FString;)Ljavau002Flangu002FStringBuilder;INVOKEVIRTUAL javau002Flangu002FStringBuilder.toString ()Ljavau002Flangu002FString;ASTORE 1L3LINENUMBER 17 L3NEW javau002Flangu002FStringBuilderDUPINVOKESPECIAL javau002Flangu002FStringBuilder.<init> ()VALOAD 1INVOKEVIRTUAL javau002Flangu002FStringBuilder.append (Ljavau002Flangu002FString;)Ljavau002Flangu002FStringBuilder;LDC "com"INVOKEVIRTUAL javau002Flangu002FStringBuilder.append (Ljavau002Flangu002FString;)Ljavau002Flangu002FStringBuilder;INVOKEVIRTUAL javau002Flangu002FStringBuilder.toString ()Ljavau002Flangu002FString;ASTORE 1L4LINENUMBER 18 L4RETURNL5LOCALVARIABLE www Ljavau002Flangu002FString; L1 L5 0LOCALVARIABLE str Ljavau002Flangu002FString; L2 L5 1MAXSTACK = 2MAXLOCALS = 2u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E不会查看字节码的,看这里:u003Cstrongu003E3种骚操作,教你查看 Java 字节码u003Cu002Fstrongu003E,看这一篇就会了。u003Cu002Fpu003Eu003Cpu003E观察下,NEW javau002Flangu002FStringBuilder 出现了两次,是因为我们在代码中拼接了两次,也就是说每一次拼接操作都会创建一次 StringBuilder。u003Cu002Fpu003Eu003Cpu003E如果我们是在一个循环中进行字符串拼接,那是不是一次拼接就要创建一个StringBuilder?u003Cu002Fpu003Eu003Cpu003Ewtf……这哪能接受!频繁创建对象是有性能开销的,这也是为什么我们常说的字符串不能用 + 拼接,而要用那两个 SB 拼接了。u003Cu002Fpu003Eu003Ch1 class=”pgc-h-arrow-right”u003E什么时候可以用 `+`u003Cu002Fh1u003Eu003Cpu003E直接将三个字面量的字符串拼接成一个字符串。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002Ff4829bcd991c483d9a4071b2ea277503″ img_width=”593″ img_height=”68″ alt=”不能用 + 拼接字符串?这次我要吊打面试官” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E字节码如下:u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F0398934d2e76498caddad9ebc1560c47″ img_width=”592″ img_height=”264″ alt=”不能用 + 拼接字符串?这次我要吊打面试官” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E从字节码看出,没有任何创建 StringBuilder 的指令,直接从常量池进行取出一个完整的字符串:www.javastack.com。很明显,这是 Java 编译器对代码进行了优化。u003Cu002Fpu003Eu003Cpu003E所以,通过这个示例告诉你,在这种情况下是可以用 + 号进行字符串拼接的。u003Cu002Fpu003Eu003Cpu003E这个示例可以演变成我们实际工作当中的某个 SQL 语句拼接的案例,如:u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fba3e1d8bda0843ceac10a245c4adda83″ img_width=”593″ img_height=”68″ alt=”不能用 + 拼接字符串?这次我要吊打面试官” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E别说这样不行,这样是行的。u003Cu002Fpu003Eu003Cpu003E但你要是换成这样就不行了:u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F75f04f92c6db46eda81a76da8993a352″ img_width=”593″ img_height=”66″ alt=”不能用 + 拼接字符串?这次我要吊打面试官” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E这样又回到创建多个 StringBuilder 的时候了。u003Cu002Fpu003Eu003Cpu003E也就是说,在一个表达式中完成字符串拼接是可以用 + 号完成的,因为编译器已经做了优化。u003Cu002Fpu003Eu003Ch4 class=”pgc-h-arrow-right”u003E小结一下u003Cu002Fh4u003Eu003Cpu003E你只需要记住这两点:u003Cu002Fpu003Eu003Cpu003E1、在循环和多个表达式中不能 +,频繁创建 SB 性能影响;u003Cu002Fpu003Eu003Cpu003E2、在单个表达式中可以用 +,编译器直接做了优化;u003Cu002Fpu003Eu003Cpu003E老铁们,都搞清楚了?u003Cu002Fpu003Eu003Cpu003E这个观点有没有被误解很久?u003Cu002Fpu003Eu003Cpu003E下次面试,把这篇内容亮出来,吊打面试官,没问题的。u003Cu002Fpu003E”

原文始发于:不能用 + 拼接字符串?这次我要吊打面试官

主题测试文章,只做测试使用。发布者:乾奕,转转请注明出处:http://www.cxybcw.com/26302.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code