第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在常量池中操作字符串與在非常量池中操作字符串 - 性能

在常量池中操作字符串與在非常量池中操作字符串 - 性能

慕森卡 2022-05-21 18:31:01
我想更改一個類似的代碼if("T".equalsIgnoreCase(bo.getSubjectType()))  //method-1到if(String.valueOf('T').equalsIgnoreCase(bo.getSubjectType()))  //method-2所以出于這個原因,我寫了一個示例代碼String s1 = "T";String s2 = "T";char c1 = 'T';char c2 = 'T';System.out.println(String.valueOf(c1) == String.valueOf(c2));   //  falseSystem.out.println(s1 == s2);   //  true這幾乎可以說String.valueOf(arg)會產生一個字符串文字并將其放在constant pool. non-constant所以我的問題是,當我們嘗試在池中操作 String 和在 a 中操作 String 時,性能上是否會有任何差異constant pool——基本上哪一個會更好地接近method-1或method-2?
查看完整描述

2 回答

?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

if(String.valueOf('T').equalsIgnoreCase(bo.getSubjectType()))

像這樣寫它沒有任何好處。

String.valueOf('T')將始終返回一個新字符串,等于"T",因為String.valueOf(char)(或任何valueOf重載,就此而言)的結果沒有被緩存。沒有理由一遍又一遍地創(chuàng)建相同的字符串。

另外,它更冗長。

只要堅持方法1。


查看完整回答
反對 回復 2022-05-21
?
LEATH

TA貢獻1936條經驗 獲得超7個贊

方法 2 是難讀的,根本沒有任何改進。


String使用newoperator 運算符創(chuàng)建,它總是在堆內存中創(chuàng)建一個新對象。Stringcreated usingString literal可能會從 中返回一個現(xiàn)有對象String pool,如果它已經存在的話。


它不會String從池中返回 a 并創(chuàng)建一個Stringusingnew運算符(Oracle JDK 10 源代碼):


 /**

 * Returns the string representation of the {@code char}

 * argument.

 *

 * @param   c   a {@code char}.

 * @return  a string of length {@code 1} containing

 *          as its single character the argument {@code c}.

 */

public static String valueOf(char c) {

    if (COMPACT_STRINGS && StringLatin1.canEncode(c)) {

        return new String(StringLatin1.toBytes(c), LATIN1);

    }

    return new String(StringUTF16.toBytes(c), UTF16);

}

如果你想定義一個String常量并且總是從池中加載,只需創(chuàng)建一個:


public static final String T = "T";

關于JLS字符串文字和池:


class Test {

   public static void main(String[] args) {

   String hello = "Hello", lo = "lo";

   System.out.print((hello == "Hello") + " ");

   System.out.print((Other.hello == hello) + " ");

   System.out.print((other.Other.hello == hello) + " ");

   System.out.print((hello == ("Hel"+"lo")) + " ");

   System.out.print((hello == ("Hel"+lo)) + " ");

   System.out.println(hello == ("Hel"+lo).intern());

 }

}

class Other { static String hello = "Hello"; }

和編譯單元:


package other; 

public class Other { 

    public static String hello = "Hello"; 

}

產生輸出:


true true true true false true


這個例子說明了六點:


? 同一包 (§7 (Packages)) 中的同一類 (§8 (Classes)) 中的文字字符串表示對同一 String 對象 (§4.3.1) 的引用。


? 同一包中不同類中的文字字符串表示對同一字符串對象的引用。


? 不同包中不同類中的文字字符串同樣表示對同一字符串對象的引用。


? 由常量表達式(第 15.28 節(jié))計算的字符串在編譯時計算,然后將其視為文字。


? 在運行時通過連接計算的字符串是新創(chuàng)建的,因此是不同的。


? 顯式內嵌計算字符串的結果是與任何具有相同內容的預先存在的文字字符串相同的字符串。


查看完整回答
反對 回復 2022-05-21
  • 2 回答
  • 0 關注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號