So sánh tham chiếu - tức là cả hai biến đều đề cập đến cùng một đối tượng chính xác (thay vì chỉ các đối tượng bằng nhau).
s
và s2
tham chiếu đến các đối tượng khác nhau, do đó biểu thức đánh giá là sai.
s
và s1
tham chiếu đến cùng một đối tượng (giống nhau) do bài tập.
s2
và s3
đề cập đến cùng một đối tượng (như nhau) vì chuỗi thực tập.
Nếu điều đó không giúp được gì nhiều, vui lòng hỏi thêm chi tiết về một bit cụ thể. Các đối tượng và tham chiếu có thể gây nhầm lẫn khi bắt đầu.
Lưu ý rằng chỉ có chuỗi literals đang thực tập nội trú theo mặc định ... do đó, mặc dù s
và s2
tham khảo bằng chuỗi, họ vẫn còn hai đối tượng riêng biệt. Tương tự, nếu bạn viết:
String x = new String("foo");
String y = new String("foo");
thì x == y
sẽ đánh giá là sai. Bạn có thể lực interning, mà trong trường hợp này sẽ thực sự trở lại với nghĩa đen thực tập nội trú:
String x = new String("foo");
String y = new String("foo");
String z = "foo";
// Expressions and their values:
x == y: false
x == z: false
x.intern() == y.intern(): true
x.intern() == z: true
EDIT: Một bình luận cho rằng new String(String)
về cơ bản là vô nghĩa. Đây không phải là trường hợp, trên thực tế.
A String
đề cập đến một char[]
, có độ lệch và chiều dài. Nếu bạn lấy một chuỗi con, nó sẽ tạo một Chuỗi mới đề cập đến cùng một sốchar[]
, chỉ với độ dài và độ lệch khác nhau. Nếu bạn cần giữ một chuỗi con nhỏ của chuỗi dài trong một thời gian dài, nhưng chính chuỗi dài không cần thiết, thì việc sử dụng công cụ tạo new String(String)
để tạo một bản sao chỉ là phần bạn cần, cho phép lớn hơn char[]
để được thu gom rác thải.
Ví dụ về việc này là đọc một tệp từ điển - nhiều từ ngắn, một từ trên mỗi dòng. Nếu bạn sử dụng BufferedReader.readLine()
, mảng char được phân bổ sẽ có ít nhất 80 ký tự (trong JDK chuẩn). Điều đó có nghĩa rằng ngay cả một từ ngắn như "và" có một mảng char của 160 byte + overheads ... bạn có thể chạy ra khỏi không gian khá nhanh chóng như vậy. Sử dụng new String(reader.readLine())
có thể tiết kiệm trong ngày.
Nguồn
2009-12-11 12:06:01
Không phải là các chuỗi được thực tập, vì vậy nó thực sự đánh giá đúng? –
@Winston Smith: Các chữ được tập trung, nhưng 's' được gán giá trị trả về của một cuộc gọi hàm tạo. –
@Winston: Nếu chúng là cùng một đối tượng, nhưng bạn sẽ thấy một cuộc gọi đến intern() trong câu hỏi ở đâu? – Fredrik