
- ฉันจะข้ามคำถามที่ทับซ้อนกับบทความชุดนี้ เพื่อไม่ให้ข้อมูลซ้ำโดยไม่จำเป็น ฉันขอแนะนำให้อ่านบทความเหล่านี้เนื่องจากครอบคลุมคำถามสัมภาษณ์ Java Core ที่พบบ่อยที่สุด (ยอดนิยม)
- ฉันสามารถอธิบายคำตอบได้โดยละเอียดมากขึ้น แต่ฉันจะไม่อธิบาย เพราะแต่ละคำตอบอาจลากยาวไปทั้งบทความ และจะไม่มีใครขอรายละเอียดระดับนั้นจากคุณในการสัมภาษณ์งานใดๆ
11. ตั้งชื่อเมธอดทั้งหมดของคลาส Object
คลาสObjectมี 11 วิธี:-
Class<?> getClass() — รับคลาสของอ็อบเจ็กต์ปัจจุบัน
-
int hashCode() — รับรหัสแฮชของวัตถุปัจจุบัน
-
บูลีนเท่ากับ (Object obj) - เปรียบเทียบวัตถุปัจจุบันกับวัตถุอื่น
-
Object clone() — สร้างและส่งคืนสำเนาของอ็อบเจ็กต์ปัจจุบัน
-
String toString() - รับการแสดงสตริงของวัตถุ
-
void notify() - ปลุกหนึ่งเธรดที่รออยู่บนมอนิเตอร์ของวัตถุนี้ (ตัวเลือกของเธรดจะเป็นแบบสุ่ม)
-
เป็นโมฆะ notifyAll() - ปลุกเธรดทั้งหมดที่รออยู่บนจอภาพของวัตถุนี้
-
ถือเป็นโมฆะรอ () - ทำให้เธรดปัจจุบันรอบนมอนิเตอร์ปัจจุบัน (หยุดเธรดปัจจุบัน) จนกว่าการแจ้งหรือการแจ้งเตือนทั้งหมดจะปลุกเธรด (ใช้งานได้เฉพาะในบล็อกที่ซิงโครไนซ์เท่านั้น)
-
รอเป็นโมฆะ (หมดเวลานาน) - ทำให้เธรดปัจจุบันรอบนมอนิเตอร์ปัจจุบัน (บนบล็อกซิงโครไนซ์ปัจจุบัน) แต่ด้วยการหมดเวลาสำหรับการออกจากสถานะรอ (หรืออีกครั้งจนกว่าการแจ้งเตือนหรือการแจ้งเตือนทั้งหมดจะปลุกเธรด)
-
ถือเป็นโมฆะรอ (การหมดเวลานาน int nanos) - วิธีการนี้เหมือนกับวิธีก่อนหน้า แต่มีการหมดเวลาที่แม่นยำยิ่งขึ้น
-
ถือเป็นโมฆะสรุป () - วิธีการนี้ถูกเรียก (ในที่สุด) ก่อนที่ตัวรวบรวมขยะจะถูกลบออก มันถูกใช้เพื่อล้างทรัพยากรที่ได้มา
12. อะไรคือความแตกต่างระหว่างการลองกับทรัพยากรและการลองจับในที่สุดเมื่อทำงานกับทรัพยากร?
โดยทั่วไป เมื่อใช้try-catch-finallyบล็อกสุดท้ายจะถูกใช้เพื่อปิดทรัพยากร Java 7 แนะนำคำสั่งtry-with-resources ใหม่ มันคล้ายคลึงกับการลองจับขั้นสุดท้ายเพื่อเพิ่มทรัพยากร แต่มีขนาดกะทัดรัดและอ่านง่ายกว่า ลองนึกถึงสิ่งที่try-catch-finallyมีลักษณะดังนี้:String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
ตอนนี้เรามาเขียนโค้ดนี้ใหม่ แต่ใช้try-with-resources :
String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
}
ตอนนี้มันง่ายกว่านี้คุณไม่คิดเหรอ? นอกจากโค้ดที่ง่ายกว่าแล้ว ยังมีประเด็นอื่นๆ อีกสองสามข้อที่ควรทราบ:
-
ในtry-with-resourcesทรัพยากรที่ประกาศในวงเล็บ (ทรัพยากรที่จะถูกปิด) จะต้องใช้ อินเทอร์เฟซ AutoCloseableและวิธีการ close() เพียงอย่างเดียว
วิธีการปิดจะดำเนินการโดยปริยายในที่สุด blockมิฉะนั้นโปรแกรมจะทราบได้อย่างไรว่าจะปิดทรัพยากรอย่างไร
แต่คุณอาจจะไม่ค่อยเขียนการใช้งานทรัพยากรและวิธีการปิดของคุณเอง
-
บล็อกจะดำเนินการตามลำดับนี้:
- การลองบล็อก
- ในที่สุดนัยก็ปิดกั้น
- catch block ซึ่งจับข้อยกเว้นที่เกิดขึ้นในขั้นตอนก่อนหน้านี้
- ในที่สุดความชัดเจนก็ปิดกั้น
ตามกฎแล้ว ข้อยกเว้นที่อยู่ต่ำกว่าในรายการจะขัดจังหวะข้อยกเว้นที่อยู่สูงกว่า
13. การดำเนินการระดับบิตคืออะไร?
การดำเนินการระดับบิตคือการดำเนินการตามลำดับของบิต รวมถึงการดำเนินการเชิงตรรกะและการเปลี่ยนแปลงระดับบิต ตัวดำเนินการเชิงตรรกะ:-
ระดับบิตและ - เปรียบเทียบค่าบิต บิตใดๆ ที่ตั้งค่าเป็น 0 (เท็จ) จะตั้งค่าบิตที่สอดคล้องกันในผลลัพธ์เป็น 0 กล่าวคือ หากบิตเป็น 1 (จริง) ในทั้งสองค่าที่เปรียบเทียบ บิตผลลัพธ์จะเป็น 1 ด้วย
แสดงว่าANDหรือ&
ตัวอย่าง: 10111101 & 01100111 = 00100101
-
bitwise OR — การดำเนินการนี้ตรงกันข้ามกับการดำเนินการก่อนหน้า บิตใดๆ ที่ตั้งค่าเป็น 1 จะตั้งค่าบิตที่สอดคล้องกันในผลลัพธ์เป็น 1 ดังนั้น หากบิตเป็น 0 ในค่าที่เปรียบเทียบทั้งสองค่า บิตผลลัพธ์จะเป็น 0 เช่นกัน
แสดงเป็นORหรือ|
ตัวอย่าง: 10100101 | 01100011 = 11100111
-
ระดับบิตNOT — โอเปอเรเตอร์นี้ใช้กับค่าเดียว มันพลิก (กลับ) บิต นั่นคือบิตที่เป็น 1 จะกลายเป็น 0 และพวกที่เป็น 0 จะกลายเป็น 1
แสดงเป็นNOTหรือ~
ตัวอย่าง: ~10100101 = 01011010
-
เอกสิทธิ์ระดับบิตหรือ - เปรียบเทียบค่าบิต ถ้าทั้งสองบิตเป็น 1 บิตผลลัพธ์จะเป็น 0 หากบิตทั้งสองเป็น 0 บิตผลลัพธ์จะเป็น 0 กล่าวอีกนัยหนึ่ง เพื่อให้บิตผลลัพธ์เป็น 1 เพียงบิตเดียวต้องเป็น 1 และ อีกบิตต้องเป็น 0
แสดงว่าXORหรือ^
ตัวอย่าง: 10100101 ^ 01100011 = 11000110
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000


