2013-01-09 18 views
6

Tôi cần giữ nhiều đối tượng chuỗi trong bộ nhớ (hàng trăm MB) và tôi muốn giữ chúng ở định dạng UTF-8 vì trong hầu hết các trường hợp, nó sẽ yêu cầu một nửa bộ nhớ sử dụng.
Lớp Chuỗi mặc định yêu cầu chuỗi 12 ký tự 60 byte (Xem http://blog.griddynamics.com/2010/01/java-tricks-reducing-memory-consumption.html).
Hầu hết các chuỗi của tôi dài từ 10-20 ký tự.
Tôi tự hỏi liệu có một số thư viện nguồn mở cung cấp trình bao bọc cho các chuỗi như vậy không?
Tôi biết cách chuyển đổi chuỗi thành mảng byte UTF-8 nhưng tôi đang tìm lớp bao bọc sẽ cung cấp tất cả các hàm tiện ích cần thiết (Hash, Equal, toString, fromString, v.v.).UTF-8 Chuỗi lớp cho java

+2

http://docs.oracle.com/javase/tutorial/i18n/text/string.html – Doorknob

+2

Java lưu trữ tất cả các chuỗi nội bộ trong UTF-16, vì vậy bạn 12 chuỗi ký tự là 24 byte nội bộ. Không tính phí đối tượng bắt buộc, con số 60 byte đó đến từ đâu? – fge

+0

... tối thiểu 24 byte, vì mã hóa UTF có độ dài thay đổi (được cấp, bạn phải sử dụng một số ký tự kỳ lạ nghiêm trọng vượt quá 24 byte trong ví dụ của OP) –

Trả lời

2

Apache Avro có UTF8 wrapper class mà thực hiện CharSequence, nhưng tôi không biết mức tiêu thụ bộ nhớ của các đối tượng như vậy

Hadoop có Text class trong đó có khá các loại giao diện mà bạn mong muốn

+0

có phải bạn muốn tạo cả hai liên kết giống nhau không? – AgilePro

+0

không, chắc chắn :-) Tôi đã thực hiện chỉnh sửa – Grooveek

0

Nếu bạn muốn có một đối tượng riêng biệt cho mỗi chuỗi và bạn muốn chúng càng nhỏ gọn càng tốt, sau đó sử dụng mảng byte. Điều đó sẽ là 1 byte cho mỗi char so với 2, và bạn sẽ không có phí trên đầu trang String (có thể thêm 32 byte cho mỗi đối tượng).

Nhưng tất nhiên bạn sẽ không thể sử dụng bất kỳ phương thức String nào trên các phương thức này mà không chuyển đổi thành Chuỗi trước tiên.

Nhưng nếu bạn thực sự muốn tiết kiệm dung lượng, hãy lưu trữ chuỗi ngược lại trong một vài mảng lớn hơn, với "vectơ dope" để định vị các chuỗi riêng lẻ.

Các vấn đề liên quan