Что такое Instance Variable?
Ответ: Instance Variable — переменная, которая определена внутри класса, и она существует вплоть до того момента, пока существует объект.
Ответ: Instance Variable — переменная, которая определена внутри класса, и она существует вплоть до того момента, пока существует объект.
Какая разница между Statement и PreparedStatement?
Statement и PreparedStatement — это два интерфейса в JDBC, которые используются для выполнения SQL-запросов. Они имеют несколько отличий:
— Statement используется для выполнения статических SQL-запросов без параметров.
— PreparedStatement используется для выполнения динамических SQL-запросов с параметрами. Этот интерфейс принимает входные параметры во время выполнения и может быть использован многократно.
— PreparedStatement прекомпилирован, поэтому его исполнение может происходить быстрее, чем у Statement.
— PreparedStatement также обеспечивает дополнительную безопасность, предотвращая атаки типа SQL-инъекции.
В общем, если в запрос нужно передавать параметры или он должен выполняться несколько раз, используйте PreparedStatement. В противном случае используйте Statement.
Statement и PreparedStatement — это два интерфейса в JDBC, которые используются для выполнения SQL-запросов. Они имеют несколько отличий:
— Statement используется для выполнения статических SQL-запросов без параметров.
— PreparedStatement используется для выполнения динамических SQL-запросов с параметрами. Этот интерфейс принимает входные параметры во время выполнения и может быть использован многократно.
— PreparedStatement прекомпилирован, поэтому его исполнение может происходить быстрее, чем у Statement.
— PreparedStatement также обеспечивает дополнительную безопасность, предотвращая атаки типа SQL-инъекции.
В общем, если в запрос нужно передавать параметры или он должен выполняться несколько раз, используйте PreparedStatement. В противном случае используйте Statement.
Что такое ordering, as-if-serial semantics, sequential consistency, visibility, atomicity, happens-before, mutual exclusion, safe publication?
ordering — механизм, который определяет, когда один поток может увидеть out-of-order (неверный) порядок исполнения инструкций другого потока. CPU для для повышения производительности может переупорядочивать процессорные инструкции и выполнять их в произвольном порядке до тех пор пока для потока внутри не будет видно никаких отличий. Гарантия, предоставляемая этим механизмом, называется as-if-serial semantics.
sequential consistency — то же что и as-if-serial semantics, гарантия того, что в рамках одного потока побочные эффекты от всех операций будут такие, как будто все операции выполняются последовательно.
visibility определяет, когда действия в одном потоке становятся видны из другого потока.
happens-before — логическое ограничение на порядок выполнения инструкций программы. Если указывается, что запись в переменную и последующее ее чтение связаны через эту зависимость, то как бы при выполнении не переупорядочивались инструкции, в момент чтения все связанные с процессом записи результаты уже зафиксированы и видны.
atomicity — атомарность операций. Атомарная операция выглядит единой и неделимой командой процессора, которая может быть или уже выполненной или ещё невыполненной.
mutual exclusion (взаимоисключающая блокировка, семафор с одним состоянием) — механизм, гарантирующий потоку исключительный доступ к ресурсу. Используется для предотвращения одновременного доступа к общему ресурсу. В каждый момент времени таким ресурсом может владеть только один поток. Простейший пример: synchronized(obj) { … }.
safe publication — показ объектов другим потокам из текущего, не нарушая ограничений visibility. Способы такой публикации в Java:
• static{} инициализатор;
• volatile переменные;
• atomic переменные;
• сохранение в разделяемой переменной, корректно защищенной с использованием synchronized(), синхронизаторов или других конструкций, создающих read/write memory barrier;
• final переменные в разделяемом объекте, который был корректно проинициализирован.
ordering — механизм, который определяет, когда один поток может увидеть out-of-order (неверный) порядок исполнения инструкций другого потока. CPU для для повышения производительности может переупорядочивать процессорные инструкции и выполнять их в произвольном порядке до тех пор пока для потока внутри не будет видно никаких отличий. Гарантия, предоставляемая этим механизмом, называется as-if-serial semantics.
sequential consistency — то же что и as-if-serial semantics, гарантия того, что в рамках одного потока побочные эффекты от всех операций будут такие, как будто все операции выполняются последовательно.
visibility определяет, когда действия в одном потоке становятся видны из другого потока.
happens-before — логическое ограничение на порядок выполнения инструкций программы. Если указывается, что запись в переменную и последующее ее чтение связаны через эту зависимость, то как бы при выполнении не переупорядочивались инструкции, в момент чтения все связанные с процессом записи результаты уже зафиксированы и видны.
atomicity — атомарность операций. Атомарная операция выглядит единой и неделимой командой процессора, которая может быть или уже выполненной или ещё невыполненной.
mutual exclusion (взаимоисключающая блокировка, семафор с одним состоянием) — механизм, гарантирующий потоку исключительный доступ к ресурсу. Используется для предотвращения одновременного доступа к общему ресурсу. В каждый момент времени таким ресурсом может владеть только один поток. Простейший пример: synchronized(obj) { … }.
safe publication — показ объектов другим потокам из текущего, не нарушая ограничений visibility. Способы такой публикации в Java:
• static{} инициализатор;
• volatile переменные;
• atomic переменные;
• сохранение в разделяемой переменной, корректно защищенной с использованием synchronized(), синхронизаторов или других конструкций, создающих read/write memory barrier;
• final переменные в разделяемом объекте, который был корректно проинициализирован.
Дан целочисленный массив nums, поверните массив вправо на k шагов.
Метод rotate принимает массив nums и целое число k. Сначала мы проверяем, что k не отрицательное число и не больше длины массива. Затем мы вызываем метод reverse, который переворачивает первую часть массива от начала до конца — k-1.
Метод reverse переворачивает вторую часть массива от конца — k до конца. Наконец, мы вызываем метод reverse, который переворачивает весь массив. Это позволяет нам получить массив, который был повернут на k шагов вправо.
Метод reverse принимает массив nums, индекс начала и индекс конца. Мы меняем местами элементы массива от начала до конца и уменьшаем индекс начала и увеличиваем индекс конца до тех пор, пока они не пересекутся.
Метод rotate принимает массив nums и целое число k. Сначала мы проверяем, что k не отрицательное число и не больше длины массива. Затем мы вызываем метод reverse, который переворачивает первую часть массива от начала до конца — k-1.
Метод reverse переворачивает вторую часть массива от конца — k до конца. Наконец, мы вызываем метод reverse, который переворачивает весь массив. Это позволяет нам получить массив, который был повернут на k шагов вправо.
Метод reverse принимает массив nums, индекс начала и индекс конца. Мы меняем местами элементы массива от начала до конца и уменьшаем индекс начала и увеличиваем индекс конца до тех пор, пока они не пересекутся.
Какие два класса не наследуются от Object?
Ответ: таких классов нет: все классы прямо или через предков наследуются от класса Object.
Ответ: таких классов нет: все классы прямо или через предков наследуются от класса Object.
Какие есть режимы доступа к файлу?
В Java есть несколько режимов доступа к файлам:
— Read (чтение): открывает файл для чтения, позволяет читать данные из файла.
— Write (запись): открывает файл для записи, позволяет записывать данные в файл. При этом старое содержимое файла удаляется.
— Append (добавление): открывает файл для записи, но данные добавляются в конец файла, старое содержимое сохраняется.
— RandomAccess (произвольный доступ): позволяет читать и записывать данные в произвольном месте в файле.
Для указания режима доступа используются константы из класса File:
File.READ, File.WRITE, File.APPEND и т.д.
Выбор нужного режима зависит от задачи, а комбинируя режимы, можно получить различные варианты работы с файлами.
В Java есть несколько режимов доступа к файлам:
— Read (чтение): открывает файл для чтения, позволяет читать данные из файла.
— Write (запись): открывает файл для записи, позволяет записывать данные в файл. При этом старое содержимое файла удаляется.
— Append (добавление): открывает файл для записи, но данные добавляются в конец файла, старое содержимое сохраняется.
— RandomAccess (произвольный доступ): позволяет читать и записывать данные в произвольном месте в файле.
Для указания режима доступа используются константы из класса File:
File.READ, File.WRITE, File.APPEND и т.д.
Выбор нужного режима зависит от задачи, а комбинируя режимы, можно получить различные варианты работы с файлами.
Что такое Casting?
Ответ: casting, или приведение типов — это процесс преобразования одного типа данных в другой тип данных: вручную (неявное приведение) или автоматически (явное приведение типов).
Ответ: casting, или приведение типов — это процесс преобразования одного типа данных в другой тип данных: вручную (неявное приведение) или автоматически (явное приведение типов).
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Какие преобразования называются нисходящими и восходящими?
Восходящее преобразование (Upcasting) — это преобразование объекта дочернего класса в объект родительского класса. Преобразование может быть выполнено неявно, так как дочерний класс является подтипом родительского класса. Восходящее преобразование позволяет нам получить доступ к членам родительского класса, но не ко всем членам дочернего класса.
Нисходящее преобразование (Downcasting) — это преобразование объекта родительского класса в объект дочернего класса. Это преобразование не может быть выполнено неявно и требует явного указания типа. Нисходящее преобразование может быть опасным, так как оно может привести к ошибке ClassCastException, если типы не совместимы.
Восходящее преобразование (Upcasting) — это преобразование объекта дочернего класса в объект родительского класса. Преобразование может быть выполнено неявно, так как дочерний класс является подтипом родительского класса. Восходящее преобразование позволяет нам получить доступ к членам родительского класса, но не ко всем членам дочернего класса.
Нисходящее преобразование (Downcasting) — это преобразование объекта родительского класса в объект дочернего класса. Это преобразование не может быть выполнено неявно и требует явного указания типа. Нисходящее преобразование может быть опасным, так как оно может привести к ошибке ClassCastException, если типы не совместимы.
Могут ли нестатические методы перегрузить статические?
Ответ: Да. В итоге получится два разных метода. Статический будет принадлежать классу и будет доступен через его имя, а нестатический будет принадлежать конкретному объекту и доступен через вызов метода этого объекта.
Ответ: Да. В итоге получится два разных метода. Статический будет принадлежать классу и будет доступен через его имя, а нестатический будет принадлежать конкретному объекту и доступен через вызов метода этого объекта.
Когда использовать рефлексии?
Уверен многих кто только начал учить ReflectionAPI удивили возможности этого инструмента. Но работа с ним довольно тяжёлая для системы, поэтому лучше использовать её в крайних случаях.
К примеру — обработка класса с аннотациями (пример выше). Извлекая аннотации из объектов класса, можно обрабатывать её каким угодно образом.
Также рефлексии часто применяют в тестировке, а именно для приватных полей и методов. Достаточно получить метод из класса, задать method.isAccessible(true) и можно вызывать его как публичный.
Уверен многих кто только начал учить ReflectionAPI удивили возможности этого инструмента. Но работа с ним довольно тяжёлая для системы, поэтому лучше использовать её в крайних случаях.
К примеру — обработка класса с аннотациями (пример выше). Извлекая аннотации из объектов класса, можно обрабатывать её каким угодно образом.
Также рефлексии часто применяют в тестировке, а именно для приватных полей и методов. Достаточно получить метод из класса, задать method.isAccessible(true) и можно вызывать его как публичный.
Может ли статический метод быть переопределён или перегружен?
Cтатические методы не могут быть переопределены или перегружены в подклассах.
Причина в том, что статические методы принадлежат классу, а не объекту. Они вызываются через имя класса, а не через ссылку на объект.
Переопределение и перегрузка работают только с нестатическими методами в иерархии классов. При вызове нестатического метода используется динамическая диспетчеризация для определения нужной реализации метода в runtime.
Но со статическими методами так не работает. Компилятор связывает вызов статического метода с конкретным классом во время компиляции. Поэтому статические методы не могут быть переопределены или перегружены.
Cтатические методы не могут быть переопределены или перегружены в подклассах.
Причина в том, что статические методы принадлежат классу, а не объекту. Они вызываются через имя класса, а не через ссылку на объект.
Переопределение и перегрузка работают только с нестатическими методами в иерархии классов. При вызове нестатического метода используется динамическая диспетчеризация для определения нужной реализации метода в runtime.
Но со статическими методами так не работает. Компилятор связывает вызов статического метода с конкретным классом во время компиляции. Поэтому статические методы не могут быть переопределены или перегружены.
Какова иерархия исключений?
В Java иерархия исключений выстраивается следующим образом:
— Все исключения являются потомками класса Throwable.
— Класс Throwable имеет два подкласса: Exception и Error.
— Класс Exception предназначен для исключений, возникающих во время выполнения программы. Он делится на два подкласса:
— Checked exception — исключения, которые обязательно нужно обрабатывать или объявлять. К ним относятся SQLException, IOException и другие.
— Unchecked exception (RuntimeException) — исключения, обработка которых необязательна. Например, NullPointerException, ArithmeticException.
— Класс Error предназначен для ошибок, возникающих вне программы. Это могут быть ошибки JVM, например OutOfMemoryError.
При разработке приложений важно выбирать нужный тип исключения, чтобы правильно обрабатывать различные ситуации.
В Java иерархия исключений выстраивается следующим образом:
— Все исключения являются потомками класса Throwable.
— Класс Throwable имеет два подкласса: Exception и Error.
— Класс Exception предназначен для исключений, возникающих во время выполнения программы. Он делится на два подкласса:
— Checked exception — исключения, которые обязательно нужно обрабатывать или объявлять. К ним относятся SQLException, IOException и другие.
— Unchecked exception (RuntimeException) — исключения, обработка которых необязательна. Например, NullPointerException, ArithmeticException.
— Класс Error предназначен для ошибок, возникающих вне программы. Это могут быть ошибки JVM, например OutOfMemoryError.
При разработке приложений важно выбирать нужный тип исключения, чтобы правильно обрабатывать различные ситуации.
Что такое анонимные классы и где они применяются?
Анонимные классы — это классы без имени, которые используются для создания объекта определенного класса или интерфейса «на лету».
Анонимные классы удобны, когда нужно создать простой класс «одноразового использования» для какой-то конкретной задачи. Они позволяют избежать громоздких именованных классов в таких случаях.
Чаще всего они применяются для:
— создания обработчика событий в GUI-приложениях.
— создания компаратора или другого функционального интерфейса для сортировки или фильтрации коллекций.
— расширения класса путем создания подкласса без имени.
Анонимные классы — это классы без имени, которые используются для создания объекта определенного класса или интерфейса «на лету».
Анонимные классы удобны, когда нужно создать простой класс «одноразового использования» для какой-то конкретной задачи. Они позволяют избежать громоздких именованных классов в таких случаях.
Чаще всего они применяются для:
— создания обработчика событий в GUI-приложениях.
— создания компаратора или другого функционального интерфейса для сортировки или фильтрации коллекций.
— расширения класса путем создания подкласса без имени.
Можно ли использовать private или protected переменные в interface?
Ответ: В Java переменные, объявленные с модификаторами private или protected, не могут быть использованы непосредственно в интерфейсах (interfaces). Интерфейсы содержат только абстрактные методы, константы и методы по умолчанию (default methods), которые все являются public.
Ответ: В Java переменные, объявленные с модификаторами private или protected, не могут быть использованы непосредственно в интерфейсах (interfaces). Интерфейсы содержат только абстрактные методы, константы и методы по умолчанию (default methods), которые все являются public.
Сколько необходимо дополнительной памяти при вызове ArrayList.add()?
Если в массиве достаточно места для размещения нового элемента, то дополнительной памяти не требуется. Иначе происходит создание нового массива размером в 1,5 раза превышающим существующий (это верно для JDK выше 1.7, в более ранних версиях размер увеличения иной).
Если в массиве достаточно места для размещения нового элемента, то дополнительной памяти не требуется. Иначе происходит создание нового массива размером в 1,5 раза превышающим существующий (это верно для JDK выше 1.7, в более ранних версиях размер увеличения иной).
В чем разница между интерфейсами Comparable и Comparator?
Основное различие между интерфейсами Comparable и Comparator заключается в том, что в Comparable «зашит» один-единственный алгоритм сравнения объектов, в то время как Comparator представляет собой внешнюю заменяемую настройку. Архитектурно, Comparable — это интерфейс значения, в то время как Comparator — настройка контейнера.
Следует использовать Comparable, когда задается естественный (наиболее логичный) порядок. Например, для строк это регистрозависимое лексикографическое сравнение, а для длинных чисел — сравнение по значению. Во всех остальных случаях — без отдельного компаратора не обойтись.
Основное различие между интерфейсами Comparable и Comparator заключается в том, что в Comparable «зашит» один-единственный алгоритм сравнения объектов, в то время как Comparator представляет собой внешнюю заменяемую настройку. Архитектурно, Comparable — это интерфейс значения, в то время как Comparator — настройка контейнера.
Следует использовать Comparable, когда задается естественный (наиболее логичный) порядок. Например, для строк это регистрозависимое лексикографическое сравнение, а для длинных чисел — сравнение по значению. Во всех остальных случаях — без отдельного компаратора не обойтись.
Может ли метод main выбросить исключение во вне и если да, то где будет происходить обработка данного исключения?
Метод main может выбросить исключение. Это исключение будет передано в JVM (виртуальную машину Java). JVM отловит это исключение и завершит выполнение программы, выведя stack trace (трассировку стека) исключения.
Таким образом, исключение из main приведет к аварийному завершению программы.
Чтобы избежать этого, лучшей практикой является перехватывать исключения внутри main и обрабатывать их, не допуская выброса за его пределы.
Метод main может выбросить исключение. Это исключение будет передано в JVM (виртуальную машину Java). JVM отловит это исключение и завершит выполнение программы, выведя stack trace (трассировку стека) исключения.
Таким образом, исключение из main приведет к аварийному завершению программы.
Чтобы избежать этого, лучшей практикой является перехватывать исключения внутри main и обрабатывать их, не допуская выброса за его пределы.