2016-05-25 20 views
7

Tôi có một chuỗi và tôi cần phải đi qua nó như là một mảng char. Tất nhiên phương pháp thông thường là sử dụng toCharArray()Làm cách nào để chuyển đổi chuỗi thành char [] mà không sao chép đối tượng?

String str = "Hello"; 
char[] charArr = str.toCharArray(); 

Bây giờ, các mã nguồn cho toCharArray() là như sau.

public char[] toCharArray() { 
    // Cannot use Arrays.copyOf because of class initialization order issues 
    char result[] = new char[value.length]; 
    System.arraycopy(value, 0, result, 0, value.length); 
    return result; 
} 

Vì vậy, Java đang tạo đối tượng mới trong bộ nhớ kiểu char [] và sao chép đối tượng chuỗi vào đối tượng mới.

Câu hỏi của tôi là có hay không có thể sử dụng chuỗi dưới dạng char [] mà không sao chép mảng. Ý định của tôi là tiết kiệm dung lượng bộ nhớ. Nếu điều này là không thể, có một lý do như vậy?

Cảm ơn trước!

+4

Đưa ra tham chiếu trực tiếp đến mảng 'char []' có thể thay đổi của một đối tượng được cho là không thay đổi, sẽ là một ý tưởng rất tồi, đặc biệt nếu đối tượng bất biến được đề cập nếu kiểu 'Chuỗi', để thực hiện vai trò có liên quan đến bảo mật. – Holger

+2

Nếu bạn muốn tiết kiệm dung lượng bộ nhớ, không yêu cầu mảng 'char []'. Bạn không giải thích, tại sao bạn nghĩ bạn cần nó. – Holger

+0

Tôi cần một mảng để tôi có thể lặp qua nó theo chỉ mục. Tuy nhiên, những gì tôi đã không nhận ra và những gì Nicolas Filotto chỉ ra là Strings chỉ đơn giản là một lớp lưu trữ chuỗi trong một mảng 'char []'. Doy! Lỗi người mới bắt đầu :) –

Trả lời

11

Không, nó không phải là. Không phải không có sự phản chiếu, mà bạn nên tránh. Lộn xộn với các cơ bản char[] trong một chuỗi thông qua sự phản ánh là một công thức cho các lỗi tinh tế. Bạn có thể truy cập các ký tự riêng lẻ trong một chuỗi bằng cách sử dụng charAt, nhưng nếu bạn thực sự cần một số char[], bạn chỉ cần gọi toCharArray.

Nếu điều này là không thể, có lý do nào không?

Lý do đầu tiên: đóng gói. Mảng là một chi tiết triển khai cá nhân.

Lý do thứ hai: bất biến. Các chuỗi không thay đổi, nhưng các mảng không bao giờ là. Vì vậy, bạn có thể sửa đổi mảng char cơ bản, và chuỗi sẽ bị đột biến, nhiều đến sự ngạc nhiên của bất kỳ nhà phát triển nào dựa vào sự bất biến thông thường.

+1

Ngoài ra, các tham chiếu khác vào cùng một chuỗi trong chuỗi chuỗi cũng sẽ có cùng chuỗi bị biến đổi, dẫn đến nhầm lẫn lớn hơn. – Pokechu22

+1

@ Pokechu22: thậm chí tệ hơn, chính sách bảo mật (quyền, nguồn mã, tên người dùng) được lưu trữ dưới dạng chuỗi, vì vậy cho phép thay đổi chúng sẽ làm suy yếu toàn bộ mô hình bảo mật. – Holger

3

Đây là cách bạn có thể đi qua một String bằng cách nào đó như là một mảng char mà không sử dụng toCharArray():

for (int i = 0; i < str.length(); i++) { 
    char c = str.charAt(i); 
} 
+1

Cũng không phải là "nó" mà OP đã hỏi về ... nếu OP chỉ có một phương thức chấp nhận một 'char []' mà họ không thể sửa đổi, ví dụ, điều này sẽ không giúp đỡ chút nào. –

+0

Và nơi bạn lưu trữ các char được tạo ra này? –

+1

"Tôi có một chuỗi và tôi cần phải đi qua nó như là một mảng char" đây là yêu cầu chính của OP, những gì tôi đề nghị giúp đỡ trong đi qua chuỗi, nếu nó không phải là những gì OP hy vọng ông cần phải sửa đổi các câu hỏi –

3

Vì bạn đang mong đợi mảng trở lại, không có cách nào để lấy mảng mà không tạo mảng mới.

Đây là cách sạch nhất. Mặc dù bạn tạo ra chức năng của riêng bạn và làm một số thủ thuật, bạn sẽ kết thúc trong việc tạo mảng mới.

Đi với mã hiện tại của bạn.

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