2010-01-20 44 views
31

Tại sao Java không có kiểu nguyên thủy cho Chuỗi khi hầu hết các loại dữ liệu khác làm?Tại sao không có loại nguyên thủy cho Chuỗi?

+5

Ugh. Tôi muốn không có nguyên thủy ở tất cả phải trung thực với bạn. – CookieOfFortune

+0

Về cơ bản cùng một câu hỏi mà bạn đã hỏi ở đây: http://stackoverflow.com/questions/2099171/integer-as-primitve-type – David

+0

Bạn có thực sự muốn nói, tại sao không có đối tượng "loại giá trị" cho chuỗi thay vì loại nguyên thủy ? (tức là làm thế nào để bạn đặt một chuỗi trên ngăn xếp so với đống?) – BrainSlugs83

Trả lời

48

Chuỗi là một đối tượng, nó không phải là một kiểu nguyên thủy chút nào, chỉ là một mảng ký tự. Lý do tại sao loại nguyên thủy tồn tại trong Java ở tất cả là một trong những thú vị, đoạn trích từ a James Gosling interview:

Bill Venners: Tại sao có nguyên thủy loại trong Java? Tại sao không phải mọi thứ chỉ là một đối tượng?

James Gosling: Hoàn toàn hiệu quả điều. Có tất cả các loại người , những người đã xây dựng các hệ thống trong đó ints và là tất cả các đối tượng. Có nhiều cách để thực hiện điều đó và tất cả các số chúng đều có một số vấn đề nghiêm trọng về vấn đề . Một số chỉ chậm, vì chúng phân bổ bộ nhớ cho mọi thứ. Một số người trong số họ cố gắng làm các đối tượng , đôi khi chúng không phải là (mà là hệ thống LISP tiêu chuẩn đã làm), và sau đó mọi thứ trở nên thực sự kỳ lạ. Nó loại tác phẩm, nhưng thật kỳ lạ.

Chỉ cần làm cho nó như vậy mà có nguyên thủy và các đối tượng, và chúng chỉ khác nhau. Bạn giải quyết rất nhiều vấn đề.

Vì vậy, trong ngắn hạn các loại nguyên thủy tồn tại vì lý do hiệu quả.

+26

+1 - Và hệ quả là chuỗi không phải là nguyên thủy bởi vì nó làm cho nó một nguyên thủy sẽ không làm cho nó hiệu quả hơn. –

+1

Một lý do rất tốt để có các loại nguyên thủy thực sự! Nó chắc chắn tiết kiệm thời gian để chỉ cần thực hiện một int hơn đi lãng phí giây quý giá (khoảng 10) làm cho một ví dụ 'Integer foo = new Integer (aValueFoo);'. Tôi có thể lộn xộn để xem 'Integer foo Integer foo Integer foo Integer foo ...' lót mã của bạn theo ý kiến ​​của tôi. Integer có sử dụng của nó khi nói đến những điều lớn hơn để làm với số nguyên ... nguyên thủy là một phước lành! –

5

Hầu hết các ngôn ngữ lập trình không coi chuỗi nguyên thủy vì nó thực sự là một mảng ký tự. Các kiểu nguyên thủy hầu như luôn có kích thước cố định.

Tôi nên nói rằng mặc dù một số người có thể coi Chuỗi là "nguyên thủy" bởi vì nó được tích hợp sẵn. Nhưng nó không phải nguyên thủy theo nghĩa là một kiểu cơ bản trái ngược với một loại hỗn hợp. Bởi vì một chuỗi là một mảng các ký tự, nó là một loại hỗn hợp.

+0

Có ngôn ngữ nào coi nó là nguyên thủy không? Một chiều dài cố định trong bộ nhớ có phải là một bộ nhớ không? – Jeff

+0

Kỳ lạ là đủ, trong chuỗi Javascript là nguyên thủy. Nó có thể có độ dài bộ nhớ cố định vì nó không thay đổi được. –

13

int, char, float, double, v.v. tất cả đều có độ dài cố định trong bộ nhớ. ví dụ. một int có 4 byte, do đó 32 bit.

nhưng một chuỗi có thể có độ dài khác nhau, nó thực sự là một mảng char.

+1

Vâng, đó là một lý do để nói tại sao nó phải là một loại đối tượng (tức là một lớp) và không phải là một loại giá trị (tức là một cấu trúc) - câu hỏi là, tại sao nó không phải là nguyên thủy? - Trong Java là tất cả các kiểu giá trị nguyên thủy? - Không có cấu trúc nào trong Java? – BrainSlugs83

+1

Câu trả lời hợp lý CHỈ được tìm thấy cho một câu hỏi thẳng: Vì các vấn đề phân bổ bộ nhớ. một kiểu int hoặc float đòi hỏi một kích thước bộ nhớ cụ thể, nhưng một chuỗi (xin lỗi, String) có độ dài thay đổi được tạo thành từ một thời gian không xác định (tại thời điểm khai báo) của bộ nhớ. Giai đoạn. Cảm ơn bạn rất nhiều! – user3285866

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