http://kohlerm.blogspot.co.uk/2009/01/is-javalangopesi INTERN-really-evil.html
khẳng định String.equals()
sử dụng "=="
để so sánh String
các đối tượng trước đó, theo
http://www.codeinemony.com/2009/01/busting-javalangopesi INTERN-myths.html
nó so sánh độ dài của Chuỗi và sau đó là nội dung.
. có lẽ bạn nên đặt một chiếc mũ bảo hiểm an toàn cùng một lúc.)
Vì vậy, có vẻ như bạn nhận được lợi ích từ việc thay thế Chuỗi của mình bằng intern()
phiên bản của chúng , nhưng bạn có được sự an toàn - và khả năng đọc và tuân thủ tiêu chuẩn - không sử dụng "==" equals()
trong lập trình của bạn. Và hầu hết những gì tôi sẽ nói phụ thuộc vào điều đó là sự thật, nếu nó là sự thật.
Nhưng String.equals()
kiểm tra rằng bạn đã truyền cho nó một Chuỗi chứ không phải một số đối tượng khác, trước khi sử dụng "=="
? Tôi không đủ điều kiện để nói, nhưng tôi đoán là không, bởi vì hầu hết các equals()
hoạt động như vậy sẽ là String to String, do đó bài kiểm tra hầu như luôn được thông qua. Thật vậy, việc ưu tiên "==" bên trong String.equals()
ngụ ý rằng bạn thường xuyên so sánh Chuỗi với cùng một đối tượng thực tế.
Tôi hy vọng không ai ngạc nhiên khi các dòng sau tạo ra kết quả là "sai":
Integer i = 1;
System.out.println("1".equals(i));
Nhưng nếu bạn đổi i
sang i.toString()
dòng thứ hai, dĩ nhiên là vậy true
.
Địa điểm mà bạn có thể hy vọng cho một lợi ích từ thực tập bao gồm Set
và Map
, rõ ràng. Tôi hy vọng rằng các chuỗi được thực hiện có mã băm của họ được lưu trữ ... Tôi nghĩ đó sẽ là một yêu cầu. Và tôi hy vọng tôi đã không đưa ra một ý tưởng có thể kiếm cho tôi một triệu đô la. :-)
Đối với bộ nhớ, rõ ràng đó là một giới hạn quan trọng nếu âm lượng Chuỗi của bạn lớn hoặc nếu bạn muốn bộ nhớ được sử dụng bởi mã chương trình của bạn rất nhỏ. Nếu khối lượng -distinc- String của bạn rất lớn, thì có lẽ đã đến lúc bạn nên cân nhắc sử dụng mã chương trình cơ sở dữ liệu chuyên dụng để quản lý chúng và một máy chủ cơ sở dữ liệu riêng biệt. Tương tự như vậy, nếu bạn có thể cải thiện một chương trình nhỏ (cần chạy trong 10000 trường hợp đồng thời) bằng cách nó hoàn toàn không lưu trữ Chuỗi của nó.
Cảm thấy lãng phí khi tạo một Chuỗi mới và sau đó loại bỏ nó ngay lập tức để intern()
thay thế, nhưng không có sự thay thế rõ ràng, ngoại trừ việc giữ Chuỗi trùng lặp. Vì vậy, thực sự chi phí thực hiện là tìm kiếm chuỗi của bạn trong nhóm thực tập và sau đó cho phép trình thu gom rác xử lý bản gốc. Và nếu đó là một chuỗi ký tự thì dù sao nó cũng đã được thực hiện.
Tôi tự hỏi liệu intern()
có thể bị lạm dụng bởi mã chương trình độc hại để phát hiện xem một số Chuỗi và tham chiếu đối tượng của chúng đã tồn tại trong nhóm intern()
hay không và do đó tồn tại ở nơi khác trong phiên Java, khi điều đó không được biết. Nhưng điều đó chỉ có thể xảy ra khi mã chương trình đã được sử dụng theo cách đáng tin cậy, tôi đoán vậy. Tuy nhiên, đây là điều cần xem xét về các thư viện của bên thứ ba mà bạn đưa vào chương trình để lưu trữ và ghi nhớ số PIN ATM của bạn!