簡體   English   中英

String.valueOf() 和 new String() 的區別

[英]Difference between String.valueOf() and new String()

String.valueOf() 和 new String() 有什么區別? 您什么時候會使用其中一種?

示例 1:

public String fun(){

 int foo = 55;
 return String.valueOf(foo);

}

示例 2:

public String fun(){

int foo = 55;
return new String(foo);

}

更新:是的,第二個示例無法編譯,正如下面其他人指出的那樣。 我沒有意識到這一點,因為我一直在使用 new String("something" + foo) 並且它已經工作了,正如 fastcodejava 所指出的那樣。 那么如果我使用 new String("something" + foo) 或 String.valueOf(foo) ,兩者之間有區別嗎?

第一種方法接受一個整數並將其轉換為字符串。 然而,第二種方法只是一個構造函數,它創建了一個 String 類型的新對象。 它不能將整數作為參數。

String沒有采用單個整數的構造函數。

  • String(byte[] bytes)
  • String(char[] value)
  • String(String original)
  • String(StringBuffer buffer)
  • String(StringBuilder builder)

你應該使用:

Integer.toString(foo);

在示例 2 中,它應該是

return new String(Integer.toString(foo));

你的沒有編譯。 所以沒有必要考慮它們之間的區別,它們采用不同的參數。

第一種方法嘗試將類型轉換為 String 並使用該值創建一個新字符串。 第二種方法是構造函數,它只是從類似字符串的格式中創建一個新字符串(不是整數 -> 字符串意義上的類型轉換)。

所以評論是正確的......它沒有編譯:)

第二個代碼甚至無法編譯。 但是如果你確實return new String("" + foo); , 它會。 之后它們幾乎相同。

除了其他人給出的點之外,我看不到 String.valueOf() 和 new String() 之間的任何區別,因為我看到兩者都在創建一個新的 String 對象。 我嘗試使用 -

    char[] chars = {'c','a','t'};
    System.out.println(String.valueOf(chars) == String.valueOf(chars));
    System.out.println(new String(chars) == new String(chars));

兩者都給出錯誤的說明,它們都是不同的 String 對象。
所以我沒有看到任何性能或內存消耗差異。

奇怪的是,以下代碼片段產生了不同的結果。 在處理 Base64 編碼的字節 [] 時看起來有些不同

不正確:

byte[] bytesArray = new byte[(int) a_imageFile.length()];
FileInputStream fis= new FileInputStream(a_imageFile);
fis.read(bytesArray);
byte[] encoded = Base64.getEncoder().encode(bytesArray);            
result = "data:image/jpg;base64,"+ String.valueOf(encoded);

正確的:

...
result = "data:image/jpg;base64,"+ new String(encoded);

另一個不同的例子:

在讀取文件並使用 readAllBytes() 時,使用 new String() 可以打印該文件的內容。

String template = new String(fileName.readAllBytes());
Log.info("File content: " + template;

//文件的內容被記錄為'你好,這是我的txt文件的內容'

但是,當使用 String.valueOf 時,您將獲得地址位置。

String template = String.valueOf(fileName.readAllBytes());
Log.info("File address: " + template;

//記錄一個地址位置,而不是像'A@24gj49bj'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM