Шпаргалка C

 

Шпаргалка MySQL

 

Пропал звук Linux mint 17

На ровном месте после 2х дней использования пропал звук на чистой системе Linux mint 17. После тряски бубна спасли только следующие команды:

 

Для клонирования объекта в Java можно пользоваться тремя способами: ​

  1. Переопределение метода clone() и реализация интерфейса Cloneable().
  2. Использование конструктора копирования.
  3. Использовать для клонирования механизм сериализации

А теперь по порядку. Первый способ подразумевает, что Вы будете использовать механизм так называемого «поверхностного клонирования»+сами позаботитесь о клонировании полей-объектов. Метод clone() в родительском классе Object является protected, поэтому требуется переопределение его с объявлением как public. Он возвращает экземпляр объекта с копированными полями-примитивами и ссылками. И получается что у оригинала и его клона поля-ссылки указывают на одни и те же объекты. Пример далее показывает как меняется одновременно поле у оригинального объекта и клона.

Из примера выше видно, что у клона и оригинала состояние одного из полей изменяется одновременно. Следующий способ заключается в использовании конструктора копирования:

В классе описывается конструктор, который принимает объект этого же класса и иницилизизирует значениями его полей поля нового объекта. О реализации инициализации полей полностью должен позаботиться разработчик класса.

Но оба вышеуказанных способа полны потенциальных ошибок и по сути создают копию объекта. Наиболее удобным и гибким способом клонирования является механизм сериализации. Он заключается в сохранении объекта в поток байтов с последующей эксгумацией его от туда. Для примера пригласим кота Ваську, его ждёт пара опытов:

Ни один кот не пострадал в результате тестов, мы видим что Васька был сохранён в поток, из которого затем восстановили независимый клон. Если нет особой необходимости обработки полей во время клонирования объектов, то сериализация является наиболее предпочтительным вариантом для этих целей. Так же можно указать transient поля,которые не обязательно восстанавливать, но об этом в следующих вопросах…

Для чего нужны методы wait(), notify(), notifyAll()?​

Все методы используются в механизме многопоточности Java. Их действие во многом объясняется их дословным переводом.
Метод wait() вызывается нитью в синхронизированном блоке у объекта-монитора. В результате вызова нить,которая его осуществила становиться в режим ожидания и отпускает мютекс объекта-монитора. Снять с паузы её могут другие нити,зашедшие в синхронизированный блок и вызвавшие методы notify() или notifyAll() на объекте-мониторе. Есть ещё метод wait(long timeout) с таймаутом, который пробуждает нить по истечении времени,переданного в него,если до этого не были вызваны notify() или notifyAll().
Метод notify() вызывается у монитора и снимает с wait’а одну случайную нить. notifyAll() снимает с паузы все заснувшие нити.

Что будет, если переопределить метод equals() не переопределяя hashCode()?​

В таком случае объекты будут неправильно храниться в контейнерах, использующих хэшкод объекта (HashMap, HashSet, … ).