成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java編譯器中對(duì)String對(duì)象的優(yōu)化

開(kāi)發(fā) 后端
本文將簡(jiǎn)述在Java編譯器中對(duì)string對(duì)象的優(yōu)化。這里將通過(guò)作者的一個(gè)實(shí)例,從正反兩個(gè)方面來(lái)仔細(xì)分析,讓大家有一個(gè)清晰的思路。

首先把問(wèn)題擺出來(lái),先看這個(gè)代碼:

String a = "ab"; 
String b = "a" + "b";
System.out.println((a == b));

打印結(jié)果會(huì)是什么?類似這樣的問(wèn)題,有人考過(guò)我,我也拿來(lái)考過(guò)別人(蠻好玩的,大家也可以拿來(lái)問(wèn)人玩),一般答案會(huì)是以下幾種:

1、true

"a" + "b" 的結(jié)果就是“ab”,這樣a,b都是“ab”了,內(nèi)容一樣所以“相等”,結(jié)果true。

一般Java新人如是答。

2、false

"a" + "a"會(huì)生成新的對(duì)象“aa”,但是這個(gè)對(duì)象和String a = "ab";不同,(a == b)是比較對(duì)象引用,因此不相等,結(jié)果false。

對(duì)Java的String有一定了解的通常這樣回答。

3、true

String a = "ab";創(chuàng)建了新的對(duì)象“ab”;再執(zhí)行String b = "a" + "b";結(jié)果b="ab",這里沒(méi)有創(chuàng)建新的對(duì)象,而是從JVM字符串常量池中獲取之前已經(jīng)存在的“ab”對(duì)象。因此a,b具有對(duì)同一個(gè)string對(duì)象的引用,兩個(gè)引用相等,結(jié)果true。

能回答出這個(gè)答案的,基本已經(jīng)是高手了,對(duì)Java中的string機(jī)制比較了解。

很遺憾,這個(gè)答案是不夠準(zhǔn)確的。或者說(shuō),根本沒(méi)有運(yùn)行時(shí)計(jì)算b = "a" + "b";這個(gè)操作。實(shí)際上運(yùn)行時(shí)只有String b = "ab";。

3的觀點(diǎn)適合解釋以下情況:

String a = "ab"; 
String b = "ab";
System.out.println((a == b));

如果String b = "a" + "b";是在運(yùn)行期執(zhí)行,則3的觀點(diǎn)是無(wú)法解釋的。運(yùn)行期的兩個(gè)string相加,會(huì)產(chǎn)生新的對(duì)象的。(本文后面對(duì)此有解釋)

4、true

下面是我的回答:編譯優(yōu)化+ 3的處理方式 = 最后的true

String b = "a" + "b";編譯器將這個(gè)"a" + "b"作為常量表達(dá)式,在編譯時(shí)進(jìn)行優(yōu)化,直接取結(jié)果"ab",這樣這個(gè)問(wèn)題退化。

String a = "ab"; 
String b = "ab";
System.out.println((a == b));

然后根據(jù)3的解釋,得到結(jié)果true。

這里有一個(gè)疑問(wèn)就是String不是基本類型,像

int secondsOfDay = 24 * 60 * 60; 

這樣的表達(dá)式是常量表達(dá)式,編譯器在編譯時(shí)直接計(jì)算容易理解,而"a" + "b" 這樣的表達(dá)式,string是對(duì)象不是基本類型,編譯器會(huì)把它當(dāng)成常量表達(dá)式來(lái)優(yōu)化嗎?

下面簡(jiǎn)單證明我的推斷,首先編譯這個(gè)類:

public class Test { 
private String a = "aa";
}

復(fù)制class文件備用,然后修改為:

public class Test { 
private String a = "a" + "a";
}

再次編譯,用ue之類的文本編輯器打開(kāi),察看二進(jìn)制內(nèi)容,可以發(fā)現(xiàn),兩個(gè)class文件完全一致,連一個(gè)字節(jié)都不差。

ok,真相大白了。根本不存在運(yùn)行期的處理String b = "a" + "b";這樣的代碼的問(wèn)題,編譯時(shí)就直接優(yōu)化掉了。

下面進(jìn)一步探討,什么樣的string + 表達(dá)式會(huì)被編譯器當(dāng)成常量表達(dá)式?

String b = "a" + "b"; 

這個(gè)String + String被正式是ok的,那么string + 基本類型呢?

String a = "a1"; 
String b = "a" + 1;
System.out.println((a == b)); //result = trueString a = "atrue";
String b = "a" + true;
System.out.println((a == b)); //result = trueString a = "a3.4";
String b = "a" + 3.4;
System.out.println((a == b)); //result = true

可見(jiàn)編譯器對(duì)string + 基本類型是當(dāng)成常量表達(dá)式直接求值來(lái)優(yōu)化的。

再注意看這里的string都是"**"這樣的,我們換成變量來(lái)試試:

String a = "ab"; 
String bb = "b";
String b = "a" + bb;
System.out.println((a == b)); //result = false

這個(gè)好理解,"a" + bb中的bb是變量,不能進(jìn)行優(yōu)化。這里很很好的解釋了為什么3的觀點(diǎn)不正確,如果String+String的操作是在運(yùn)行時(shí)進(jìn)行的,則會(huì)產(chǎn)生新的對(duì)象,而不是直接從jvm的string池中獲取。

再修改一下,把bb作為常量變量:

String a = "ab"; 
final String bb = "b";
String b = "a" + bb;
System.out.println((a == b)); //result = true

竟然又是true,編譯器的優(yōu)化好厲害啊!呵呵!考慮下面這種情況:

String a = "ab"; 
final String bb = getBB();
String b = "a" + bb;
System.out.println((a == b)); //result = false
private static String getBB() {
return "b";
}

看來(lái)Java(包括編譯器和jvm)對(duì)string的優(yōu)化,真的是到了極點(diǎn)了,string這個(gè)所謂的“對(duì)象”,完全不可以看成一般的對(duì)象,Java對(duì)string的處理近乎于基本類型,最大限度的優(yōu)化了幾乎能優(yōu)化的地方。

另外感嘆一下,string的+號(hào)處理,算是Java語(yǔ)言里面唯一的一個(gè)“運(yùn)算符重載”(接觸過(guò)c++的人對(duì)這個(gè)不會(huì)陌生)吧?

【編輯推薦】

  1. Java語(yǔ)言中抽象類和接口的區(qū)別
  2. 痛批Java十大最無(wú)用特性
  3. 深入探索Java工作原理:JVM,內(nèi)存回收及其他
責(zé)任編輯:彭凡 來(lái)源: javaeye
相關(guān)推薦

2011-05-18 11:06:25

java編譯器

2010-09-16 15:57:25

Java編譯器

2023-11-15 17:58:58

C++代碼

2021-10-09 12:08:23

Facebook編譯器機(jī)器學(xué)習(xí)

2022-02-23 13:31:26

RVO編譯器優(yōu)化

2015-03-23 10:04:43

c++編譯器c++實(shí)現(xiàn)原理總結(jié)

2023-04-14 10:40:45

工具編譯器優(yōu)化

2010-01-15 16:37:28

Visual C++

2010-01-13 17:12:26

C++編譯器

2013-03-18 09:42:47

C++C++ 11

2023-03-26 20:39:01

2010-03-23 11:17:16

Python 動(dòng)態(tài)編譯

2010-10-20 13:43:37

C++編譯器

2010-01-13 14:35:10

Visual C++

2022-05-18 09:31:42

編譯器開(kāi)源代碼生成

2010-09-16 16:05:24

Java編譯器

2010-01-18 10:34:21

C++編譯器

2010-01-21 09:11:38

C++編譯器

2010-01-12 16:42:59

C++編譯器

2009-08-10 17:12:54

C#編譯器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中国一级特黄真人毛片免费观看 | 国产婷婷色综合av蜜臀av | 亚洲成人在线免费 | 精品日韩在线 | 欧美国产精品一区二区三区 | 激情欧美日韩一区二区 | 精品一区二区三区四区五区 | 中文字幕在线国产 | 精品久久香蕉国产线看观看亚洲 | 久久久久国产一区二区三区 | 欧美在线资源 | 国产日韩欧美91 | 欧产日产国产精品视频 | 欧美精品一区二区三区蜜桃视频 | 精品国产乱码久久久久久闺蜜 | 久草免费在线 | 久久久www成人免费无遮挡大片 | 国产精品自拍视频 | 蜜桃视频一区二区三区 | 国产一区二区三区在线看 | 一区在线视频 | 国产最新网址 | 久久久免费电影 | 天天av天天好逼 | 免费xxxx大片国产在线 | 激情久久av一区av二区av三区 | 嫩草视频在线 | 成人三级视频在线观看 | 亚洲成人观看 | 国产一区免费 | 中国一级大黄大片 | 国产精品久久久久久久久图文区 | 午夜精品视频一区 | 中文字幕av一区二区三区 | 欧美国产日韩在线观看 | 99在线精品视频 | 亚洲视频三区 | 久久99久久99 | 亚洲综合在线一区 | 成人在线播放 | 伊人青青久久 |