14. มีออบเจ็กต์มาตรฐานที่ไม่เปลี่ยนรูปแบบใดบ้างใน Java?
วัตถุจะไม่เปลี่ยนรูปหากไม่อนุญาตให้เปลี่ยนค่าดั้งเดิม อาจมีเมธอดที่ส่งคืนอ็อบเจ็กต์ใหม่ที่เป็นประเภทเดียวกันด้วยค่าที่แตกต่างกัน ออบเจ็กต์มาตรฐานที่ไม่เปลี่ยนรูปบางรายการได้แก่:- ไม่ต้องสงสัยเลยว่าประเภทที่ไม่เปลี่ยนรูปที่มีชื่อเสียงที่สุดของ Java คือ String;
- อินสแตนซ์ของคลาส wrapper ที่รวมประเภทมาตรฐาน: บูลีน, อักขระ, ไบต์, สั้น, จำนวนเต็ม, ยาว, สองเท่า, ลอย;
- ออบเจ็กต์ BigInteger และ BigDecimal ซึ่งโดยทั่วไปใช้สำหรับตัวเลข BIG โดยเฉพาะ
- ออบเจ็กต์ StackTraceElement ที่ประกอบเป็นการติดตามสแต็ก (เช่น การติดตามสแต็กของข้อยกเว้น)
- อ็อบเจ็กต์ของคลาส File — มันสามารถแก้ไขไฟล์ได้ แต่ในขณะเดียวกันอ็อบเจ็กต์เองก็ยังคงไม่เปลี่ยนแปลง
- UUID ซึ่งมักใช้เพื่อระบุองค์ประกอบโดยไม่ซ้ำกัน
- อ็อบเจ็กต์ทั้งหมดของคลาสในแพ็คเกจ java.time
- ออบเจ็กต์สถานที่ ซึ่งใช้เพื่อระบุภูมิภาคทางภูมิศาสตร์ การเมือง หรือวัฒนธรรม
15. ข้อดีของวัตถุที่ไม่เปลี่ยนรูปเหนือวัตถุธรรมดาคืออะไร?
-
อ็อบเจ็กต์ที่ไม่เปลี่ยนรูปมีความปลอดภัยในการใช้งานในสภาพแวดล้อมแบบมัลติเธรด พวกเขาสร้างมันขึ้นมาเพื่อให้คุณไม่ต้องกังวลกับข้อมูลสูญหายเนื่องจากสภาพการแข่งขัน สิ่งนี้แตกต่างจากเมื่อคุณทำงานกับวัตถุธรรมดา ในกรณีนี้คุณต้องคิดและสร้างกลไกที่ดีเมื่อใช้วัตถุในสภาพแวดล้อมแบบขนาน
-
วัตถุที่ไม่เปลี่ยนรูปนั้นดีเหมือนกุญแจในแผนที่ หากคุณใช้ออบเจ็กต์ที่ไม่แน่นอนเป็นคีย์ HashMap แล้วสถานะของออบเจ็กต์เปลี่ยนไป โครงสร้างข้อมูลอาจสับสนได้: ออบเจ็กต์จะยังคงอยู่ แต่ถ้าคุณใช้ containsKey() คุณอาจไม่พบมัน
-
วัตถุที่ไม่เปลี่ยนรูปเหมาะอย่างยิ่งสำหรับการจัดเก็บข้อมูลที่ไม่เปลี่ยนรูป (คงที่) ซึ่งไม่ควรเปลี่ยนแปลงในขณะที่โปรแกรมกำลังทำงาน
-
ข้อดีอีกประการหนึ่งคือความล้มเหลวของอะตอมมิกซิตี หากวัตถุที่ไม่เปลี่ยนรูปส่งข้อยกเว้น มันจะไม่ถูกปล่อยให้อยู่ในสถานะที่ไม่ต้องการ (ใช้งานไม่ได้)
-
ชั้นเรียนเหล่านี้ง่ายต่อการทดสอบ
-
คุณไม่จำเป็นต้องมีกลไกเพิ่มเติมใดๆ เช่น ตัวสร้างการคัดลอกหรือการใช้งานการโคลนวัตถุ
คำถามเกี่ยวกับ OOP
16. ข้อดีของ OOP โดยทั่วไปและเมื่อเปรียบเทียบกับการเขียนโปรแกรมตามขั้นตอนคืออะไร?
เอาล่ะ ข้อดีของ OOP:-
แอปพลิเคชันที่ซับซ้อนจะเขียนโดยใช้ OOP ได้ง่ายกว่าการเขียนโปรแกรมตามขั้นตอน เนื่องจากทุกอย่างถูกแบ่งออกเป็นโมดูลขนาดเล็ก — วัตถุที่มีปฏิสัมพันธ์ระหว่างกัน — และด้วยเหตุนี้ การเขียนโปรแกรมจึงลดลงเหลือเพียงความสัมพันธ์ระหว่างวัตถุ
-
แอปพลิเคชันที่เขียนด้วย OOP จะปรับเปลี่ยนได้ง่ายกว่ามาก (เมื่อปฏิบัติตามหลักการออกแบบอย่างเหมาะสม)
-
เนื่องจากทั้งข้อมูลและการดำเนินการข้อมูลเป็นเอนทิตีเดียว จึงไม่เลอะไปทั่วแอปพลิเคชัน (ซึ่งมักเป็นกรณีในการเขียนโปรแกรมตามขั้นตอน)
-
หลักการของการห่อหุ้มจะปกป้องข้อมูลที่สำคัญที่สุดจากผู้ใช้
-
รหัสเดียวกันสามารถนำมาใช้ซ้ำกับข้อมูลที่แตกต่างกันได้ เนื่องจากคลาสช่วยให้คุณสร้างออบเจ็กต์จำนวนมาก โดยแต่ละออบเจ็กต์มีค่าของตัวเอง
-
การสืบทอดและความหลากหลายยังช่วยให้คุณใช้ซ้ำและขยายโค้ดที่มีอยู่ได้ (แทนที่จะทำซ้ำฟังก์ชันการทำงานที่คล้ายกัน)
-
การขยายแอปพลิเคชันนั้นง่ายกว่าการใช้แนวทางตามขั้นตอน
-
แนวทาง OOP ช่วยให้สามารถสรุปรายละเอียดการใช้งานได้
17. บอกเราว่า OOP มีข้อเสียอะไรบ้าง
น่าเสียดายที่ยังมีอยู่ด้วย:-
OOP ต้องใช้ความรู้ทางทฤษฎีมากมายซึ่งต้องเชี่ยวชาญก่อนจึงจะสามารถเขียนอะไรก็ได้
-
แนวคิด OOP ไม่ใช่เรื่องง่ายที่จะเข้าใจและนำไปใช้ในทางปฏิบัติ (คุณต้องเป็นนักปรัชญาตัวน้อยในหัวใจ)
-
OOP ลดประสิทธิภาพของโปรแกรมเล็กน้อยเนื่องจากความซับซ้อนของระบบที่เพิ่มขึ้น
-
วิธี OOP ต้องใช้หน่วยความจำมากขึ้นเนื่องจากทุกอย่างประกอบด้วยคลาส อินเทอร์เฟซ วิธีการ ซึ่งใช้หน่วยความจำมากกว่าตัวแปรทั่วไปมาก
-
เวลาที่จำเป็นสำหรับการวิเคราะห์เบื้องต้นนั้นมากกว่าเวลาสำหรับแนวทางขั้นตอน
18. ความแตกต่างแบบคงที่กับความหลากหลายแบบไดนามิกคืออะไร?
Polymorphism ช่วยให้วัตถุที่มีคลาสหรืออินเทอร์เฟซเดียวกันทำงานแตกต่างกัน ความหลากหลายมีสองประเภท ซึ่งเรียกอีกอย่างว่าการเชื่อมโยงตั้งแต่เนิ่นๆ และภายหลัง ความหลากหลายแบบคงที่หรือการจับตั้งแต่เนิ่นๆ:- เกิดขึ้นในเวลาคอมไพล์ (ช่วงต้นของวงจรชีวิตของโปรแกรม);
- ตัดสินใจว่าจะดำเนินการอย่างไรในเวลารวบรวม
- วิธีการโอเวอร์โหลดเป็นตัวอย่างของความหลากหลายแบบคงที่
- การผูกล่วงหน้ารวมถึงวิธีการส่วนตัว คงที่ และสุดท้าย
- มรดกไม่เกี่ยวข้องกับการผูกมัดก่อนกำหนด
- ความหลากหลายแบบคงที่ไม่เกี่ยวข้องกับวัตถุเฉพาะ แต่เป็นข้อมูลเกี่ยวกับประเภทคลาสที่ปรากฏทางด้านซ้ายของชื่อตัวแปร
- เกิดขึ้นเมื่อรันไทม์ (ในขณะที่โปรแกรมกำลังทำงาน)
- ความหลากหลายแบบไดนามิกจะตัดสินว่าวิธีการใดที่จะมีการใช้งานเฉพาะที่รันไทม์
- การเอาชนะวิธีการเป็นตัวอย่างหนึ่งของความหลากหลายแบบไดนามิก
- การผูกล่าช้าหมายถึงการกำหนดวัตถุเฉพาะ การอ้างอิงประเภทหรือซูเปอร์คลาส
- การสืบทอดมีความเกี่ยวข้องกับความหลากหลายแบบไดนามิก
GO TO FULL VERSION