Tôi biết rằng một chuỗi C abc
sẽ nội bộ là abc\0
trong C, có giống trường hợp với Java không?Làm thế nào là một chuỗi đại diện trong Java nội bộ?
Trả lời
Không, chuỗi C là một mảng ký tự và do đó không có độ dài liên kết với chúng. Tác động phụ của quyết định này là để xác định chiều dài của một chuỗi, người ta phải lặp lại thông qua nó để tìm các \0
, mà không phải là hiệu quả mang theo chiều dài xung quanh.
Chuỗi Java có mảng char cho ký tự của chúng và có chiều dài offset và chiều dài chuỗi. Điều này có nghĩa là xác định chiều dài của chuỗi là khá hiệu quả.
Chuỗi trong ngôn ngữ C là một mảng kiểu char, như trong Java nó là một lớp và nó đại diện cho bộ sưu tập của unicode chars.
Không, nó không giống nhau trong Java. Không có terminator null. Các chuỗi Java là các đối tượng, không phải là các điểm của các ký tự. Nó duy trì độ dài cùng với các ký tự Unicode, vì vậy không cần phải tìm một null terminator.
Bạn không cần phải hỏi tại đây: xem mã nguồn cho String.java trong src.zip đi kèm với JDK của bạn. Đây là sự khởi đầu của nó:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
/** Cache the hash code for the string */
private int hash; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
}
+1 nguồn không bao giờ nằm – alex
Cần lưu ý rằng UTF-16 được sử dụng (hoặc biến thể rất nhỏ của nó?) Cho 'giá trị []'. Không phải tất cả các ký tự Unicode đều có thể được nhồi trong một 'char'. –
Ngoài ra, chỉ vì có một 'giá trị []' (và một 'chiều dài ') * không * có nghĩa là không có thêm một null-terminator (okay, không có trong JVM kinh điển). Ví dụ, [BCL - aka .NET/C# - có * cả hai *] (http://stackoverflow.com/questions/6293457/why-are-c-net-strings-length-prefixed-and-null -terminated), mặc dù terminator không bao giờ được tiếp xúc trực tiếp với mã được quản lý. (Mặt khác, vì điều này, BCL không thể tạo ra một "khung nhìn" của một chuỗi thành một chuỗi khác như 'String.substring' làm trong Java.) –
No. Null terminators được sử dụng trong C vì nó dễ dàng hơn là đi qua một con trỏ và kích thước. Trong Java, kích thước luôn luôn được biết và do đó, một terminator null là không cần thiết. Hơn nữa, không có ký tự chấm dứt trong Java (đặt trong một \0
sẽ là một phần của chuỗi chữ).
Chuỗi Java không bị chấm dứt null như chuỗi C. Điều này là do Java lưu trữ độ dài của chuỗi. Bạn có thể truy xuất độ dài bằng String.length()
.
Lớp String
được triển khai bằng Java. Xem ví dụ của OpenJDK implementation.
Các OpenJDK 7 String
lớp mang một loạt các loại char[]
để giữ chuỗi riêng của mình, cũng như bù đắp (kể vị trí đầu tiên được sử dụng trong char[]
), chiều dài của chuỗi, và mã băm của chuỗi .
Nó cũng có hai trường tĩnh, ID phiên bản cho mục đích tuần tự hóa và ObjectStreamField[]
do vỏ đặc biệt đối với luồng đầu ra tuần tự hóa (ít nhất trong OpenJDK 7).
Trường serialPersistentFields 'ObjectStreamField [] là một' tĩnh'. Một 'Chuỗi' không" chứa "một. Tương tự cho trường 'serialVersionUID'. Trong thực tế, một cá thể 'String' có 4 trường. –
Bạn nói đúng; Tôi đã làm cho câu trả lời cụ thể hơn để phù hợp. –
Tôi nghĩ rằng trường offset đã bị hủy bỏ trước JDK7, có lẽ bởi vì những người thực hiện thấy rằng nếu 'triệu' là một chuỗi triệu ký tự, có' triệu.substr (10,3) 'giữ một tham chiếu đến một cửa hàng triệu ký tự có thể rất lãng phí. IMHO, họ nên đã thiết kế 'substr' để tạo ra một cửa hàng sao lưu mới khi sử dụng ít hơn một nửa của cái cũ, nhưng có một bù đắp vào cái cũ nếu không. Điều đó sẽ hạn chế sử dụng bộ nhớ xấu nhất chỉ có tối đa 2x, trong khi tạo điều kiện cho một số mẫu sử dụng thông dụng. – supercat
Theo như tôi biết, trong chuỗi java được lưu trữ như một đối tượng trong phần heap như là một lớp con của Object. Không cần sử dụng '\ 0' để chỉ định các ký tự hoặc Chuỗi.
- 1. đại diện nội bộ của chuỗi trong C#
- 2. Làm thế nào là null đại diện trong NET
- 3. "\ 1" đại diện cho chuỗi Java này là gì?
- 4. làm thế nào để có được một byte [] đại diện từ một IP trong chuỗi thức trong Java
- 5. Làm thế nào để phân tích một chuỗi đại diện của một băm
- 6. Làm thế nào char [] có thể đại diện cho một chuỗi UTF-8?
- 7. ký tự đại diện trong Java PreparedStatements
- 8. Làm thế nào để chuyển đổi một chuỗi đại diện của một số thành một số trong coldfusion?
- 9. Trong Lisp chung một đại diện được in là gì?
- 10. Làm thế nào để đại diện cho char trống trong Java Character lớp
- 11. Làm thế nào để đại diện cho thời gian trong ngày (tức là 19:00) trong Java?
- 12. Java: Bắt các thuộc tính của một lớp học để xây dựng một chuỗi đại diện
- 13. jQuery selector ký tự đại diện trong một chuỗi
- 14. In thoát đại diện của một str
- 15. Làm thế nào để sử dụng định dạng chuỗi Python để chuyển đổi một số nguyên đại diện cho xu cho một phao đại diện cho đô la?
- 16. Đại diện bên trong của inf và NaN là gì?
- 17. Đại diện một Char với chuỗi tương đương
- 18. Chuyển đổi chuỗi đại diện unicode
- 19. Làm thế nào là phao và tăng gấp đôi đại diện trong C + + (gcc)?
- 20. Làm thế nào để .Net CLR thực hiện một "Giao diện" nội bộ?
- 21. Nội bộ (bộ nhớ) đại diện của TProc và tài liệu tham khảo tại tất cả
- 22. Python C API: làm thế nào để có được đại diện chuỗi của ngoại lệ?
- 23. Làm thế nào để đăng nhập nội bộ của một đối tượng tùy ý trong Java?
- 24. Làm thế nào tôi có thể để perl diễn giải một biến chuỗi đại diện cho một địa chỉ
- 25. Làm thế nào để có được đại diện nhị phân 0-đệm của một số nguyên trong java?
- 26. Làm thế nào để đại diện cho một Enum trong một giao diện khi bạn không thể
- 27. Làm thế nào để đại diện cho một mảng với các loại hỗn hợp
- 28. Làm thế nào để nén một chuỗi trong Java?
- 29. Java Generics (ký tự đại diện)
- 30. Thực hiện một nội tuyến để đại diện cho một ListField trong Django-nonrel
uh ... "ghế"? – buruzaemon
@buruzaemon: Bạn biết ngay cả những ký tự xứng đáng ở đâu đó để ngồi, phải không? – alex
+1 cho chế độ xem nhân đạo của bạn trên 'char' và nơi họ có thể nghỉ ngơi một lúc, @alex – buruzaemon