假設我們有這樣的程序:現在將從System.in中讀取的兩個相同的字符串存儲在公共內存位置中嗎?
import java.io.*;
public class ReadString {
public static void main (String[] args) {
// prompt the user to enter their name
System.out.print("Enter your name: ");
// open up standard input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String userName = null;
String userNameCopy = null;
// read the username from the command-line; need to use try/catch with the
// readLine() method
try {
userName = br.readLine();
System.out.print("Enter your name once again: ");
userNameCopy = br.readLine();
} catch (IOException ioe) {
System.out.println("IO error trying to read your name!");
System.exit(1);
}
System.out.println("Thanks for the name, " + userName);
}
} // end of ReadString class
,如果用戶輸入自己的用戶名兩次,userName
和userNameCopy
字符串將具有相同的價值。由於字符串是不可變的,Java編譯器是否足夠聰明,只能使用一個帶有兩個引用的內存對象,還是隻保留硬編碼到程序中的字符串文字?
如果答案是「否,編譯器將在堆上創建兩個單獨的對象」。爲什麼?是否因爲搜索池中的精確匹配很慢?如果是這樣,不能像某種哈希表或類似的東西實現字符串池?
不應該假定任何關於字符串標識的東西 –
只應該假設那些在JLS和/或String API文檔中指定的關於字符串標識的東西。 –
@PatriciaShanahan甚至沒有那些值得假設的IMO –