Arrays.toString() и Arrays.deepToString()
В Java массивы не переопределяют toString(), поэтому, если вы попытаетесь напечатать его напрямую, вы получите имя класса + '@' + шестнадцатеричный хеш-код массива, как определено в Object.toString().
Но обычно нам на самом деле нужно что бы напечаталось содержимое массива. Самый простой способ это сделать, это воспользоваться методом Arrays.toString(). А если массив содержит другие массивы, то Arrays.deepToString().
Внутри этих методов на каждом элементе массива вызывается метод toString() для получения строкового представления.
В Java массивы не переопределяют toString(), поэтому, если вы попытаетесь напечатать его напрямую, вы получите имя класса + '@' + шестнадцатеричный хеш-код массива, как определено в Object.toString().
Но обычно нам на самом деле нужно что бы напечаталось содержимое массива. Самый простой способ это сделать, это воспользоваться методом Arrays.toString(). А если массив содержит другие массивы, то Arrays.deepToString().
Внутри этих методов на каждом элементе массива вызывается метод toString() для получения строкового представления.
Что это — --х;
Anonymous Quiz
7%
префиксный инкремент
3%
постфиксный инкремент
84%
префиксный декремент
6%
постфиксный декремент
Расскажите о ThreadPoolExecutor
ThreadPoolExecutor — это класс в Java, который предоставляет управление пулами потоков для выполнения асинхронных задач. Он является частью пакета java.util.concurrent, который предоставляет различные средства для работы с параллельными и асинхронными задачами.
Что такое 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.
Но со статическими методами так не работает. Компилятор связывает вызов статического метода с конкретным классом во время компиляции. Поэтому статические методы не могут быть переопределены или перегружены.