2009-04-29 37 views
7

Tôi cần lưu trữ trong một ký tự lớp 4 liên tục của một mã. Tôi có thể làm:Char Array vs String: tốt hơn để lưu trữ một tập hợp các chữ cái

static final String CODE_LETTERS = "TRWAG"; 

hoặc

static final char[] CODE_LETTERS = {'T', 'R', 'W', 'A', 'G'}; 

Sau đó, tôi có thể có được một trong những nhân vật mà theo hai cách:

final char codeLetter = CODE_LETTERS.charAt(index); 

hoặc

final char codeLetter = CODE_LETTERS[index]; 

là những gì cách tốt nhất?. Vui lòng ghi nhớ hiệu chỉnh, hiệu suất, v.v.

+9

Có vẻ như 5 chữ cái :) – willcodejavaforfood

Trả lời

6

Hiệu suất không liên quan trong trường hợp này. Nếu nó thực sự được cho là không đổi, bạn không thể sử dụng cách tiếp cận char[]. Xem xét:

public class Test 
{ 
    static final char[] CODE_LETTERS = {'T', 'R', 'W', 'A', 'G'}; 

    public static void main(String[] args) throws Exception 
    { 
    System.out.println(CODE_LETTERS[0]); // T 
    CODE_LETTERS[0] = 'x'; 
    System.out.println(CODE_LETTERS[0]); // x 
    } 
} 
+1

Ai nói hiệu suất là không liên quan? Rất nhiều người dành rất nhiều công sức để thực hiện. Tất nhiên việc thực hiện có thể làm những điều nghịch ngợm, nhưng nếu đại diện được bản địa hoá, chúng ta chỉ có thể nói "đừng làm vậy". –

+1

Tôi có nghĩa là nó không phải là một câu hỏi về hiệu suất, bởi vì phiên bản char [] thậm chí không hoạt động như dự định. Hãy tập trung vào sửa lỗi rõ ràng trong TRƯỜNG HỢP NÀY: tối ưu hóa sớm và sử dụng một mảng làm hằng số. –

+0

Tôi đã chỉnh sửa câu trả lời của mình sau khi trao đổi ở trên và thêm vào vòng loại "trong trường hợp này". Tôi đang đề cập đến nó ở đây để tránh những người đọc khó hiểu quá tệ. –

6

Trừ khi bạn định tìm nạp ký tự vài triệu lần liên tiếp, bạn không cần phải bận tâm về hiệu suất.

+7

Suy nghĩ của tôi chính xác. Nghiêm túc: * Tối ưu hóa sớm là gốc rễ của tất cả những điều xấu xa. * – pyrocumulus

+0

Nhưng không kém phần quan trọng, không nên xua đuổi sớm. Đối với một chuỗi không thay đổi độ dài cố định, mảng char sẽ luôn luôn nhanh hơn và có ít chi phí bộ nhớ hơn đối tượng chuỗi std :: equiavlent. – PaulJWilliams

+0

Nó cũng có thể là loại điều được thực hiện rất nhiều lần. Điều gì nếu đây là một phương pháp mới trong việc thực hiện 'java.lang.String'? –

8

Không chính xác, nhưng vì bạn sẽ xử lý riêng từng cá nhân char của tôi, hãy sử dụng số char []. Điều đó nói rằng, tác động này sẽ có hiệu suất sẽ là không đáng kể nếu thậm chí có thể đo lường được.

5

Điều này gần như chắc chắn là một tối ưu hóa sớm. Bất cứ điều gì bạn lưu trong hiệu suất bằng cách sử dụng một mảng ký tự có thể bị mất trong khả năng đọc nếu bạn cần phải đưa nó vào các phương pháp khác, vì nó kinh điển hơn để chấp nhận một String thay vì một char[].

1

Vì chuỗi sử dụng char [] để giữ các chữ cái của bạn, câu trả lời đúng là char [] nhanh hơn. Khi nghi ngờ nhìn vào nguồn, không có ma thuật trong String, nó chỉ sử dụng nguyên thủy như int và char [] giống như bất kỳ lớp nào khác.

Bạn thực sự không nên quan tâm đến điều gì đó tầm thường như thế này. Một địa ngục nhiều hơn sẽ xảy ra trong một chương trình, điều đáng lo ngại về việc liệu một String đơn có nhanh hơn việc sử dụng mảng char hay không.

+0

Có, nhưng khi một chuỗi ngữ nghĩa có nghĩa là được sử dụng như một chuỗi thay vì một mảng các ký tự thì String nên được sử dụng. Việc sử dụng char [] trong Java chỉ có ý nghĩa nếu bạn muốn làm việc với các mục ký tự riêng lẻ hoặc cần thường xuyên thay thế các vị trí mảng. – orad

