การเห็นคำอธิบายนี้ดีดังนั้นฉันจะหันกลับมา
มี 3 คลาสใน Java ที่รับผิดชอบการดำเนินงานของตัวละคร
1. ตัวละครเป็นการทำงานของตัวละครเดียว
2.STRING ทำงานบนสตริงของอักขระคลาสที่ไม่เปลี่ยนรูป
3.StringBuffer ยังเป็นการดำเนินการกับสตริงของอักขระและเป็นคลาสที่ไม่แน่นอน
สตริง:
มันเป็นวัตถุไม่ใช่ประเภทดั้งเดิม
มันเป็นวัตถุที่ไม่เปลี่ยนรูปและเมื่อสร้างขึ้นแล้วค่าของมันจะไม่สามารถแก้ไขได้
การปรับเปลี่ยนวัตถุสตริงที่มีอยู่คือการสร้างวัตถุใหม่ใหม่และบันทึกค่าใหม่ในนั้น
สตริงเป็นคลาสสุดท้ายนั่นคือมันไม่สามารถสืบทอดได้
StringBuffer:
มันเป็นวัตถุที่ไม่แน่นอน
มันสามารถสร้างขึ้นได้โดยตัวสร้างเท่านั้น
StringBuffer sb = new StringBuffer ();
หมายเหตุ: ไม่สามารถชำระเงินได้ด้วยสัญลักษณ์การมอบหมาย
sb = "ยินดีต้อนรับสู่ที่นี่!"; // ข้อผิดพลาด
หลังจากสร้างวัตถุพื้นที่หน่วยความจำจะได้รับการจัดสรรในหน่วยความจำและจะมีการบันทึก NULL ในขั้นต้น
sb.append ("สวัสดี");
ประสิทธิภาพของ StringBuffer สูงกว่าสตริงในการต่อสตริง:
string str = สตริงใหม่ ("ยินดีต้อนรับสู่");
str += "ที่นี่";
ขั้นตอนการประมวลผลคือการสร้าง StringBuffer จากนั้นเรียก Append () และในที่สุด
จากนั้นเพิ่ม StringBuffer tosting ();
ด้วยวิธีนี้การดำเนินการเชื่อมต่อสตริงจะมีการดำเนินการเพิ่มเติมบางอย่างมากกว่า StringBuffer และแน่นอนว่าประสิทธิภาพจะลดลง
และเนื่องจากวัตถุสตริงเป็นวัตถุที่ไม่เปลี่ยนรูปการดำเนินการแต่ละครั้งของการต่อยจะสร้างวัตถุใหม่ใหม่เพื่อบันทึกค่าใหม่
ด้วยวิธีนี้วัตถุดั้งเดิมจะไร้ประโยชน์และจะถูกเก็บรวบรวมขยะ
ดูรหัสต่อไปนี้:
ทำซ้ำ 26 ตัวอักษรภาษาอังกฤษ 5,000 ครั้ง
การคัดลอกรหัสมีดังนี้:
String tempStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Int Times = 5000;
Long LSTART1 = System.currentTimeMillis ();
string str = "";
สำหรับ (int i = 0; i <times; i ++) {
str += tempstr;
-
Long Lend1 = System.currentTimeMillis ();
นาน = (Lend1 - LSTART1);
System.out.println (เวลา);
น่าเสียดายที่คอมพิวเตอร์ของฉันไม่ใช่ซูเปอร์คอมพิวเตอร์และผลลัพธ์ที่ฉันได้รับไม่จำเป็นต้องเหมือนกันในแต่ละครั้งโดยปกติจะอยู่ที่ประมาณ 46687
นั่นคือ 46 วินาที
มาดูรหัสต่อไปนี้
การคัดลอกรหัสมีดังนี้:
String tempStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Int Times = 5000;
Long LSTART2 = System.currentTimeMillis ();
StringBuffer sb = new StringBuffer ();
สำหรับ (int i = 0; i <times; i ++) {
SB.Append (TempSTR);
-
Long Lend2 = System.currentTimeMillis ();
Long Time2 = (Lend2 - LSTART2);
System.out.println (time2);
ผลที่ได้คือ 16 และบางครั้งก็เป็น 0
ดังนั้นข้อสรุปจึงชัดเจนความเร็วของ Stringbuffer เกือบหลายพันเท่าของสตริง แน่นอนว่าข้อมูลนี้ไม่ถูกต้องมากนัก เนื่องจากจำนวนรอบคือ 100,000 เท่าความแตกต่างจึงยิ่งใหญ่กว่า ถ้าคุณไม่เชื่อฉันลอง
หากคุณยังไม่เข้าใจ:
1) ความแตกต่างระหว่างวิธีการร่วม + ของสตริงและวิธีการผนวกของ StringBuff:
เมื่อสตริง + โอเปอเรเตอร์ดำเนินการสตริงก่อนจะแปลงวัตถุสตริงปัจจุบันเป็นประเภทสตริงบัฟให้เรียกวิธีการผนวกของมัน
อย่างไรก็ตามในแง่ของความสามารถในการอ่านตัวดำเนินการเชื่อมต่อของสตริงยังคงสูง
2) Stringbuff คือ Thread-Safe
สตริงไม่ปลอดภัยสำหรับเธรด
3) สตริงเป็นวัตถุสตริงที่ไม่สามารถแก้ไขได้ในขณะที่ StringBuff ได้รับการแก้ไข
การคัดลอกรหัสมีดังนี้:
Public Static Boolean FileCopy (String Srcstr, String DestStr) {
ไฟล์ srcfile = null;
ไฟล์ destFile = null;
Reader Reader = null;
Writer Writer = Null;
ธงบูลีน = เท็จ;
พยายาม {
srcfile = ไฟล์ใหม่ (srcstr);
if (! srcfile.exists ()) {
System.out.println ("ไฟล์ต้นฉบับไม่มีอยู่");
System.Exit (0);
} อื่น {
reader = filereader ใหม่ (srcfile);
-
destFile = ไฟล์ใหม่ (DESTSTR);
Writer = ใหม่ FileWriter (DestFile);
ถ่าน [] buff = ใหม่ถ่าน [1024];
int len;
string str = "";
StringBuffer sbuff = new StringBuffer ();
ในขณะที่ ((len = reader.read (buff))! = -1) {
// str += สตริงใหม่ (buff, 0, len);
sbuff.append (สตริงใหม่ (buff, 0, len));
-
// writer.write (str.tochararray ());
writer.write (sbuff.toString (). tochararray ());
ธง = จริง;
Writer.flush ();
reader.close ();
Writer.close ();
} catch (ioexception e) {
System.out.println ("ข้อยกเว้นการคัดลอกไฟล์: =" + e.getMessage ());
-
ธงกลับ;
-