2011-12-16 26 views

Trả lời

7

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ả.

Source.

+2

uh ... "ghế"? – buruzaemon

+4

@buruzaemon: Bạn biết ngay cả những ký tự xứng đáng ở đâu đó để ngồi, phải không? – alex

+1

+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

2

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.

10

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; 
} 
+0

+1 nguồn không bao giờ nằm ​​ – alex

+0

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'. –

+0

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.) –

2

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ữ).

2

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().

1

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).

+0

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. –

+0

Bạn nói đúng; Tôi đã làm cho câu trả lời cụ thể hơn để phù hợp. –

+0

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

0

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.

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