JavaRush /จาวาบล็อก /Random-TH /String += String หรือ StringBuilder.append(String)?
SemperAnte
ระดับ
Донецк

String += String หรือ StringBuilder.append(String)?

เผยแพร่ในกลุ่ม
ในบทความนี้ ผมอยากจะพิจารณา วิเคราะห์ บอก และแสดงความ แตก ต่างระหว่างวิธีการผนวกจากคลาสStringBuilderและตัวดำเนินการ+=สำหรับ Stringในที่นี้จะมีคำถามไม่มากนักในด้านการใช้งานเช่นเดียวกับการปรับโค้ดให้เหมาะสม
String += String หรือ StringBuilder.append(String)?  - 1
ใช่ บุคคลที่ไม่ได้เจาะลึกคำถามนี้อย่างไม่ต้องสงสัยจะพูดว่า: “เหตุใดฉันจึงควรแทนที่ตัวดำเนินการ += ด้วยการสร้างอ็อบเจ็กต์ใหม่ของคลาสที่แตกต่างไปจากเดิมอย่างสิ้นเชิงแล้วเรียกเมธอดนี้ด้วย อะไรtoString()ที่เราปรับให้เหมาะสมที่สุด พูดถึงเหรอ ตัวเลือกชัดเจนคุณกำลังพูดถึงอะไร” และเขาจะผิดอย่างสิ้นเชิง ปัญหาประการหนึ่งก็คือว่าStringมันไม่ใช่แบบดั้งเดิม String- วัตถุเหมือนกับอย่างอื่นclassใน Java และดังที่คุณทราบ ใน Java ไม่มีตัวดำเนินการโอเวอร์โหลด (เช่นใน C ++ เป็นต้น) ตัวดำเนินการถูกกำหนดไว้สำหรับพื้นฐานเท่านั้น และสำหรับคลาสใด ๆ เราไม่สามารถแทนที่ตัวดำเนินการใด ๆ ได้ นั่นคือเหตุผลว่าทำไมตัวดำเนินการ " +" และ " += " จึงเป็น "ไม้ยัน" ชนิดหนึ่งของไลบรารี Java และไม้ยันย่อมทำให้เกิดการสูญเสียเสมอ จริงๆ แล้วเรามาหยุดดึงหางแมวแล้วไปวัดกันดีกว่า ต่อไปนี้เป็นโปรแกรมง่ายๆ ที่ใช้วัดเวลาที่ใช้ในการ "ติดกาว" เส้นที่มีตัวแปรวนซ้ำ 100,000 ครั้ง
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");
    }
}
บนคอมพิวเตอร์ของฉัน 6815ms แสดงในคอนโซล นั่นคือคอมพิวเตอร์ของฉันใช้เวลาเกือบ 7 วินาทีในการต่อบรรทัดนี้เข้าด้วยกัน ตอนนี้เรามาแทนที่มันด้วย StringBuilder และรวมวิธีการไว้toString()ในการวัด ด้วย
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");
    }
}
พีซีของฉันบอกฉัน 10ms นั่นคือ 0.01 วินาที ฉันคิดว่าความแตกต่างในทางปฏิบัติค่อนข้างชัดเจน พูดคร่าวๆ มันทำงานได้appendเร็วกว่า 700 เท่า นี่เป็นเพราะความจริงที่ว่ามีแนวโน้มมากที่สุด " +" และ " +=" ที่สามารถเรียกตัวเองว่าผนวกแบบเดียวกันได้ แต่ในขณะเดียวกันก็ต้องใช้ไม้ค้ำยันของภาษามายาวนานเพื่อที่จะเข้าใจว่าตัวดำเนินการดังกล่าวมีอยู่จริงและมันคืออะไร ควรทำ (ย่อหน้าสุดท้ายไม่มีอะไรมากไปกว่าการเดา ฉันไม่ใช่นักพัฒนา JVM และฉันไม่รู้ว่ามีอะไรและทำอย่างไร) นี่เป็นตัวอย่างที่ชัดเจนว่าวัตถุเพิ่มเติมไม่ได้มีราคาแพงเสมอไป ใช่ โค้ดจะยาวขึ้นสองสามบรรทัด แต่การประหยัดเวลาในโครงการขนาดใหญ่อาจทำได้มหาศาล โปรดทราบว่าการวัดไม่ได้ทำบนพีซีในสำนักงานที่มีโปรเซสเซอร์ยุคก่อนประวัติศาสตร์ แต่ตอนนี้ลองจินตนาการดูว่ามันจะสร้างความแตกต่างให้กับคอมพิวเตอร์ในสำนักงานเครื่องนี้ซึ่งแทบจะไม่สามารถดึงผ้าพันคอได้
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION