日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java考察代码_一段简单的关于字符串的 Java 代码竟考察了这么多东西

發布時間:2024/10/8 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java考察代码_一段简单的关于字符串的 Java 代码竟考察了这么多东西 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下面的代碼運行結果是什么?解釋一下為什么會有這些差異。

String s1 = "hello";

String s2 = s1 + ",world";

String s3 = "hello" + ",world";

String s4 = "hello,world";

String s5 = new String("hello,world");

System.out.println(s2.equals(s4)); // true

System.out.println(s2==s4);     // false

System.out.println(s3==s4);     // true

System.out.println(s4==s5);     // false

看似簡單的代碼,卻有很多學問在里面。在此之前先非常簡單地說一下JVM中的棧和堆,棧一般存放的是局部變量,對象的引用等;堆一般放對象、常量等,在 jdk1.7 以后的版本,字符串常量池也在堆中。

字符串常量池

一般情況下,創建字符串對象有兩種方式,一種是字面值創建,一種是 new 創建,這兩者是不一樣的。

如果是字面值創建的方式,如 String s4="hello,world",JVM會先去字符串常量池中尋找有沒有“hello,world”這個字符串,若有,則將其地址給 s4;若沒有,則先在常量池里創建“hello,world”,然后再把地址給s4;而通過 new 的方式創建對象,則是在堆中創建“hello,world”對象,s5 指向這個對象。還是看圖吧,比較直觀:

equals() 和 ==

這是 Java 面試常考點,有人可能會說 equals() 比較的是值,而 == 比較的是對象的引用(沒錯是我),直到被面試官吊打,才會老老實實去看 Object 類中 equals() 的源碼:

可以看到,equals() 方法體中,返回的是 兩個對象的引用的比較結果 。但是,兩個 String 類型 == 和 equals() 有時候結果卻不一樣。那是因為在 String 類中,equals() 被重寫了:

可以看到,它先對比兩個引用;若一樣則直接返回 true,不一樣就對它們的值進行比較。因此,可以對 == 和 equals() 更好的區別了:

字符串的拼接

String 類被 final 修飾,因此字符串不能修改,當兩個字符串相加時,是先生成 StringBuilder 對象,然后通過 append() 的方式將兩個字符串拼接,再調用 toString() 方法生成新的字符串對象。所以只考慮 s1 和 s2,他們在 JVM 中是這樣的:

但是像 String s3 = "hello" + ",world" 這樣直接兩個字面值相加的,java文件在編譯期間就已經將這條語句做了優化,將其直接變成 "hello,world",等到運行的時候就查找字符串常量池,因此 s3 == s4 返回的結果就為 true。

String、StringBuilder、StringBuffer

既然上面說到了 StringBuilder,那就順便簡單說一下這三者之間的區別。

String 是常量,且每次需要在原來字符串基礎上擴展都需要新建對象,導致速度會稍微慢一點,而且占內存,因此對于需要經常擴展的字符串,可以使用 StringBuilder 和 StringBuffer。但是?StringBuilder 和 StringBuffer?又有區別,即時兩者很像,在速度上 StringBuilder 會快一些,因為 StringBuffer 的操作加了 synchronized ,即加了鎖,使得操作相對比較慢,就舉 append() 為例子,StringBuffer 中此方法的源碼如下:

所以,一般在單線程的情況下,可以選擇使用 StringBuilder;在多線程的情況下可以選擇 StringBuffer .

總結

回到一開始的程序,我們可以大致地畫出在 JVM 中的存儲:

關于找一找教程網

本站文章僅代表作者觀點,不代表本站立場,所有文章非營利性免費分享。

本站提供了軟件編程、網站開發技術、服務器運維、人工智能等等IT技術文章,希望廣大程序員努力學習,讓我們用科技改變世界。

[一段簡單的關于字符串的 Java 代碼竟考察了這么多東西]http://www.zyiz.net/tech/detail-97290.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的java考察代码_一段简单的关于字符串的 Java 代码竟考察了这么多东西的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。