2

Ý nghĩa của String không thực sự phù hợp với một bộ char. Vì vậy, char[] là triển khai, mặc dù không có nghĩa là được đặt, sẽ không thêm ý nghĩa bổ sung của String. OTOH, bạn có thể tìm thấy phương pháp hữu ích trong String. Mặt khác, java.util.Arrays cũng có các phương thức hữu ích như [binarySearch] [2].

Có lẽ những gì bạn muốn làm là giới thiệu một trừu tượng cho một tập hợp char, điều này có thể khác nhau giữa việc sử dụng String là đơn giản nhất có thể hoạt động, quét tuyến tính char[] (nhanh nếu bạn không quét rất xa) , tìm kiếm nhị phân, bộ bit. thưa thớt chút bộ, băm, lũ lụt lọc vv

[2]: http://java.sun.com/javase/6/docs/api/java/util/Arrays.html#binarySearch(char[], int, int, char)

1

Thời gian duy nhất mà bạn sẽ thấy một sự khác biệt hiệu suất giữa String và mảng nhân vật đang diễn ra để được theo một hồ sơ, và sau đó chỉ vì profiler sẽ làm điều sai trái. Các JVMS hiện đại (JDk 6+) sẽ tạo ra cùng một mã cho hai lần truy cập khi JVM quyết định rằng điều này đủ nóng để tối ưu hóa.

Để trả lời câu hỏi của bạn; Nếu bạn đang sử dụng Java 5, hãy sử dụng liệt kê, nếu bạn đang sử dụng một cái gì đó trước Java5, hãy sử dụng Java enumeration Pattern.

Nó sẽ làm cho mã của bạn dễ đọc hơn, vì bạn sẽ không cần phải theo dõi các khoảng trống ở đâu đó, bạn chỉ có thể sử dụng điều tra. Thêm vào đó, nó sẽ được nhanh hơn, vì bạn sẽ có thể làm điều gì đó như:


    final char codeLetter = enum.getCodeLetter(); 
+1

Không có dấu hiệu cho thấy rằng enum là những gì anh ta muốn. Nếu anh ta sẽ sử dụng các ký tự như các ký tự ở đâu đó thì nó không có ý nghĩa để lưu trữ chúng như là enums. – DJClayworth

+0

Nếu các giá trị enum là T, R, W, A, G thì toString() có thể được sử dụng. –

1

Hình như bạn nên xem xét sử dụng một enum. Xem Enum Types

+1

Nếu không biết sử dụng thì đó không phải là một gợi ý tốt.Nếu anh ta sẽ so sánh nhân vật với các nhân vật khác thì một enum không có ý nghĩa. – DJClayworth

5

Chuỗi không thay đổi, char [] thì không. Nếu bạn định nghĩa nó là một "hằng số" công khai trong một lớp thì String là hằng số thực.

Ví dụ, nếu bạn có điều này:

public class MyClass { 
    public static final char[] CODE_LETTERS = {'h', 'e', 'l', 'l', 'o'}; 
    .... 
} 

tôi có thể tất cả lén lút và làm điều này:

MyClass.CODE_LETTERS[0] = 'Q'; 

Bam, tôi đã thay đổi giá trị của "liên tục" của bạn.

Từ khóa final chỉ ảnh hưởng đến tham chiếu đến mảng, nó không áp dụng cho các phần tử mảng. Tôi thấy một sai lầm tương tự tất cả thời gian với Collections.unmodifiableList(), mọi người nghĩ rằng nó bảo vệ danh sách của họ nhưng mã khách hàng vẫn có thể truy cập và sửa đổi các yếu tố danh sách.

Vì vậy, để trả lời câu hỏi của bạn, hãy sử dụng Chuỗi.

0

Hài hước, tôi vừa viết một số blog entry về điều này hôm qua. Bạn cần một lớp chuyên biệt quấn quanh char []. Lớp Characters của tôi là một cách nhẹ nhàng để giữ một bộ ký tự không thay đổi được, và cung cấp các phương pháp hiệu quả cao cho những thứ như tìm kiếm. Đó là mã nguồn mở.

+0

Lớp học của bạn sẽ sắp xếp các nhân vật của anh ấy vào xây dựng nên nó không thực sự trả lời câu hỏi của anh ấy, nhưng tôi thích ý tưởng đằng sau lớp. Nếu tôi có thể +1 bài đăng trên blog của bạn theo đúng nghĩa của tôi, tôi sẽ làm như vậy. – ahcox

+0

@ahcox, cảm ơn vì những lời tốt đẹp. Tôi đã thêm vào Facebook "like" khả năng vào trang blog của mình, vì vậy hãy thoải mái thử nó! ;) –

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