Tôi thực sự bối rối với cách hoạt động của Java trong string interning. Khi tôi viết:Việc thực hiện chuỗi ký tự được thực hiện tại thời gian biên dịch trong Java?
String a = "ABC";
String b = "ABC";
if (a==b)
System.out.println("Equal");
Trình biên dịch lưu chuỗi ký tự "ABC" vào nhóm hằng số chuỗi tại thời gian biên dịch không?
Nghe có vẻ phi logic, vì tôi nghĩ rằng chuỗi hằng số chuỗi được JVM tạo ra khi chạy, và tôi không thấy làm thế nào có thể nếu nó được thực hiện tại thời gian biên dịch vì trình biên dịch Java thậm chí không gọi JVM .
Nếu nó không được thực hiện tại thời gian biên dịch và nó được thực hiện tại thời gian chạy thì tại sao sau đây trở về sai (lấy từ this answer)?
// But .substring() is invoked at runtime, generating distinct objects
"test" == "!test".substring(1) // --> false
Nếu được thực hiện trong thời gian chạy thì tại sao JVM không thể nhận ra rằng chúng là cùng một chuỗi?
Tôi thực sự bối rối về cách thức thực thi chuỗi hoạt động trong Java và nơi lưu trữ chính xác nhóm chuỗi Java.
Các liên kết sau đây là sâu sắc: http://stackoverflow.com/questions/513832/ how-do-i-compare-strings-in-java – Zyn
Tôi không chắc chắn về phần đầu tiên của câu hỏi của bạn, nhưng 'chuỗi con' trả về một đối tượng * mới *, và vì vậy trong khi nội dung của cả hai chuỗi khớp với' test ', vì chúng không phải là cùng một đối tượng' == 'trả về false. –
Đó là trình biên dịch. Tôi không hiểu tại sao bạn nói rằng nó không thể đặt cả hai chuỗi trong chuỗi hằng số chuỗi.Trình biên dịch sẽ đặt các chuỗi không đổi bên trong một số vị trí bộ nhớ, sau đó khi khởi chạy chương trình, JVM sẽ tải bộ nhớ đó và tạo nhóm không đổi được sử dụng trong thời gian chạy, nhưng hồ bơi được thiết lập bởi trình biên dịch. – Bakuriu