Sau đó tôi được hỏi có bao nhiêu chuỗi chương trình này sẽ tạo ra, giả sử việc thu gom rác không xảy ra. Suy nghĩ của tôi cho n = 3 là (7)
Chuỗi 1 ( ""
) và 2 ( "a"
) là các hằng số trong chương trình, chúng không được tạo như một phần của sự vật mà là 'được thực hiện' bởi vì chúng là hằng số mà trình biên dịch biết. Đọc thêm về điều này tại String interning trên Wikipedia.
Điều này cũng loại bỏ chuỗi 5 và 7 khỏi số đếm vì chúng giống "a"
như Chuỗi số 2. Điều này để lại các chuỗi # 3, # 4 và # 6. Câu trả lời là "3 chuỗi được tạo cho n = 3" bằng mã của bạn.
Tổng số n 2 rõ ràng là sai bởi vì tại n = 3, đây sẽ là 9 và thậm chí theo câu trả lời trong trường hợp xấu nhất của bạn, đó chỉ là 7. Nếu các chuỗi không được thực hiện của bạn là chính xác, câu trả lời nên là 2n + 1.
Vì vậy, câu hỏi làm thế nào bạn nên làm điều này?
Vì Chuỗi là bất biến , bạn muốn một thứ có thể thay đổi - thứ bạn có thể thay đổi mà không cần tạo đối tượng mới. Đó là StringBuilder .
Điều đầu tiên cần xem xét là các nhà xây dựng. Trong trường hợp này, chúng ta biết chuỗi sẽ dài bao nhiêu và có một hàm tạo StringBuilder(int capacity)
có nghĩa là chúng ta phân bổ chính xác bao nhiêu chúng ta cần.
Tiếp theo, "a"
không cần phải là String , mà thay vào đó, nó có thể là một ký tự 'a'
. Điều này có một số tăng hiệu suất nhỏ khi gọi append(String)
vs append(char)
- với append(String)
, phương thức cần tìm hiểu Chuỗi dài bao nhiêu và thực hiện một số công việc trên đó. Mặt khác, char
luôn luôn chính xác một ký tự dài.
Sự khác biệt về mã có thể được nhìn thấy tại StringBuilder.append (String) so với StringBuilder.append (char) . Nó không phải là một cái gì đó quá quan tâm, nhưng nếu bạn đang cố gắng gây ấn tượng với nhà tuyển dụng, tốt nhất là sử dụng các thực tiễn tốt nhất có thể.
Vì vậy, làm thế nào điều này trông khi bạn đặt nó lại với nhau?
public String foo(int n) {
StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; i++) {
sb.append('a');
}
return sb.toString();
}
Một StringBuilder và một String đã được tạo. Không có chuỗi bổ sung cần thiết để được thực tập.
Viết một số chương trình đơn giản khác trong Eclipse. Cài đặt pmd và chạy nó trên mã bạn viết. Lưu ý những gì nó phàn nàn và sửa chữa những điều đó. Nó sẽ tìm thấy sự sửa đổi của Chuỗi có + trong một vòng lặp và nếu bạn thay đổi chuỗi đó thành StringBuilder, nó có thể đã tìm thấy dung lượng ban đầu, nhưng chắc chắn nó sẽ nắm bắt được sự khác biệt giữa .append("a")
và.append('a')