предисловие
Я поехал домой 1 мая и прервал очередной отпуск~~~
Только лысина может стать сильнее
Оглядываясь назад на фронт:
- ThreadLocal так просто
- Вы можете войти в дверь за три минуты с многопоточностью!
- Базовые знания многопоточности! После прочтения изучение многопоточности может сделать больше с меньшими затратами
- Механизм блокировки Java для понимания
- AQS просто пройти
- Заблокируйте подкласс, чтобы понять
Мне понадобилось некоторое время, чтобы изучить основы многопоточности. Это сложно, сложно, сложно... Я планируюТакжеНаписать пул потоковвременныйОстановил многопоточную серию...
Когда я сегодня в полдень просматривал краткую книгу, я обнаружил, что некоторые крупные фабрики также спрашивают, какие методы есть в объекте Object (это можно рассматривать как точку знаний).Я не рассматривал объект серьезно, поэтому эта статья в основном смотрит на объект Object.На что обратить внимание~
Тогда давайте начнем.Если в статье есть ошибки, пожалуйста, потерпите меня и поправьте меня в комментариях~
1. Введение в объект
Отказ от ответственности: в этой статье используется JDK1.8.
Мы знаем Java, Java — это объектно-ориентированный язык. Все, что появляется в Java, может считаться объектом (КромеВосемь основных типов данных. Конечно, восемь основных типов данных также могуткоробкастановится объектом):
- И Object является высшим уровнем этих объектов, все объекты JavaСкрытыйнапрямую наследует объект Object (без явного написания
extends
наследовать) - Все объекты JavaИмеет метод по умолчанию Object.
Итак, давайте посмотрим, какие методы есть у Object:
На самом деле его можно свести к нескольким:
-
registerNatives()
[Низкоуровневая реализация, без исследований] hashCode()
equals(Object obj)
clone()
toString()
notify()
notifyAll()
-
wait(long timeout)
[Также есть два перегруженных] finalize()
Объект имеет в общей сложности11методы, один из которых является базовой реализациейregisterNatives()
, два из которыхwait()
иwait(long timeout, int nanos)
перегруженный метод.
- Итак, что нам действительно нужно посмотреть, так это8метод
иатрибут:
public final native Class<?> getClass();
Во-вторых, методы equals и hashCode.
Можно сказать, что методы equals и hashCode являются ключевыми вопросами интервью, а в случае String можно сказать, что они входят в вопросы интервью.Они существуют везде.
Во-первых, давайте посмотрим на equals и hashCode в Object.РоднойОсознание этого:
хэш-код:
public native int hashCode();
равно:
public boolean equals(Object obj) {
return (this == obj);
}
Все выглядит очень просто:
-
hashCode()
Он реализован в нижней части нативного метода. -
equals()
просто прямо==
Определите, равны ли они.
Чтобы было понятнее, что именно они делают, давайте прочитаем его комментарии:
По аннотации можноОбобщите следующие пункты:
- переписать
equals()
метод, он должен быть переопределенhashCode()
Методы -
equals()
Метод по умолчанию использует адрес объекта сравнения, используя==
Оператор эквивалентности -
hashCode()
Метод имеет функцию повышения производительности для объектов, базовым слоем которых является хеш-таблица. - тот же объект (если объект не был изменен): затем вызовите повторно
hashCode()
тогда возвращаемый int тот же самый! -
hashCode()
По умолчанию метод конвертируется из адреса объекта -
equals()
Метод также имеет 5 принципов по умолчанию:- Рефлексивность ---> вызов
equals()
Возвращает true, независимо от того, кто вызывает два объектаequals()
Все хорошо, все возвращает true - Непротиворечивость ---> Пока объект не был изменен, множественные вызовы все равно будут возвращать соответствующий результат!
- Переходный --->
x.equals(y)
иy.equals(z)
возвращает true, то мы можем получить:x.equals(z)
вернуть истину - Симметрия --->
x.equals(y)
иy.equals(x)
Результаты должны быть равными. - Переданный параметр имеет значение null, возвращаемое значение равно false
- Рефлексивность ---> вызов
почему вы говоритеhashCode()
Легко понять, что улучшение производительности привнесено хеш-таблицей в качестве нижнего слоя. мы приходим сноваобзорПосмотрим на вставку HashMap:
Если значения хешей не равны, то можно напрямую судить о том, что ключ не равен!
2.1 equals и переопределение метода hashCode
equals()
Метод по умолчанию использует адрес объекта сравнения, используя==
Оператор эквивалентности. Но согласно нашему нормальному развитию,Сравнивать адреса объектов бессмысленно.
- В общем, если у нас есть два объекта Address, покаКод провинции, код города, код улицы совпадают, мы считаем два объекта равными!
2.2 методы equals и hashCode, реализованные в String
Возможно, мы слышали это, когда только учились: StringужеРеализованы методы equals и hashCode.
- Вот почему мы можемнепосредственныйИспользуйте String.equals() дляОпределить две строкиЭто равно!
Давайте посмотрим на его реализацию:
Три, метод toString
Далее рассмотрим метод toString, он тоже очень простой:
Метод toString в основном используется длялоготипэтого объекта:
Из приведенных выше результатов мы видим, что:В результате мы ничего не видим~
Итак, мы обычно переписываем toString(), затемРаспечатанные результаты очень удобны для отладки.!
@Override
public String toString() {
return "Address{" +
"provinceNo=" + provinceNo +
", cityNo=" + cityNo +
", streetNo=" + streetNo +
'}';
}
Результат ниже выглядит намного лучше:
Четыре, метод клонирования
Давайте также взглянем на его главный комментарий:
Глядя на комментарии выше, мы можемОбобщите следующие пункты:
- Метод клонирования используется для клонирования объектов.Как правило, объект, который вы хотите клонировать,независимыйиз (отдельно от исходного объекта)
- Глубокая копия означает, что переменные-члены объекта (если это ссылка на переменную) должны быть клонированы, а поверхностная копия означает, что переменные-члены не клонированы.
Давайте посмотрим на мелкую копию:Объект Employee копируется, но его переменная-член Hireday не клонируется, поэтому он по-прежнему указывает на тот же объект Date.!
4.1 использование клонов
Так как же нам клонировать объекты? Будь то поверхностная или глубокая копия, это два шага:
- клонированный объектРеализовать интерфейс Cloneable
- Переопределить метод клонирования, лучше всего изменить на общедоступный
мелкая копия: Копируется только объект Person, а дата не копируется!
public class Person implements Cloneable {
// 可变的成员变量
private Date date;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
глубокая копия: не только копирует объект Person, но также копирует переменную-член даты.
public class Person implements Cloneable {
// 可变的成员变量
public Date date;
@Override
public Object clone() throws CloneNotSupportedException {
// 拷贝Person对象
Person person = (Person) super.clone();
// 将可变的成员变量也拷贝
person.date = (Date) date.clone();
// 返回拷贝的对象
return person;
}
}
4.2 вопрос о клонировании защищен от дальнейшего изучения
не знаю есть ли у кого то же самоесомневаться:
- я просто хочумелкая копия, Не могли бы выВызовите объект .clone() напрямую для достижения?
Например, теперь у меня есть объект Address:
public class Address {
private int provinceNo;
private int cityNo;
private int streetNo;
public Address() {
}
public Address(int provinceNo, int cityNo, int streetNo) {
this.provinceNo = provinceNo;
this.cityNo = cityNo;
this.streetNo = streetNo;
}
}
код под вамиподумай как?
Address address = new Address(1, 2, 3);
address.clone();
мы все знаем:
- Классы и свойства, измененные protected, видны сами по себе, этому пакету и его подклассам.
мог подумать:clone()
Метод определен в классе Object (модифицированном с помощью protected), и наш пользовательский объект AddressСкрытыйНаследование Object (все объекты являются подклассами Object), затем подкласс вызывает Object для украшения с помощью protectedclone()
это совершенно нормально
- Однако реальность IDE подсказывает мне, что этоОшибка компиляции!
Причина ошибки пришла мне в голову сразу:Это отклонение в защищенном модификаторе?
Классы и свойства, измененные protected, видны сами по себе, этому пакету и его подклассам Само по себе это предложение не является неправильным. ноеще нужно добавить: для защищенных членов или методов требуются подкласс и суперкласс.находятся в одном пакете. с базовым классомПодклассы, которые не находятся в одном пакете, ТолькоДоступ к защищенным членам, унаследованным от базового класса, но не к защищенным членам самого экземпляра базового класса..
- Приведенный выше код неверен: адрес и объектне в той же упаковке, а Address напрямую обращается к методу clone объекта Object. Так не пойдет.
Позвольте мне сделать скриншот двух картинок и показать их вам (прочитав картинки, а затем прочитав описание выше, вы сможете понять):
Источник изображения и прочее:blog.CSDN.net/Ван Яньгуй и…
Пять, ждать и уведомлять методы
Методы ожидания и уведомления — это то, что предоставляет нам Java.связь между потокамиAPI.
Как обычно, давайте посмотрим, что говорят комментарии:
метод ожидания:
метод уведомления:
Метод уведомленияВсе():
Прочитав комментарии выше, мы можемОбобщите следующие пункты:
- Требуется для ожидания, уведомления или notifyAll()Вызывается объектом слушателя (объект блокировки)
- Проще говоря:Все они вызываются в синхронизированных блоках кода., иначе будет выброшено исключение!
-
notify()
Пробуждение ждет в очередиопределенныйпоток (не уверен, какой из них проснется),notifyAll()
Разбудить очередь ожиданиявсенить - Привести к
wait()
Есть 4 ситуации, в которых поток просыпается- поток прерван
-
wait()
Время вышло - одеяло
notify()
будить - одеяло
notifyAll()
будить
- перечислить
wait()
нить будетоткрыть замок
На самом деле, после подведения итогов вышеизложенного глубокого впечатления не останется.Можно попробовать ответить на несколько вопросов для углубления понимания.wait()
иnotify()
понимание.
5.1 Зачем ждать и уведомлять метод объекта?
С самого начала мы сказали:wait()
иnotify()
Именно Java предоставляет нам API для связи между потоками.Если это поток, то что определено в классе Object вместо класса Thread?
потому что нашблокировка - блокировка объекта[Если вы забыли своих одноклассников, вы можете просмотреть:Механизм блокировки Java для понимания], каждый объект может стать замком.Пусть текущий поток ждет блокировку объекта, разумеется, он должен работать через этот объект.
- Объект блокировкилюбой, поэтому эти методы должны быть определены в классе Object
5.2 Что происходит после вызова метода уведомления?
Как упоминалось выше, notify разбудит поток, ожидающий в очереди.
ноУведомлениеявляется:
- После вызова метода notify пробудившийся потокне будет немедленно получать объект блокировки. Вместо этого дождитесь синхронизированного блока уведомленияпосле казниполучит объект блокировки
5.3 В чем разница между сном и ожиданием?
Thread.sleep()
иObject.wait()
Оба могут приостановить текущий поток, освобождая ЦП.
- Основное отличие в том, что
Object.wait()
Освобождая ЦП,Освобождает контроль над блокировкой объекта. - и
Thread.sleep()
нет открытия замка
Использованная литература:
- blog.CSDN.net/specify/art…
- блог woo woo woo.cn на.com/dolphin0520…
- блог woo woo woo.cn на.com/ear123/afraid/78…
- woo woo Краткое описание.com/afraid/post 4454164 от…
Шесть, метод finalize ()
finalize()
метод будет вВызывается до того, как сборщик мусора очистит объект, но метод не знает, когда вызывать, снеопределенность
- Обычно мы его не переписываем~
Метод finalize() объектабудет вызван только один раз, и вызов finalize() не означает, что gc будет перерабатывать объект немедленно, поэтому возможно, что после вызова finalize() объект не нужно восстанавливать, а затем, когда его действительно нужно восстанавливать, потому что он был вызван один раз, поэтому finalize() не будет вызываться, вызывая проблемы.
Использованная литература:
Расширенная информация:
- Блог Woohoo.cn на.com/SMI that/afraid/718…
- www.importnew.com/23913.html
- zhuanlan.zhihu.com/p/29522201
- zhuanlan.zhihu.com/p/25698745
7. Резюме
В общем, Object я читал один раз, так что его методы сразу все не забываю~~~ Тоже столкнулся с проблемами в процессе обучения.Самое очевидное - снова углубить модификатор protected.Понятно.
Использованная литература:
- «Основная технология Java, том 1»
Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом. Учащиеся, привыкшие читать технические статьи в WeChat и желающие получить больше ресурсов по Java, могутОбратите внимание на публичный аккаунт WeChat: Java3y.
Оглавление Навигация по статьям: