Trong Thread.java, dòng 146, tôi đã nhận thấy rằng tác giả đã sử dụng một số char[]
thay vì String
cho trường tên. Có bất kỳ lý do hiệu suất nào mà tôi không biết? getName()
cũng bao bọc ký tự trong chuỗi trước khi trả lại tên. Không phải là nó tốt hơn để chỉ sử dụng một String
?Tại sao sử dụng char [] thay vì String?
Trả lời
Nói chung, có. Tôi nghi ngờ char[]
đã được sử dụng trong Thread
vì lý do hiệu suất, trở lại trong những ngày khi những thứ như vậy trong Java yêu cầu mọi nỗ lực để có được hiệu suất tốt. Với sự ra đời của các JVM hiện đại, các tối ưu hóa vi mô như vậy đã từ lâu trở nên không quan trọng, nhưng nó chỉ còn lại theo cách đó.
Có rất nhiều mã lạ trong nguồn Java 1.0 thời đại cũ, tôi sẽ không chú ý quá nhiều vào nó.
Tôi cũng nghi ngờ điều này. Nhưng sau đó tôi thấy 'String name' trong ThreadGorup tôi đã nhầm lẫn. Cảm ơn câu trả lời. –
Tôi sẽ chấp nhận câu trả lời này bởi vì nhiều người cho rằng không có lý do chính đáng nào. –
Chuỗi là bất biến nên đó là lý do tại sao anh ta sử dụng nó. Hiệu quả phiên bản java 2end nói rằng "Luôn luôn sử dụng String thay thế bất cứ khi nào có thể" của Josha Blouch –
Khó nói. Có lẽ họ đã có một số tối ưu trong tâm trí, có lẽ người đã viết mã này chỉ đơn giản là sử dụng nhiều hơn cho các mảng kiểu C char*
cho các chuỗi, hoặc có lẽ do thời gian mã này được viết, họ không chắc chắn nếu chuỗi sẽ không thay đổi hay không. Nhưng với mã này, bất cứ lúc nào một số Thread.getName()
được gọi, một mảng char mới được tạo ra, vì vậy mã này thực sự nặng hơn trên GC hơn là chỉ sử dụng một chuỗi.
+1 Điều này đúng về GC. –
Có thể lý do là bảo vệ an ninh? Chuỗi có thể được thay đổi với sự phản ánh, do đó tác giả muốn sao chép đọc và viết. Nếu bạn đang làm điều đó, bạn cũng có thể sử dụng mảng char để sao chép nhanh hơn.
- 1. Có thể/Tại sao sử dụng char * thay vì const char * trong kiểu trả về gây ra sự cố?
- 2. tại sao nó sử dụng movl thay vì đẩy?
- 3. Tại sao sử dụng Enums thay vì Constants?
- 4. Tại sao UnderscoreJS sử dụng toString.call() thay vì typeof?
- 5. Tại sao nên sử dụng Function.prototype.bind thay vì Function.prototype.call?
- 6. Tại sao sử dụng registerDefaults: thay vì setValue: forKey :?
- 7. Tại sao RTP sử dụng UDP thay vì TCP?
- 8. Tại sao sử dụng singleton thay vì lớp tĩnh?
- 9. Tại sao sử dụng tai thay vì chiến tranh?
- 10. Tại sao sử dụng ROLAP thay vì MySQL đơn giản?
- 11. Tại sao nên sử dụng GWT.create() thay vì mới?
- 12. Tại sao sử dụng singleton thay vì phương pháp tĩnh?
- 13. Tại sao sử dụng jQuery trên() thay vì nhấp chuột()
- 14. Tại sao memo.Lines sử dụng TStrings thay vì TStringList?
- 15. Android: tại sao phải sử dụng getBaseContext() thay vì
- 16. Tại sao sử dụng var thay vì tên lớp?
- 17. Tại sao sử dụng Celery thay vì RabbitMQ?
- 18. Tại sao sử dụng tăng :: ice_or thay vì || và tăng :: ice_and thay vì && trong enable_if?
- 19. Tôi có nên sử dụng String thay vì TFilename không?
- 20. std.algorithm.joiner (string [], string) - tại sao các phần tử kết quả là dchar chứ không phải char?
- 21. Tại sao putchar, toupper, tolower, vv lấy một int thay vì một char?
- 22. Tại sao Xcode 4.2 sử dụng @autoreleasepool trong main.m thay vì NSAutoreleasePool?
- 23. tại sao std :: string s ("?? <") xuất một {thay vì ?? <như mong đợi?
- 24. Tại sao darcs thay vì git?
- 25. Tại sao nên sử dụng bảng chuyển đổi thay vì nếu có các thống kê khác?
- 26. Tại sao chặn thay vì lặp?
- 27. Tại sao CHỌN 0, ... thay vì CHỌN
- 28. Tại sao FloatBuffer thay vì phao []?
- 29. Tại sao testFixture thay vì TestClass?
- 30. Tại sao sử dụng .AsEnumerable() thay vì truyền tới IEnumerable <T>?
Gọi đến chuỗi. {GetChars, getBytes, toLowerCase, ...} tất cả trả về các đối tượng mới là bản sao của chuỗi gốc. Nếu bạn làm việc với chuỗi lớn hoặc gọi một trong những phương pháp này nhiều lần. Bạn có thể kết thúc với các bộ sưu tập rác bổ sung không cần thiết. Ví dụ, hãy tưởng tượng một nhịp tim HTTP cho bất kỳ lý do gì được gọi là OutputStream.write (epochTimeString.getBytes()) trên mỗi nhịp. Bạn phải lo lắng về những chi tiết này thường xuyên hơn nếu bạn làm việc với Mobile JVMs. – eSniff