2016-03-23 16 views
12

Có lợi ích hiệu suất nào khi sử dụng một số private final static String trong java hay không bằng cách sử dụng một biến chuỗi cục bộ để có được "khởi tạo" mỗi khi phương thức được truy cập?Java Strings: private static vs local variable hiệu suất

Tôi nghĩ rằng việc sử dụng các chuỗi private static final là một thực hành tốt cho các hằng số được sử dụng lại ở các phần khác nhau của một lớp, tuy nhiên, nếu một chuỗi chỉ được sử dụng trong một phương pháp. không có phương pháp nào khác được quan tâm, tôi thực sự thích giữ giao diện nội bộ của lớp sạch hơn với các thành viên riêng tư ít hơn và chỉ sử dụng một biến cục bộ.

Cho rằng java có chuỗi interning, và thực sự giữ một hồ bơi với một bản sao của mỗi chuỗi được khai báo bằng cách sử dụng dấu ngoặc kép (String s = "some string"), sẽ thực sự có hiệu suất trúng từ phải khai báo/khởi tạo/gán biến thời gian phương pháp được truy cập so với sử dụng một chuỗi tĩnh?

Để làm rõ hơn một chút, có sự khác biệt nào giữa việc sử dụng SS hoặc LS không?

class c { 
private final static String SS = "myString"; 

    private void method(){ 
    //do something with SS 
    } 

    private void OtherMethod(){ 
    String LS = "myOtherString" 
    //do same thing with LS 
    } 
} 
+1

"* giữ một hồ bơi với một bản sao của mỗi chuỗi khác nhau *" điều này là không chính xác. Chỉ các chuỗi Java thực tập (trừ khi bạn gọi 'String.intern()') là '" được trích dẫn "' hằng số trong mã của bạn. Các chuỗi được xây dựng trong thời gian chạy là * không * được tập trung trong nhóm hằng số. – dimo414

+0

bạn là đúng, những người mà tôi đang đề cập đến, tôi sẽ chỉnh sửa –

Trả lời

7

Sử dụng hằng số được đặt tên có khả năng tốt hơn để bảo trì. Tuy nhiên các hằng số được biết tại thời gian biên dịch có thể được gạch chân trong trường hợp đó không có sự khác biệt nào.

Lưu ý: nếu bạn đang sử dụng chuỗi ký tự, điều này sẽ được tạo chỉ một lần, bất kể nơi nào trong JVM được sử dụng.

Trong trường hợp này, sự khác biệt duy nhất là sử dụng một biến cục bộ trên ngăn xếp mà không có khả năng đắt hơn một hằng số đã được gạch chân.

sẽ có thực sự là một buổi biểu diễn hit khỏi phải khai báo biến mỗi lần phương pháp này được truy cập

Như Java sử dụng một trình biên dịch tĩnh, một biến được chỉ tuyên bố một lần (hoặc một lần cho mỗi giai đoạn biên dịch), khi tải lớp/phương thức, bất kể số lần các phương thức được gọi. Biến có thể được khởi tạo mỗi lần.

2

Sự thật là, cuối cùng, không có sự khác biệt. Một chuỗi liên tục trong một biến cục bộ sẽ vẫn kết thúc trong nhóm không đổi và được tối ưu hóa. Nói chung, các biến cục bộ nhanh hơn vì chúng dễ truy cập hơn, nhưng trong trường hợp các chuỗi không đổi, nó không tạo ra sự khác biệt. Vì vậy, hãy chọn mọi thứ dễ đọc và trực quan hơn trong trường hợp của bạn.

+2

tại sao bạn có nghĩa là các biến cục bộ nhanh hơn so với các thống kê ??? –

+0

@Xoce 웃 Thêm một biến cục bộ có khả năng sẽ nhanh hơn một chút so với truy cập trường 'tĩnh' không cuối cùng. Tuy nhiên các hằng số có thể được gạch chân nên sự khác biệt là đặc biệt. –

+0

biến số lokal có thể được tối ưu hóa rất tốt. trong một số trường hợp, nó có thể được loại bỏ. ở những người khác, nó có thể được truy cập bằng cách sử dụng các lệnh rất nhanh làm việc liên quan đến ngăn xếp hoặc con trỏ cơ sở. biến tĩnh phải luôn được truy cập bằng địa chỉ đầy đủ của chúng – loonytune