บทความนี้ส่วนใหญ่จัดคำถามสัมภาษณ์ Java ทั่วไปสำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
1. ความแตกต่างระหว่างการนอนหลับและรอในชวา
①สองวิธีนี้มาจากคลาสที่แตกต่างกันการนอนหลับมาจากคลาสเธรดและรอมาจากคลาสวัตถุ
การนอนหลับเป็นวิธีการคลาสคงที่ของเธรด ใครก็ตามที่เรียกมันว่าจะเข้านอน แม้ว่าวิธีการนอนหลับของ B จะถูกเรียกในด้าย A แต่ก็ยังคงนอนหลับอยู่ ในการทำให้ด้าย B นอนหลับคุณต้องโทรไปนอนในรหัส B
②ล็อค: สิ่งที่สำคัญที่สุดคือวิธีการนอนหลับไม่ปล่อยล็อคในขณะที่วิธีการรอจะปล่อยล็อคเพื่อให้เธรดอื่นสามารถใช้บล็อกควบคุมหรือวิธีการแบบซิงโครนัส
การนอนหลับไม่ได้โอนทรัพยากรระบบ รอคือการเข้าสู่พูลรอเธรดเพื่อรอการโอนทรัพยากรระบบและเธรดอื่น ๆ สามารถครอบครอง CPU ได้ โดยทั่วไปการรอคอยจะไม่เพิ่มเวลา จำกัด เพราะหากเธรดรอทำงานในทรัพยากรไม่เพียงพอมันจะไร้ประโยชน์ที่จะออกมาอีกครั้ง คุณต้องรอให้เธรดอื่นโทรแจ้ง/แจ้งเตือนเพื่อปลุกเธรดทั้งหมดในพูลรอก่อนเข้าสู่คิวพร้อมและรอให้ระบบปฏิบัติการจัดสรรทรัพยากรระบบ สามารถระบุการนอนหลับ (มิลลิวินาที) เพื่อปลุกโดยอัตโนมัติ หากเวลาน้อยกว่าเวลาคุณสามารถเรียก Interrupt () เพื่อบังคับให้ขัดจังหวะ
ฟังก์ชั่นของ thread.sleep (0) คือ "ทริกเกอร์ระบบปฏิบัติการเพื่อแข่งขัน CPU อีกครั้ง"
③ขอบเขตการใช้งาน: รอแจ้งและแจ้งเตือนสามารถใช้งานได้ในวิธีการควบคุมการซิงโครไนซ์หรือบล็อกควบคุมการซิงโครไนซ์เท่านั้นในขณะที่การนอนหลับสามารถใช้งานได้ทุกที่
ซิงโครไนซ์ (x) {x.Notify () // หรือรอ ()}2. ความแตกต่างระหว่าง Hashmap และ Hashtable ใน Java
①เหตุผลทางประวัติศาสตร์: Hashtable มอบให้กับชั้นเรียนเก่าแก่ HashMap เป็นการดำเนินการของอินเทอร์เฟซแผนที่ที่แนะนำโดย Java 1.2
② HASHMAP อนุญาตให้คู่คีย์-ค่าที่ว่างเปล่าในขณะที่ Hashtable ไม่ได้
③การซิงโครไนซ์ Hashtable ในขณะที่ HashMap แบบอะซิงโครนัสมีประสิทธิภาพมากกว่าแฮช
3. โปรดอธิบายความแตกต่างระหว่างการโยนและการโยนสั้น ๆ สั้น ๆ
①การโยนหมายถึงการกระทำซึ่งหมายความว่ามีข้อยกเว้นถูกโยนลงไป การโยนหมายถึงสถานะซึ่งหมายความว่าวิธีการอาจมีข้อยกเว้นโยน②โยนถูกนำมาใช้ในการใช้วิธีการในขณะที่การโยนถูกใช้ในการประกาศวิธีการ③การโยนสามารถใช้เพื่อโยนข้อยกเว้นหนึ่งข้อในขณะที่การโยนสามารถโยนข้อยกเว้นหลายอย่าง
4. ความแตกต่างระหว่างหน่วยความจำล้นและการรั่วไหลของหน่วยความจำ
หน่วยความจำล้นออกจากหน่วยความจำหมายถึงความจริงที่ว่าเมื่อโปรแกรมใช้กับหน่วยความจำไม่มีพื้นที่หน่วยความจำเพียงพอที่จะใช้และออกจากหน่วยความจำจะปรากฏขึ้น ตัวอย่างเช่นหากมีการใช้จำนวนเต็ม แต่สามารถประหยัดได้นานมันจะเป็นหน่วยความจำล้น
หน่วยความจำรั่วการรั่วไหลของหน่วยความจำหมายถึงการไร้ความสามารถของโปรแกรมในการเพิ่มพื้นที่หน่วยความจำที่ใช้งานหลังจากสมัครสำหรับหน่วยความจำ อันตรายของการรั่วไหลของหน่วยความจำสามารถเพิกเฉยได้ แต่ผลที่ตามมาของการสะสมการรั่วไหลของหน่วยความจำนั้นร้ายแรงมาก ไม่ว่าจะมีความทรงจำมากแค่ไหนก็จะถูกครอบครองไม่ช้าก็เร็ว
การรั่วไหลของหน่วยความจำในที่สุดจะนำไปสู่ความทรงจำ!
หน่วยความจำล้นหมายความว่าหน่วยความจำที่คุณต้องการในการจัดสรรเกินกว่าที่ระบบจะให้คุณได้และระบบไม่สามารถตอบสนองความต้องการได้ดังนั้นจึงเกิดการล้น
การรั่วไหลของหน่วยความจำคือเมื่อคุณใช้กับระบบเพื่อจัดสรรหน่วยความจำเพื่อใช้งาน (ใหม่) แต่หลังการใช้งานจะไม่กลับมา (ลบ) ด้วยเหตุนี้คุณจึงไม่สามารถเข้าถึงหน่วยความจำที่คุณสมัครได้อีกต่อไป (บางทีคุณอาจสูญเสียที่อยู่) และระบบไม่สามารถจัดสรรให้กับโปรแกรมที่จำเป็นได้อีก หากคุณใช้วิธีการทั้งหมดในการเติมจานคุณสามารถถือได้ 4 ผลไม้ ถ้าคุณเติม 5 คุณจะล้มลงกับพื้นและคุณไม่สามารถกินมันได้ นี่คือล้น! ตัวอย่างเช่นหากสแต็กเต็มมันย่อมจะทำให้พื้นที่ล้นเมื่อสแต็กเต็มซึ่งเรียกว่าล้น หากสแต็คว่างเปล่ามันจะทำให้พื้นที่ไหลล้นเมื่อสแต็กว่างเปล่าซึ่งเรียกว่าใต้โฟลว์ หมายความว่าหน่วยความจำที่จัดสรรไม่เพียงพอที่จะวางลำดับของรายการข้อมูลซึ่งเรียกว่าหน่วยความจำล้น
การจำแนกประเภทในลักษณะที่เกิดขึ้นการรั่วไหลของหน่วยความจำสามารถแบ่งออกเป็น 4 หมวดหมู่:
①การรั่วไหลของหน่วยความจำบ่อย รหัสที่เกิดขึ้นกับการรั่วไหลของหน่วยความจำจะถูกดำเนินการหลายครั้งและทุกครั้งที่มีการดำเนินการมันจะทำให้หน่วยความจำชิ้นหนึ่งรั่วไหล
②การรั่วไหลของหน่วยความจำเป็นครั้งคราว รหัสที่เกิดขึ้นกับการรั่วไหลของหน่วยความจำจะเกิดขึ้นในสภาพแวดล้อมหรือการดำเนินการเฉพาะบางประการเท่านั้น ปกติและเป็นครั้งคราวเป็นญาติ สำหรับสภาพแวดล้อมที่เฉพาะเจาะจงโอกาสอาจเกิดขึ้นบ่อยครั้ง ดังนั้นสภาพแวดล้อมการทดสอบและวิธีการทดสอบจึงมีความสำคัญต่อการตรวจจับการรั่วไหลของหน่วยความจำ
③การรั่วไหลของหน่วยความจำครั้งเดียว รหัสที่เกิดขึ้นกับการรั่วไหลของหน่วยความจำจะถูกดำเนินการเพียงครั้งเดียวหรือเนื่องจากข้อบกพร่องของอัลกอริทึมจะมีการรั่วไหลของหน่วยความจำเพียงชิ้นเดียวเสมอ ตัวอย่างเช่นหน่วยความจำได้รับการจัดสรรในตัวสร้างของคลาส แต่หน่วยความจำไม่ได้ถูกปล่อยออกมาใน destructor ดังนั้นหน่วยความจำรั่วไหลเพียงครั้งเดียวเท่านั้น
④การรั่วไหลของหน่วยความจำโดยนัย โปรแกรมจัดสรรหน่วยความจำอย่างต่อเนื่องในระหว่างการดำเนินการ แต่จะไม่ปล่อยหน่วยความจำจนกว่าจะเสร็จสิ้น การพูดอย่างเคร่งครัดไม่มีหน่วยความจำรั่วที่นี่เพราะโปรแกรมในที่สุดปลดปล่อยหน่วยความจำที่ร้องขอทั้งหมด แต่สำหรับโปรแกรมเซิร์ฟเวอร์ต้องใช้เวลาหลายวันสัปดาห์หรือแม้กระทั่งเดือนในการทำงานและการไม่ปลดปล่อยหน่วยความจำในเวลาอาจนำไปสู่จุดสิ้นสุดของการหมดหน่วยความจำทั้งหมดในระบบ ดังนั้นเราจึงเรียกหน่วยความจำประเภทนี้รั่วไหลของหน่วยความจำรั่วไหลโดยนัย
จากมุมมองของผู้ใช้ที่ใช้โปรแกรมการรั่วไหลของหน่วยความจำเองจะไม่ก่อให้เกิดอันตรายใด ๆ ในฐานะผู้ใช้ทั่วไปคุณไม่สามารถรู้สึกถึงการรั่วไหลของหน่วยความจำได้เลย สิ่งที่เป็นอันตรายจริงๆคือการสะสมของการรั่วไหลของหน่วยความจำซึ่งในที่สุดจะใช้หน่วยความจำทั้งหมดในระบบ จากมุมมองนี้การรั่วไหลของหน่วยความจำครั้งเดียวจะไม่เป็นอันตรายเพราะพวกเขาไม่สะสมในขณะที่การรั่วไหลของหน่วยความจำโดยนัยเป็นอันตรายมากเพราะพวกเขาตรวจจับได้ยากกว่าการรั่วไหลของหน่วยความจำบ่อยและเป็นครั้งคราว
5. ความแตกต่างระหว่างสตริงสตริงบัฟเฟอร์และสตริง
①แปรผันและไม่เปลี่ยนรูป
สตริงคลาสใช้อาร์เรย์อักขระเพื่อบันทึกสตริงดังต่อไปนี้: เนื่องจากมีตัวดัดแปลง "สุดท้าย" คุณสามารถรู้ได้ว่าวัตถุสตริงไม่เปลี่ยนรูป
ค่าถ่านสุดท้ายส่วนตัว [];
ทั้ง StringBuilder และ StringBuffer ได้รับการสืบทอดมาจากคลาส AbstractStringBuilder ใน AbstractStringBuilder จะใช้อาร์เรย์อักขระเพื่อบันทึกสตริง ดังต่อไปนี้จะเห็นได้ว่าวัตถุทั้งสองนั้นไม่แน่นอน
ถ่าน [] ค่า;
②มันเป็นแบบมัลติเธรดและปลอดภัยหรือไม่
วัตถุในสตริงนั้นไม่เปลี่ยนรูปดังนั้นจึงสามารถเข้าใจได้ว่าเป็นค่าคงที่ซึ่งเห็นได้ชัดว่ามีความปลอดภัย
AbstractStringBuilder เป็นคลาสแม่สาธารณะของ StringBuilder และ StringBuffer ซึ่งกำหนดการดำเนินการพื้นฐานบางอย่างของสตริงเช่น ExpandCapacity, ผนวก, แทรก, ดัชนีและวิธีการสาธารณะอื่น ๆ
StringBuffer มีการล็อคการซิงโครไนซ์บนวิธีการหรือล็อคการซิงโครไนซ์บนวิธีที่เรียกว่าดังนั้นจึงเป็นเธรดที่ปลอดภัย ดูซอร์สโค้ดต่อไปนี้:
Synchronized StringBuffer Reverse () {super.Reverse (); คืนสิ่งนี้; } public int indexof (string str) {return indexof (str, 0); // มีดัชนี int ที่ซิงโครไนซ์สาธารณะ (String str, int fromindex) วิธี} StringBuilder ไม่ได้เพิ่มการเชื่อมโยงการซิงโครไนซ์ลงในวิธีการดังนั้นจึงไม่ปลอดภัย
③stringBuilderและ Stringbuffer เหมือนกัน
StringBuilder และ StringBuffer มีคลาสแม่แบบสาธารณะ AbstractStringBuilder (คลาสนามธรรม)
หนึ่งในความแตกต่างระหว่างคลาสนามธรรมและอินเทอร์เฟซคือวิธีการสาธารณะบางอย่างของคลาสย่อยสามารถกำหนดได้ในคลาสนามธรรม คลาสย่อยจำเป็นต้องเพิ่มฟังก์ชั่นใหม่และไม่จำเป็นต้องทำซ้ำวิธีที่มีอยู่ ในขณะที่อินเตอร์เฟสกำหนดวิธีและค่าคงที่เท่านั้น
วิธีการของ StringBuilder และ StringBuffer จะเรียกวิธีการสาธารณะใน AbstractStringBuilder เช่น Super.Append (... ) เป็นเพียงแค่สตริงบัฟเฟอร์จะเพิ่มคำหลักที่ซิงโครไนซ์ลงในวิธีการและทำการซิงโครไนซ์
ในที่สุดหากโปรแกรมไม่ได้มัลติเธรดการใช้ StringBuilder จะมีประสิทธิภาพมากกว่า StringBuffer
6. ความแตกต่างระหว่างอาร์เรย์และรายการที่เชื่อมโยง
ทั้งสองเป็นของโครงสร้างข้อมูล
จากโครงสร้างเชิงตรรกะ:
①อาร์เรย์จะต้องกำหนดความยาวคงที่ (จำนวนองค์ประกอบ) ล่วงหน้าและไม่สามารถปรับให้เข้ากับการเพิ่มและลดข้อมูลแบบไดนามิก เมื่อข้อมูลเพิ่มขึ้นจำนวนองค์ประกอบอาจเกินกว่าที่กำหนดไว้เดิม เมื่อข้อมูลลดลงจะเกิดการเสียหน่วยความจำ อาร์เรย์สามารถเข้าถึงได้โดยตรงตามตัวห้อย
②รายการที่เชื่อมโยงถูกจัดเก็บและจัดสรรแบบไดนามิกซึ่งสามารถปรับให้เข้ากับการเพิ่มและลดข้อมูลแบบไดนามิกและสามารถแทรกและลบรายการข้อมูลได้อย่างง่ายดาย (เมื่อแทรกและลบรายการข้อมูลในอาร์เรย์คุณต้องย้ายรายการข้อมูลอื่น ๆ ซึ่งยุ่งยากมาก) รายการที่เชื่อมโยงจะต้องค้นหาองค์ประกอบถัดไปตามตัวชี้ถัดไป
จากที่เก็บหน่วยความจำ:
①อาร์เรย์ (คงที่) จัดสรรพื้นที่จากสแต็กซึ่งสะดวกและรวดเร็วสำหรับโปรแกรมเมอร์ แต่มีอิสระน้อย
②รายการที่เชื่อมโยงจัดสรรพื้นที่จากกองซึ่งมีอิสระมากมาย แต่มีปัญหามากขึ้นในการสมัครสำหรับการจัดการ
จากการเปรียบเทียบข้างต้นเราจะเห็นว่าหากคุณต้องการเข้าถึงข้อมูลอย่างรวดเร็วและไม่ค่อยแทรกและลบองค์ประกอบคุณควรใช้อาร์เรย์ ในทางตรงกันข้ามหากคุณต้องการแทรกและลบองค์ประกอบบ่อยครั้งคุณต้องใช้โครงสร้างข้อมูลรายการที่เชื่อมโยง
7. ความแตกต่างระหว่าง ArrayList และ LinkedList
①ArrayListใช้โครงสร้างข้อมูลตามอาร์เรย์แบบไดนามิกและ LinkedList ขึ้นอยู่กับโครงสร้างข้อมูลตามรายการที่เชื่อมโยง
②สำหรับการเข้าถึงแบบสุ่มเพื่อรับและตั้งค่า ArrayList รู้สึกดีกว่า LinkedList เพราะ LinkedList ต้องการย้ายตัวชี้
③สำหรับการเพิ่มการดำเนินการและการลบเพิ่มและลบ LinedList มีข้อได้เปรียบค่อนข้างมากเนื่องจาก ArrayList จำเป็นต้องย้ายข้อมูล
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น