亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

圖說String(三)String中'+'和StringBuilder的區別

標簽:
Maya

上⽂文说到,对String的任何修改操作,都会返回⼀一个新的String对象,并且举例例 了了常⽤用的subString的⽅方法调⽤用,今天我们来看String另外⼀一个常⽤用的操作:+ 拼 接操作。 String s ="java"+"技术⼤大本营" ;这个好像看不不到源码,但是我们可以通过idea直接打开 .class ⽂文件看到 jvm 是怎 么编译这个java⽂文件的。如下图所示:


webp

1clipboard.png

可以看到,在编译的时候,直接跳过了了 + 号,直接当做"java技术⼤大本营"来处理理 的。
因为在做' '=='' 引⽤用时会输出true:


webp

2clipboard.png


⽤用 “==” ⽐比较时输出true,说明变量量 s 和 变量量 s1 的地址是⼀一样的。我们可以通 过javap命令看看常量量池: javap -v -p IS_String

webp

3clipboard.png

可以看到, s和s1分别在本地变量量表的 Slot1 和 Slot2 区域。 在main函数反编译 代码中可以看到:


webp

4clipboard.png

0:从常量量池#2中加载常量量到操作栈顶。2:将栈顶的数存储到本地变量量表1区域,也就是赋值给Slot1中的变量量s 3:从常量量池#2中加载常量量到操作栈顶。5:将栈顶的数存储到本地变量量表2区域,也就是赋值给Slot2中的变量量s1


webp

5clipboard.png


webp

6clipboard.png


可以看到常量量池#2的位置就是我们的字符串串: “java技术⼤大本营”。 上述例例⼦子是⽤用 + 连接字符串串常量量,jvm会帮我们直接连接成⼀一个常量量。下⾯面我们 看看⽤用 “+” 连接变量量:


webp

7clipboard.png

上半部分是源码,下半部分是⽤用javap -v -p IS_String 反编译出来的结果。 我们可以看到, "java" 和 "技术⼤大本营” 是分到常量量池两个位置进⾏行行存储的。在 使⽤用 + 进⾏行行连接时,使⽤用了了invokedynamic指定动态去调⽤用BootstrapMethods⾥里里编号为0的⽅方法:


webp

8clipboard.png


我们在idea中打开这个源码⽂文件 (StringConcatFactory.makeConcatWithConstants)可以看到:


webp

9clipboard.png

我们跟踪doStringConcat代码可以看到主要是generate⽅方法:


webp

10clipboard.png

webp

11clipboard.png



作者:微笑的小小刀
链接:https://www.jianshu.com/p/ac8621673dd5


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消