JavaRush /Blog Java /Random-VI /Chuỗi += Chuỗi hoặc StringBuilder.append(String)?
SemperAnte
Mức độ
Донецк

Chuỗi += Chuỗi hoặc StringBuilder.append(String)?

Xuất bản trong nhóm
Trong bài viết này, tôi muốn xem xét, phân tích, cho biết và chỉ ra sự khác biệt giữa phương thức chắp thêm từ lớp StringBuildervà toán tử +=cho String. Ở đây câu hỏi sẽ không đặt nhiều vào lĩnh vực ứng dụng mà là tối ưu hóa mã.
Chuỗi += Chuỗi hoặc StringBuilder.append(String)?  - 1
Đúng, một người chắc chắn chưa đi sâu vào câu hỏi này sẽ nói: “Tại sao tôi nên thay thế toán tử += bằng cách tạo một đối tượng mới của một lớp hoàn toàn khác, sau đó gọi phương thức đó toString()? Chúng ta đang ở mức tối ưu nào đang nói về sự lựa chọn là hiển nhiên, bạn đang nói về cái gì vậy? và anh ấy sẽ hoàn toàn sai lầm. Một trong những vấn đề là Stringnó không nguyên thủy. String- một đối tượng giống như bất kỳ đối tượng nào khác classtrong Java, và như bạn biết, trong Java không có cái gọi là nạp chồng toán tử (chẳng hạn như trong C++), các toán tử chỉ được định nghĩa cho các kiểu nguyên thủy và đối với bất kỳ lớp nào, chúng ta không thể ghi đè bất kỳ toán tử nào. Đó là lý do tại sao các toán tử " +" và " += " là một loại "cái nạng" của thư viện Java, một cái nạng luôn phát sinh tổn thất. Trên thực tế, chúng ta hãy ngừng kéo đuôi mèo và chuyển sang đo lường. Đây là một chương trình đơn giản đo thời gian cần thiết để “dán” một đường thẳng với một biến vòng lặp 100.000 lần.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        String s = "Hello";
        for(int i = 0; i < 100000; ++i)
        {
            s+=i;
        }
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
Trên máy tính của tôi, 6815ms được hiển thị trong bảng điều khiển. Tức là máy tính của tôi mất gần 7 giây để ghép dòng này lại với nhau. Bây giờ, hãy thay thế nó bằng StringBuilder và thậm chí đưa phương thức này toString()vào các phép đo.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        StringBuilder sb = new StringBuilder("Hello");
        for(int i = 0; i < 100000; ++i)
        {
            sb.append(i);
        }
        String s = sb.toString();
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
PC của tôi nói với tôi 10ms. Tức là 0,01 giây. Tôi nghĩ sự khác biệt trong thực tế là khá rõ ràng; nói một cách đại khái, nó hoạt động appendnhanh hơn 700 lần. Điều này là do thực tế là rất có thể " " +và " +=" có thể tự gọi cùng một phần bổ sung, nhưng đồng thời phải trải qua một chặng đường dài với sự hỗ trợ của ngôn ngữ để hiểu rằng một toán tử như vậy thậm chí còn tồn tại và nó là gì nên làm (đoạn cuối chỉ là phỏng đoán, tôi không phải là nhà phát triển JVM và tôi không biết ở đó có gì và như thế nào). Đây là một ví dụ rõ ràng về thực tế rằng một vật thể bổ sung không phải lúc nào cũng tốn kém. Có, mã sẽ dài hơn một vài dòng, nhưng mức tiết kiệm thời gian trong các dự án lớn có thể rất lớn. Xin lưu ý rằng các phép đo không được thực hiện trên một chiếc PC văn phòng có bộ xử lý thời tiền sử, nhưng bây giờ hãy tưởng tượng xem nó sẽ tạo ra sự khác biệt như thế nào trên chính chiếc máy tính văn phòng này, vốn khó có thể kéo được khăn.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION