2013-08-20 49 views
8

Tôi là một sinh viên vừa chuyển từ C++ sang Java.Chuỗi ký tự và ký tự trong Java

Trong Java, lý do chính để xác định loại dữ liệu riêng biệt cho mảng Strings và Char là gì? Sự khác biệt giữa hai là gì?

Vì tôi chỉ học C++, cho đến bây giờ tôi đã có ấn tượng rằng chúng giống nhau. Vui lòng làm rõ nếu có thể.

Trả lời

15

String là không thay đổi. Char mảng không. Một chuỗi được thực hiện với một mảng char bên dưới nhưng mỗi khi bạn cố gắng sửa đổi nó (giống như với nối, thay thế, vv) nó cung cấp cho bạn một đối tượng mới String.

Vì vậy, String hoạt động như một mảng Char không đổi nhưng đi kèm với một số cú pháp cú pháp nhất định cũng khiến chúng dễ sử dụng hơn. Ví dụ: toán tử bổ sung + đã bị quá tải làm toán tử nối chuỗi.

+0

Cảm ơn bạn đã phản hồi. Tôi có một nghi ngờ khác - Tôi có thể sử dụng đối tượng String như char [] không? Như trong nếu tôi muốn truy cập vào một yếu tố ngẫu nhiên tại bất kỳ điểm nào hoặc để lưu trữ một char tại bất kỳ chỉ mục là nó có thể làm như vậy trong một String? – iluvthee07

+1

Ravi xứng đáng nhận được câu trả lời của mình. Để mở rộng một chút về câu trả lời của anh ta, một trong những cấu trúc dữ liệu phổ biến nhất mà bạn làm việc khi lập trình là 'String' vì nhu cầu vốn có của hệ thống máy tính để tương tác với con người. Các nhà thiết kế của Java đã nhận ra điều này và bọc char [] vào một đối tượng đặc biệt gọi là String để tương tác với các chuỗi thuận tiện hơn – StormeHawke

+1

@ iluvthee07 - vâng. Bạn sẽ muốn 'string.charAt (index)' cho trường hợp đầu tiên. Đối với thứ hai, bạn cần phải hoặc là chơi xung quanh với các chất nền, hoặc sử dụng 'string.toCharArray()' và làm việc với điều đó. Để biết thêm chi tiết về những gì bạn có thể làm với 'String', tôi khuyên bạn nên xem xét 'Chuỗi' javadoc tại đây: http://docs.oracle.com/javase/6/docs/api/java/lang /String.html – StormeHawke

2

String là một lớp trong Java và cung cấp cho bạn các phương pháp và cũng là một đối tượng.

Đối tượng chuỗi cũng không thay đổi.

Giá trị nội bộ là mảng char.

1

Trong Java, String là một lớp hệ thống cơ bản về cơ bản bao bọc một char[]. Có một số lý do tại sao, đối với hầu hết các mục đích sử dụng, việc có một lớp học đầy đủ là thích hợp hơn để xử lý trực tiếp mảng:

  • String s là không thay đổi; một khi bạn có một tham chiếu đến một số String, bạn biết nó sẽ không bao giờ thay đổi.
  • String s cung cấp các phương thức hữu ích mà một mảng trống không thể, chẳng hạn như length() và có ngữ nghĩa so sánh được xác định rõ ràng.
  • Bạn không bao giờ phải tự giải quyết việc chấm dứt chuỗi.
  • Java có ngoại lệ đặc biệt cho quy tắc "không có quá tải toán tử" để hỗ trợ nối chuỗi (với +).

Về cơ bản, thực hành OO tốt để sử dụng lớp để thu thập hành vi mong muốn và cấu trúc dữ liệu ở cùng một vị trí và String kết thúc tốt đẹp các hoạt động hữu ích mà bạn muốn thực hiện trên chuỗi .

+0

Cảm ơn bạn đã trả lời. Tôi có một nghi ngờ khác - Tôi có thể sử dụng đối tượng String như char [] không? Như trong nếu tôi muốn truy cập vào một yếu tố ngẫu nhiên tại bất kỳ điểm nào hoặc để lưu trữ một char tại bất kỳ chỉ mục là nó có thể làm như vậy trong một String? – iluvthee07

+0

[The Javadoc] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html) đáng đọc. 'Chuỗi' là không thay đổi, có nghĩa là nó không thể được sửa đổi khi được tạo. 'charAt' sẽ cung cấp quyền truy cập chỉ đọc cho các ký tự riêng lẻ bên trong mảng sao lưu. 'StringBuilder' (và' StringBuffer' cũ hơn, chậm hơn) cung cấp các ngữ nghĩa đọc-ghi xung quanh một 'char []', có thể được chuyển thành một 'String' chỉ đọc khi bạn đã hoàn thành việc xây dựng nó. – chrylis

0

Lợi thế khi sử dụng đối tượng chuỗi là tất cả các phương pháp có sẵn cho nó. Ví dụ:

stringExample1.equals(stringExample2); 

String stringExample3 = stringExample1.replace(substring1, substring2); 
1

Có một ngữ nghĩa chênh lệch . Chỉ vì dữ liệu được lưu trữ theo cùng một cách, điều này không có nghĩa là nó giống nhau. DatesAmounts cũng có thể có cùng một biểu diễn nội bộ (long cho dấu thời gian hoặc số tiền cố định), nhưng chúng không giống nhau. Mảng char cũng có nghĩa là hình ảnh 16 bit.

Trong định hướng đối tượng, đó là thực hành tốt để đối tượng mô hình dựa trên những gì họ đang có và có thểkhông phải bởi cách họ trong nội bộ lưu trữ dữ liệu của họ. Điều này cho phép bạn đóng gói dữ liệu (và hạn chế hoặc kiểm soát (hỗ trợ quan sát viên) với getters/setters hoặc thậm chí làm cho biểu diễn bên trong không thay đổi hoặc có thể gộp được) và cung cấp các phương thức thích hợp cho các đối tượng của bạn.

2

Chuỗi không thay đổi trong Java và được lưu trữ trong nhóm Chuỗi. Một khi nó được tạo ra nó nằm trong hồ bơi cho đến khi thu thập rác. Vì vậy, String là bất biến, mật khẩu đăng nhập là chuỗi có thể đọc được. Nó có nguy cơ lớn hơn trong việc tạo ra kết xuất bộ nhớ để tìm mật khẩu.

trong đó mảng Char được tạo trong heap và bạn có thể ghi đè bằng một số giá trị giả.

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