Tôi muốn sử dụng String.intern() trong Java để tiết kiệm bộ nhớ (sử dụng nhóm nội bộ cho các chuỗi có cùng nội dung). Tôi gọi phương thức này từ các chủ đề khác nhau. Đó có phải là vấn đề?Là chuỗi String.intern() an toàn
Trả lời
Câu trả lời ngắn cho câu hỏi của bạn là có. Đó là chủ đề an toàn.
Tuy nhiên, bạn có thể muốn xem xét lại bằng cách sử dụng cơ sở này để giảm mức tiêu thụ bộ nhớ. Lý do là bạn không thể loại bỏ bất kỳ entires nào từ danh sách các chuỗi nội bộ. Một giải pháp tốt hơn sẽ là tạo ra cơ sở của riêng bạn cho việc này. Tất cả bạn cần là để lưu trữ các chuỗi của bạn trong một HashMap<String,String>
như vậy:
public String getInternedString(String s) {
synchronized(strings) {
String found = strings.get(s);
if(found == null) {
strings.put(s, s);
found = s;
}
return found;
}
}
(cộng với khóa, vì OP muốn an toàn chủ đề) – CodesInChaos
Bạn cũng có thể đề cập đến hiệu suất 'intern' đáng sợ. Nếu tôi nhớ chính xác thì độ phức tạp thời gian là O (* n *) trong đó * n * là kích thước hiện tại của nhóm chuỗi. –
Không nên là 'if (found == null)'? Ngoài ra, như được viết, điều này hầu như không an toàn, ngay cả khi 'chuỗi' là một cấu trúc dữ liệu an toàn chủ đề. –
Là một bất biến Java-String được trả lại, phương pháp này là thread-safe. Bạn không thể thao tác chuỗi như là.
Tài liệu thực sự cho thấy rằng nó là an toàn chỉ. (Bằng cách nhấn mạnh cho bất kỳ)
Nó sau đó cho bất kỳ hai chuỗi s và t, s.intern() == t.intern() là đúng khi và chỉ khi s .equals (t) là đúng.
- Thứ ba, JNI giao diện sử dụng C-ngôn ngữ
jobject
s.jstring
là một trong số chúng và là tất cảjobject
không thay đổi theo định nghĩa. Vì vậy, cũng trên một cấp độ c bản địa, chúng tôi duy trì an toàn thread.
Đặt tên chúng, chúng tôi có lý do chính đáng để nói rằng đó là an toàn chỉ.
PS: Tuy nhiên, bạn có thể gặp phải các kết quả khó khăn nếu bạn sử dụng nhiều trình tải lớp, vì nhóm chuỗi được duy trì trên String-class
.
A pool of strings, initially empty, is maintained privately by the class String.
'java.lang.String' chỉ có thể được nạp bởi trình nạp lớp bootstrap. – irreputable
@irreputable Tôi không chắc chắn về cách bạn sẽ làm điều đó, nhưng nếu một trong những hiện nó có vấn đề. – poitroae
- 1. là chuỗi java.util.UUID có an toàn không?
- 2. Chuỗi an toàn của Netty Channel.write có an toàn không?
- 3. Tại sao mã này không phải là chuỗi an toàn?
- 4. là + = trong chuỗi python có an toàn không?
- 5. Tạo chuỗi tên an toàn ngẫu nhiên và chuỗi an toàn URL
- 6. An toàn loại an toàn()
- 7. Liệu String.intern() thay đổi tham chiếu của gốc Chuỗi JDK7
- 8. Chuỗi NSUserDefault có an toàn không?
- 9. Tạo chuỗi không an toàn từ char []
- 10. Độ an toàn của chuỗi quá nhiều?
- 11. Chức năng so sánh chuỗi an toàn
- 12. Chuỗi RNGCryptoServiceProvider.GetBytes có an toàn không?
- 13. Mã an toàn và không an toàn
- 14. Loại an toàn trong .net là gì?
- 15. Là mạng của Ruby :: HTTP an toàn?
- 16. là an toàn 1024 bit rsa
- 17. Định tuyến an toàn là gì?
- 18. Là int? chủ đề an toàn?
- 19. msdn: "An toàn chủ đề" là gì?
- 20. Là C# '??' thread điều hành an toàn?
- 21. Tornado hết hạn cookie an toàn (còn gọi là cookie phiên an toàn)
- 22. Mảng an toàn không có khóa an toàn
- 23. Loại in an toàn
- 24. an toàn thread unordered_map
- 25. Lớp Spring MVC phải là chủ đề an toàn
- 26. Là chủ đề cơ sở dữ liệu Sqlite an toàn
- 27. Are 'thông số chuỗi const` (thread) an toàn
- 28. Tạo chuỗi dữ liệu an toàn trong C#
- 29. tạo std :: chuỗi từ char * một cách an toàn
- 30. Sự khác nhau giữa đề an toàn và an toàn
Sẽ rất ngạc nhiên nếu nó không an toàn. Đó sẽ là một lỗ hổng lớn trong thiết kế thư viện đó. – CodesInChaos
Các chuỗi đó đến từ đâu? – jlordo
@jlordo - Bất kỳ biểu thức chuỗi nào không phải là một hằng số biên dịch-thời gian không được tự động interned. Vì vậy, ví dụ, 'chuỗi mới (" abc ")! =" Abc "; tuy nhiên, '" ab "+" c "==" abc "' (vì nội trú). –