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

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

java中的字符串池,編譯時與運行時字符串評估

java中的字符串池,編譯時與運行時字符串評估

一只萌萌小番薯 2023-06-21 14:45:49
我正在研究獲得我的 OCA 考試并堅持這個 java 字符串池概念??紤]以下幾點:public static void main(String[] args) {    String s1 = "Hello";                // since s1 and s2 are the same literal at compile-time, therefore they will be string pooled    String s2 = "Hello";    String s3 = "Hello".trim();    StringBuilder sb1 = new StringBuilder("Hello");     // although they are the same string, == only checks for object equality    StringBuilder sb2 = new StringBuilder("Hello");    System.out.println(s1 == s2);       // true    System.out.println(s1 == s3);       // true    System.out.println(sb1 == sb2);     // false}s1并且s2在字符串中相同并且在對象中也相同,因為因為它是相同的字符串文字,JVM 將在編譯時將字符串池s1和。s2現在,s3是在運行時計算的,因此應該返回一個新字符串。因此,s1 == s3應該是假的,但事實并非如此。為什么?我的一個理論是該trim()方法首先檢查是否有要刪除的空白,如果沒有,則簡單地返回自身。這可以解釋為什么s1 == s3,但我不確定。
查看完整描述

3 回答

?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

你是對的。如果trim()方法不改變值,那么將返回原始實例。如果所有“Hello”都更改為“Hello”,則 s3 將不等于 s1,因為 trim() 會刪除空格并返回一個新的字符串實例。



查看完整回答
反對 回復 2023-06-21
?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

如果您查看該trim()方法的源代碼,這是正確的,您會看到在刪除空格后substring(start, end)調用了該方法。否則,如果沒有空格,則this返回相同的實例。


public String trim() {

   int len = value.length;

   int st = 0;

   char[] val = value;    /* avoid getfield opcode */


   while ((st < len) && (val[st] <= ' ')) {

       st++;

   }

   while ((st < len) && (val[len - 1] <= ' ')) {

       len--;

   }

   return ((st > 0) || (len < value.length)) ? substring(st, len) : this;

 }

這st是刪除空格后的起始索引,len是新的長度。


現在,如果字符串之前或之后有任何空格:


String s1 = "hello "; //<-- whietspace at the end

System.out.println(s1.trim() == "hello");

輸出與方法調用時的輸出false相同。如果和不相同,則子字符串返回一個新的 String 實例:substring()trim()beginIndexendIndex


return ((beginIndex == 0) && (endIndex == value.length)) ? this

                : new String(value, beginIndex, subLen);

因此,在刪除空格(如果有)之后, 和beginIndex顯然endIndex會發生變化,并且new String()將返回一個實例。


查看完整回答
反對 回復 2023-06-21
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

這是 trim() 的源代碼。如果沒有要刪除的空格,則返回this. 所以它與您trim編輯的參考文獻相同。


public String trim() {

    int len = value.length;

    int st = 0;

    char[] val = value;    /* avoid getfield opcode */


    while ((st < len) && (val[st] <= ' ')) {

        st++;

    }

    while ((st < len) && (val[len - 1] <= ' ')) {

        len--;

    }

    return ((st > 0) || (len < value.length)) ? substring(st, len) : this;

}


查看完整回答
反對 回復 2023-06-21
  • 3 回答
  • 0 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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