-
แสดงรายการวิธีการเรียน
Object
equals()
hashCode()
toString()
getClass()
notify()
notifyAll()
wait()
wait(long timeOut)
wait(long timeOut, int nanos)
-
equals
เหตุใดจึงมี & วิธีการhashCode
?ใช้เพื่อเปรียบเทียบวัตถุ
วัตถุประสงค์ของวิธีการนี้
equals
คือเพื่อตรวจสอบว่าวัตถุภายในเหมือนกันหรือไม่โดยการเปรียบเทียบเนื้อหาภายในของวัตถุ สิ่งนี้equals
ทำงานช้า ก่อนอื่นจะมีการเปรียบเทียบรหัสแฮชของออบเจ็กต์ และหากรหัสแฮชเท่ากัน จะมีการตรวจสอบกับequals
-
จะเกิดอะไรขึ้นถ้าคุณแทนที่เท่ากับแต่ไม่แทนที่
hashCode
?เริ่มแรก
hashCode
จะเป็นตัวเลขสุ่มequals
คอลเลกชันใน Java จะค้นหา/เปรียบเทียบโดยใช้วิธีการเสมอก่อนที่จะเปรียบเทียบวัตถุโดยใช้hashCode()
. และหากวัตถุที่เหมือนกันมีความแตกต่างกันhashCode
วัตถุนั้นก็จะถือว่าแตกต่างกัน - จะไม่สามารถเปรียบเทียบโดยใช้วัตถุเหล่านั้นequals
ได้ -
ทำไมต้องมีวิธีการ
wait
,notify
,notifyAll
?บางครั้งโปรแกรมอาจมีสถานการณ์ที่เธรดเข้าสู่บล็อกของโค้ด
synchronized
ปิดกั้นมอนิเตอร์ และไม่สามารถทำงานได้ต่อไป เนื่องจาก ข้อมูลบางส่วนยังขาดหายไป เช่น ไฟล์ที่ควรประมวลผลยังไม่ได้โหลดหรืออะไรทำนองนั้น มีการคิดค้นวิธีการเพื่อแก้ไขปัญหาwait()
นี้ การเรียกวิธีนี้จะทำให้เธรดปล่อยจอภาพและ "หยุดชั่วคราว"หากต้องการยกเลิกการหยุดชั่วคราว จะใช้วิธี
notify
การnotifyAll
ต่างๆ วิธีการnotify
"ยกเลิกการตรึง" เธรดสุ่มหนึ่งเธรด วิธีการnotifyAll
คือเธรด "แช่แข็ง" ทั้งหมดของจอภาพที่กำหนด -
วิธีการโคลนวัตถุอย่างถูกต้อง?
การโคลนสองประเภท
หากต้องการโคลนวัตถุเริ่มต้น:
- เพิ่มอินเทอร์เฟซ
Cloneable
ให้กับชั้นเรียนของคุณ - แทนที่วิธีการ
clone
และเรียกการใช้งานฐานในนั้น:
class Point implements Cloneable { int x; int y; public Object clone() { return super.clone(); } }
หรือคุณสามารถเขียนการนำวิธีการไปใช้
clone
ด้วยตนเอง:class Point { int x; int y; public Object clone() { Point point = new Point(); point.x = this.x; point.y = this.y; return point; } }
- เพิ่มอินเทอร์เฟซ
-
เหตุใดจึงต้องใช้วิธีการ
finalize()
และทำงานอย่างไร?หากคุณจำได้ นี่
finalize()
เป็นวิธีการพิเศษที่ถูกเรียกใช้บนวัตถุก่อนที่ตัวรวบรวมขยะจะทำลายมันวัตถุประสงค์หลักของวิธีนี้คือเพื่อเผยแพร่ทรัพยากรภายนอกที่ไม่ใช่ Java ที่ใช้แล้ว เช่น ปิดไฟล์ สตรีม I/O ฯลฯ
finalize()
ทำงานไม่เสถียรวิธีนี้ไม่เป็นไปตามความคาดหวังที่ตั้งไว้ เครื่อง Java สามารถชะลอการทำลายอ็อบเจ็กต์ เช่นเดียวกับการเรียกเมธอด ได้
finalize
นานเท่าที่ต้องการ นอกจากนี้ยังไม่รับประกันว่าจะมีการเรียกใช้วิธีนี้เลย ในหลาย ๆ สถานการณ์ มันไม่ได้ถูกเรียกว่าเพื่อ "การเพิ่มประสิทธิภาพ" -
อะไรคือความแตกต่าง
final
,finally
,finalize
?final
- ตัวดัดแปลง- ไม่สามารถเปลี่ยนแปลงฟิลด์ได้ วิธีการจะถูกแทนที่
- คลาสไม่สามารถสืบทอดได้
- ตัวแก้ไขนี้ใช้กับคลาส วิธีการ และตัวแปรเท่านั้น (รวมถึงตัวแปรท้องถิ่นด้วย)
- อาร์กิวเมนต์ของเมธอดที่ทำเครื่องหมายว่าเป็น
final
แบบอ่านอย่างเดียว การพยายามเปลี่ยนแปลงจะส่งผลให้เกิดข้อผิดพลาดในการคอมไพล์ - Переменные
final
не инициализируются по умолчанию, им необходимо явно присвоить meaning при объявлении or в конструкторе, иначе – ошибка компиляции - Если final переменная содержит ссылку на an object, an object может быть изменен, но переменная всегда будет ссылаться на тот же самый an object
- Также это справедливо и для массивов, потому что массивы являются an objectми, – массив может быть изменен, а переменная всегда будет ссылаться на тот же самый массив
- Если класс объявлен
final
иabstract
(взаимоисключающие понятия), произойдет ошибка компиляции - Так How
final
класс не может наследоваться, его методы никогда не могут быть переопределены
finally
— блок в связкеtry-catch-finally
, code в котором выполнится независимо от того вылетело ли исключение в блокеtry
or нет. Используется для освобождения ресурсов.finalize
— метод в классеObject
см 6. -
What такое
try-with-resources
?Это специальная конструкция
try
, называемаяtry-with-resources
, в которой Обрати внимание – послеtry
следуют круглые скобки, где объявляются переменные и создаются an objectы. Эти an objectы можно использовать внутри блокаtry
, обозначенного скобками{}
. Когда выполнение команд блокаtry
закончится, независимо от того – нормально оно закончилось or было исключение, для an object, созданного внутри круглых скобок()
, будет вызван методclose()
; -
Чем отличаются методы
wait(1000)
иsleep(1000)
?sleep()
приостанавливает поток на указанное. состояние меняется на TIMED_WAITING, по истечению — RUNNABLEwait()
меняет состояние потока на WAITINGможет быть вызвано только у an object владеющего блокировкой, в противном случае выкинется исключение IllegalMonitorStateException. при срабатывании метода блокировка отпускается, что позволяет продолжить работу другим потокам ожидающим захватить ту же самую блокировку . в случае
wait(int)
с аргументом состояние будет TIMED_WAITING -
В чем отличие
i++
и++i
?++i
,i
сначала увеличивается на 1, затем участвует в выражении.i++
,i
сначала участвует в выражении, затем увеличивается на 1.
GO TO FULL VERSION