Вопрос: если equals() переопределен, есть ли какие-либо другие методы, которые следует переопределить?
Ответ: равные объекты должны возвращать одинаковые хэш-коды. При переопределении equals() нужно обязательно переопределять и метод hashCode().
Ответ: равные объекты должны возвращать одинаковые хэш-коды. При переопределении equals() нужно обязательно переопределять и метод hashCode().
Java All-in-One For Dummies (2017)
Если вы всегда хотели научиться программировать на Java, но не знали, с чего начать, эта книга вам подойдет. Она послужит не только учебником, но и сопровождающим в работе справочным материалом, где всегда можно найти ответ на любой вопрос о тонкостях языка.
Если вы всегда хотели научиться программировать на Java, но не знали, с чего начать, эта книга вам подойдет. Она послужит не только учебником, но и сопровождающим в работе справочным материалом, где всегда можно найти ответ на любой вопрос о тонкостях языка.
#вопросы_с_собеседований
Что такое «анонимные классы»? Где они применяются?
Что такое «анонимные классы»? Где они применяются?
Это вложенный локальный класс без имени, который разрешено декларировать в любом месте обрамляющего класса, разрешающем размещение выражений. Создание экземпляра анонимного класса происходит одновременно с его объявлением. В зависимости от местоположения анонимный класс ведет себя как статический либо как нестатический вложенный класс - в нестатическом контексте появляется окружающий его экземпляр.
Анонимные классы имеют несколько ограничений:
✔️Их использование разрешено только в одном месте программы - месте его создания;
✔️Применение возможно только в том случае, если после порождения экземпляра нет необходимости на него ссылаться;
✔️Реализует лишь методы своего интерфейса или суперкласса, т.е. не может объявлять каких-либо новых методов, так как для доступа к ним нет поименованного типа.
Анонимные классы обычно применяются для:
✔️Создания объекта функции (function object), например реализация интерфейса Comparator;
✔️Создания объекта процесса (process object), такого как экземпляры классов Thread, Runnable и подобных;
в статическом методе генерации;
✔️Инициализации открытого статического поля final, которое соответствует сложному перечислению типов, когда для каждого экземпляра в перечислении требуется отдельный подкласс.
Анонимные классы имеют несколько ограничений:
✔️Их использование разрешено только в одном месте программы - месте его создания;
✔️Применение возможно только в том случае, если после порождения экземпляра нет необходимости на него ссылаться;
✔️Реализует лишь методы своего интерфейса или суперкласса, т.е. не может объявлять каких-либо новых методов, так как для доступа к ним нет поименованного типа.
Анонимные классы обычно применяются для:
✔️Создания объекта функции (function object), например реализация интерфейса Comparator;
✔️Создания объекта процесса (process object), такого как экземпляры классов Thread, Runnable и подобных;
в статическом методе генерации;
✔️Инициализации открытого статического поля final, которое соответствует сложному перечислению типов, когда для каждого экземпляра в перечислении требуется отдельный подкласс.
Придумай концепцию любого IT-решения для сельского хозяйства и получи шанс выиграть 50 000 рублей. Тебе не обязательно быть программистом: предложить свою идею могут маркетологи, дизайнеры, продакт-менеджеры или команды студентов. Прием заявок — до 24 марта на сайте
https://prglb.ru/1dwt6
Генеральный спонсор — Россельхозбанк.
https://prglb.ru/1dwt6
Генеральный спонсор — Россельхозбанк.
Как написать код, который полюбят все
Набор практик хорошего кода, не зависящих от языка программирования. Примените их, и ваш код будет не только работать, но и читаться.
https://prglb.ru/2569h
Набор практик хорошего кода, не зависящих от языка программирования. Примените их, и ваш код будет не только работать, но и читаться.
https://prglb.ru/2569h
Уроки Java по самым сложным и продвинутым темам.
https://www.youtube.com/playlist?list=PL786bPIlqEjTO9pC06Phl7AtlH1wxyxgB
https://www.youtube.com/playlist?list=PL786bPIlqEjTO9pC06Phl7AtlH1wxyxgB
YouTube
Advanced Java - YouTube
#вопросы_с_собеседований
Чем отличается ArrayList от LinkedList? В каких случаях лучше использовать первый, а в каких второй?
Чем отличается ArrayList от LinkedList? В каких случаях лучше использовать первый, а в каких второй?
❓Чем отличается ArrayList от LinkedList? В каких случаях лучше использовать первый, а в каких второй?
❗️ArrayList:
✔️Доступ к произвольному элементу по индексу за константное время O(1);
✔️Доступ к элементам по значению за линейное время O(N);
✔️Вставка в конец в среднем производится за константное время O(1);
✔️Удаление произвольного элемента из списка занимает значительное время, т.к. при этом все элементы находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (capacity) не изменяется);
✔️Вставка элемента в произвольное место списка занимает значительное время, т.к. при этом все элементы находящиеся «правее» смещаются на одну ячейку вправо;
✔️Минимум накладных расходов при хранении.
LinkedList:
✔️На получение элемента по индексу или значению потребуется линейное время O(N);
✔️На добавление и удаление в начало или конец списка потребуется константное O(1);
✔️Вставка или удаление в/из произвольного места за константное O(N);
✔️Требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся ещё указатели на следующий и предыдущий элементы списка.
В целом, LinkedList в абсолютных величинах проигрывает ArrayList и по потребляемой памяти, и по скорости выполнения операций. LinkedList предпочтительно применять, когда нужны частые операции вставки/удаления или в случаях, когда необходимо гарантированное время добавления элемента в список.
❗️ArrayList:
✔️Доступ к произвольному элементу по индексу за константное время O(1);
✔️Доступ к элементам по значению за линейное время O(N);
✔️Вставка в конец в среднем производится за константное время O(1);
✔️Удаление произвольного элемента из списка занимает значительное время, т.к. при этом все элементы находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (capacity) не изменяется);
✔️Вставка элемента в произвольное место списка занимает значительное время, т.к. при этом все элементы находящиеся «правее» смещаются на одну ячейку вправо;
✔️Минимум накладных расходов при хранении.
LinkedList:
✔️На получение элемента по индексу или значению потребуется линейное время O(N);
✔️На добавление и удаление в начало или конец списка потребуется константное O(1);
✔️Вставка или удаление в/из произвольного места за константное O(N);
✔️Требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся ещё указатели на следующий и предыдущий элементы списка.
В целом, LinkedList в абсолютных величинах проигрывает ArrayList и по потребляемой памяти, и по скорости выполнения операций. LinkedList предпочтительно применять, когда нужны частые операции вставки/удаления или в случаях, когда необходимо гарантированное время добавления элемента в список.
#вопросы_с_собеседований
Расскажите о типах шаблонов проектирования.
Расскажите о типах шаблонов проектирования.
❓Расскажите о типах шаблонов проектирования.
❗️✔️Основные (Fundamental) — основные строительные блоки других шаблонов. Большинство других шаблонов использует эти шаблоны в той или иной форме.
✔️Порождающие шаблоны (Creational) — шаблоны проектирования, которые абстрагируют процесс создания экземпляра. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять созданный объект, а шаблон, порождающий объекты, делегирует создание объектов другому объекту.
✔️Структурные шаблоны (Structural) определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу.
✔️Поведенческие шаблоны (Behavioral) определяют взаимодействие между объектами, увеличивая таким образом его гибкость.
❗️✔️Основные (Fundamental) — основные строительные блоки других шаблонов. Большинство других шаблонов использует эти шаблоны в той или иной форме.
✔️Порождающие шаблоны (Creational) — шаблоны проектирования, которые абстрагируют процесс создания экземпляра. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять созданный объект, а шаблон, порождающий объекты, делегирует создание объектов другому объекту.
✔️Структурные шаблоны (Structural) определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу.
✔️Поведенческие шаблоны (Behavioral) определяют взаимодействие между объектами, увеличивая таким образом его гибкость.
Как сделать эффективными обсуждения по видеосвязи
Поговорим об использовании видеосвязи для удаленной работы. Бесплатные тарифы программ для видеоконференций и простые практики эффективных обсуждений.
https://prglb.ru/3enw4
Поговорим об использовании видеосвязи для удаленной работы. Бесплатные тарифы программ для видеоконференций и простые практики эффективных обсуждений.
https://prglb.ru/3enw4
Java Language Features, 2nd Edition (2018)
Многие опытные Java-программисты не знают всех тонкостей и интересных фишек языка, о которых автор рассказывает в данной книге. Более того, в ней содержатся интересные замечания о ядре Java и советы по написанию более эффективного рабочего кода.
Скачать книгу
Многие опытные Java-программисты не знают всех тонкостей и интересных фишек языка, о которых автор рассказывает в данной книге. Более того, в ней содержатся интересные замечания о ядре Java и советы по написанию более эффективного рабочего кода.
Скачать книгу
Telegram
Книги для программистов (reserved)
Java Language Features, 2nd Edition (2018)
Автор: Kishori Sharan
Автор: Kishori Sharan
Еще более углубленный курс по Java - Java Beans, JMX, форматирование строк и другое.
https://www.youtube.com/playlist?list=PL786bPIlqEjQifz13w4nAE9d-53HW387n
https://www.youtube.com/playlist?list=PL786bPIlqEjQifz13w4nAE9d-53HW387n
YouTube
More advanced
Share your videos with friends, family, and the world
#вопросы_с_собеседований
Несколько вопросов по многопоточности
1. Каким образом можно создать поток?
2. Чем различаются Thread и Runnable?
3. В чём заключается разница между методами start() и run()?
Несколько вопросов по многопоточности
1. Каким образом можно создать поток?
2. Чем различаются Thread и Runnable?
3. В чём заключается разница между методами start() и run()?
❓Каким образом можно создать поток?
✔️Создать потомка класса Thread и переопределить его метод run();
✔️Создать объект класса Thread, передав ему в конструкторе экземпляр класса, реализующего интерфейс Runnable. Этот интерфейс содержит метод run(), который будет выполняться в новом потоке. Поток закончит выполнение, когда завершится его метод run().
✔️Вызвать метод submit() у экземпляра класса, реализующего интерфейс ExecutorService, передав ему в качестве параметра экземпляр класса, реализующего интерфейс Runnable или Callable (содержит метод call(), в котором описывается логика выполнения).
❓Чем различаются Thread и Runnable?
Thread - это класс, некоторая надстройка над физическим потоком.
Runnable - это интерфейс, представляющий абстракцию над выполняемой задачей.
Помимо того, что Runnable помогает разрешить проблему множественного наследования, несомненный плюс от его использования состоит в том, что он позволяет логически отделить логику выполнения задачи от непосредственного управления потоком.
❓В чём заключается разница между методами start() и run()?
Несмотря на то, что start() вызывает метод run() внутри себя, это не то же самое, что просто вызов run(). Если run() вызывается как обычный метод, то он вызывается в том же потоке и никакой новый поток не запускается, как это происходит в случае, когда вы вызываете метод start().
✔️Создать потомка класса Thread и переопределить его метод run();
✔️Создать объект класса Thread, передав ему в конструкторе экземпляр класса, реализующего интерфейс Runnable. Этот интерфейс содержит метод run(), который будет выполняться в новом потоке. Поток закончит выполнение, когда завершится его метод run().
✔️Вызвать метод submit() у экземпляра класса, реализующего интерфейс ExecutorService, передав ему в качестве параметра экземпляр класса, реализующего интерфейс Runnable или Callable (содержит метод call(), в котором описывается логика выполнения).
❓Чем различаются Thread и Runnable?
Thread - это класс, некоторая надстройка над физическим потоком.
Runnable - это интерфейс, представляющий абстракцию над выполняемой задачей.
Помимо того, что Runnable помогает разрешить проблему множественного наследования, несомненный плюс от его использования состоит в том, что он позволяет логически отделить логику выполнения задачи от непосредственного управления потоком.
❓В чём заключается разница между методами start() и run()?
Несмотря на то, что start() вызывает метод run() внутри себя, это не то же самое, что просто вызов run(). Если run() вызывается как обычный метод, то он вызывается в том же потоке и никакой новый поток не запускается, как это происходит в случае, когда вы вызываете метод start().
#вопросы_с_собеседований
1. Почему в некоторых интерфейсах вообще не определяют методов?
2. Для чего в Java используются статические блоки инициализации?
1. Почему в некоторых интерфейсах вообще не определяют методов?
2. Для чего в Java используются статические блоки инициализации?
❓Почему в некоторых интерфейсах вообще не определяют методов?
❗️Это так называемые маркерные интерфейсы. Они просто указывают, что класс относится к определенному типу. Примером может послужить интерфейс Clonable, который указывает на то, что класс поддерживает механизм клонирования.
❓Для чего в Java используются статические блоки инициализации?
❗️Статические блоки инициализации используются для выполнения кода, который должен выполниться один раз при инициализации класса загрузчиком классов, в момент, предшествующий созданию объектов этого класса при помощи конструктора. Такой блок (в отличие от нестатических, принадлежащих конкретному объекту класса) принадлежит только самому классу (объекту метакласса Class).
❗️Это так называемые маркерные интерфейсы. Они просто указывают, что класс относится к определенному типу. Примером может послужить интерфейс Clonable, который указывает на то, что класс поддерживает механизм клонирования.
❓Для чего в Java используются статические блоки инициализации?
❗️Статические блоки инициализации используются для выполнения кода, который должен выполниться один раз при инициализации класса загрузчиком классов, в момент, предшествующий созданию объектов этого класса при помощи конструктора. Такой блок (в отличие от нестатических, принадлежащих конкретному объекту класса) принадлежит только самому классу (объекту метакласса Class).