Это 31-й день моего участия в августовском испытании обновлений. Ознакомьтесь с подробностями мероприятия: Испытание августовского обновления
1 При каких обстоятельствах объект будет утилизирован механизмом сборки мусора?
Используя алгоритм анализа достижимости, виртуальная машина определяет некоторые объекты как корни GC и начинает с корней GC и выполняет поиск по цепочке ссылок.Объект не может быть найден GC Roots, виртуальная машина считает, что объект можно переработать.
1.1****какие объекты можно считать** GC ****Roots **Шерстяная ткань?
1) Объекты, на которые есть ссылки в стеке виртуальной машины (таблица локальных переменных во фрейме стека);
2) объект, постоянные ссылки, указанные областью метода;
3) объект, на который ссылается JNI (собственный метод) в локальном стеке методов;
1.2Если объект недоступен, будет ли он переработан сборщиком мусора?
Даже если он недоступен, объект не обязательно будет собран сборщиком мусора,
1) Сначала определите, нужно ли объекту выполнять метод finalize().Объект должен переписать метод finalize() и не запускался.
2) Если необходимо выполнить, объекты будут помещены в очередь, и JVM откроет поток для их повторного использования, это последний шанс для объектов убежать и очиститься.
2 , Расскажите о распространенных методах кодирования?
Смысл кодирования: наименьший блок, хранящийся в компьютере, является одним из байтов, то есть 8 бит, а диапазон символов, которые можно представить, составляет 255. Однако, что имеется слишком много символов, которые будут представлены людьми, которые не могут быть Полностью представленные одним байтом, поэтому необходимо кодировать символы., Что означает различные языки на языки, которые могут понять компьютеры.
1) Код ASCII: всего 128, представленных младшими 7 битами байта, от 0 до 31 управляющих символов, таких как возврат каретки, удаление и т. д.; 32–126 – печатные символы, которые можно вводить и отображать с помощью клавиатуры. ;
2) ISO-8859-1, используемый для расширения кодировки ASCII, 256 символов, охватывающий большинство символов западноевропейского языка.
3) GB2312: двухбайтовое кодирование, общий диапазон кодирования составляет A1-A7, A1-A9 — область символов, включая 682 символа, B0-B7 — область китайских символов, включая 6763 китайских символа;
4) GBK добавил больше китайских иероглифов, чтобы расширить GB2312.Диапазон кодирования 8140~FEFE, с 23940 кодовыми точками, которые могут представлять 21003 китайских иероглифов.
5) UTF-16: ISO пытается создать новый суперязыковой словарь, все языки в мире могут быть переведены друг в друга через этот словарь Unicode, а UTF-16 определяет метод доступа к символам Unicode в компьютере, используя два байта для представления формата преобразования Unicode. Любой символ может быть представлен двумя байтами, то есть 16-битным, что называется UTF-16.
6) UTF-8: UTF-16 равномерно использует два байта для представления одного символа, но некоторые символы могут быть представлены только одним байтом, что является пустой тратой места для хранения, в то время как UTF-8 использует технологию переменной длины, каждая кодировка область имеет разную длину символов. Различные типы символов могут состоять из 1~6 байтов.
**3 **, **utf-8 **Китайский язык в кодировке занимает несколько байт; int Введите сколько байт?
utf-8 это технология кодирования с переменной длиной, байты занимаемые китайцами в кодировке utf-8 неопределенны, возможно 2, 3, 4,
Тип int занимает 4 байта.
4 , разница между статическим прокси и динамическим прокси, какие сценарии используются?
Прокси является общим рисунком дизайна, целью которого является предоставление прокси для других объектов для контроля доступа к объекту и отделить взаимосвязь между двумя классами. Как класс прокси, так и класса делегата реализуют тот же интерфейс, потому что то, что прокси действительно вызывает, является методом класса делегата.
разница:
- статический прокси: Создается программистом или генерируется специальным инструментом, который является статическим прокси-сервером и определяется при компиляции кода. Статические прокси обычно проксируют только один класс;
- Динамический прокси: генераторы создаются динамически с использованием механизмов отражения во время выполнения кода. Динамический прокси-прокси — это несколько классов реализации под интерфейсом;
Этапы реализации: а) реализовать интерфейс InvocationHandler для создания собственного обработчика вызова; б) предоставить классу загрузчика классов и массив типов прокси-интерфейса для создания динамического прокси-класса; в) использовать механизм отражения, чтобы получить конструктор динамического класс прокси г. Использование динамического класса прокси Конструктор создает объект динамического класса прокси;
Сценарии использования: методы вызова интерфейсов непосредственно в Retrofit, механизм АОП Spring;
**5 **, Java аномальная система
Throwable в Java — это суперкласс всех исключений и ошибок, а два прямых подкласса — это Error и Exception:
1) Ошибка — это ошибка, которую программа не может обработать, сгенерированная и выброшенная JVM, например OOM, ThreadDeath и т. д. Когда возникают эти исключения, JVM обычно решает завершить программу.
2) Исключение — это аномальный процесс, который сам может обрабатывать, аномалии (RuntimeException) (также называемые Checked Eception, разделенные на время выполнения) и ненормальные (без проверки аномальные Unchecked Exception) неработоспособности. Когда происходит ненормальная работа NullPointerException \ IndexOutOfBoundsException, эти аномалии, как правило, вызваны логической ошибкой программы, их следует избегать. Аномалии IOException \ SQLException \ FileNotFoundException Аномалии исключения и определяемое пользователем время простоя.
6 Поговорите о своем понимании анализа и отправили.
Метод пальцев разрешения известен до операции, то есть период компиляции, имеет детерминированную версию и не меняется в процессе работы. Решение является статическим, и ссылка на символ может быть преобразована в прямую ссылку во время загрузки класса.
Диспетчеризацию можно разделить на статическую диспетчеризацию и динамическую диспетчеризацию, перегрузка относится к статической диспетчеризации, а переопределение относится к динамической диспетчеризации. Статическая диспетчеризация означает, что статический тип параметра используется в качестве основы для суждения вместо фактического типа при перегрузке.На этапе компиляции компилятор может решить, какую перегруженную версию использовать в соответствии со статическим типом параметра. Динамическая диспетчеризация должна вызывать соответствующий метод в соответствии с фактическим типом.
7 , изменить объект A из equals сигнатура метода, затем используйтеКогда ****HashMap сохранит этот экземпляр объекта, он вызоветС которым ****equals метод?
Будет вызван метод equals объекта.Если метод equals объекта не переопределен, метод equals и == оба сравнивают значение адреса кучи памяти, указанного в таблице локальных переменных в стеке, на равенство.
**8 **, Java Каков механизм реализации полиморфизма в ?
Полиморфизм означает, что конкретный тип, на который указывает ссылочная переменная, определенная в программе, и вызов метода, выданный с помощью ссылочной переменной, не определяются во время компиляции, и только во время выполнения определяется, на какой экземпляр класса будет указывать ссылочная переменная. . Это позволяет связать ссылочные переменные с различными реализациями класса без изменения исходной программы. В Java есть три необходимых условия для реализации полиморфизма: наследование, переназначение и повышение приведения. В полиморфизме ссылка подкласса должна быть назначена объекту родительского класса. Только таким образом ссылка может вызывать объект родительского класса. метод родительского класса и подкласса.
9 , как поставить Java Объект сериализован в файл?
ObjectOutputStream.writeObject() отвечает за чтение данных из заданной последовательности из указанного потока записи потока, ObjectInputStream.readObject().
//写入try {
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("D:/student.txt"));
os.writeObject(studentList); os.close();
} catch(FileNotFoundException e) { e.printStackTrace();
} catch(IOException e) { e.printStackTrace();
}
10 , скажи, что ты прав Java понимание отражения
В рабочем состоянии для любого класса можно знать все свойства и методы этого класса, а для любого объекта можно вызывать любые его методы и свойства. Эта функция динамического получения информации и динамического вызова методов объекта называется механизмом отражения языка java.
Роль отражения: в процессе разработки часто встречается, что переменная-член, метод или свойство определенного класса являются закрытыми или открытыми только для системных приложений.Здесь вы можете использовать механизм отражения java для получения требуемого информация через отражение.Частные члены или методы.
Получить экземпляр объекта Class класса Class clz = Class.forName("com.zhenai.api.Apple");
1) Получите объект Constructor в соответствии с экземпляром объекта Class Constructor appConstructor = clz.getConstructor();
2) Используйте метод newInstance объекта Constructor для получения объекта класса отражения Object appleObj = appConstructor.newInstance();
3) Получить объект метода метода setPriceMethod = clz.getMethod("setPrice", int.class);
4) Используйте метод вызова для вызова метода setPriceMethod.invoke(appleObj, 14);
5) Свойства класса Class можно получить с помощью getFields(), но нельзя получить частные свойства, в то время как getDeclaredFields() может получить все свойства, включая частные свойства. Методы с объявленным оформлением могут быть отражены в закрытых методах, методы без объявленного оформления могут использоваться только для отражения общедоступных методов, и то же самое верно для других, таких как Annotation\Field\Constructor.
11 , скажи, что ты прав Java понимание аннотаций
Аннотации определяются ключевым словом @interface.Форма аналогична форме интерфейсов, за исключением того, что перед ними стоит @.
public @interface TestAnnotation {
}
При использовании @TestAnnotation для ссылки, чтобы аннотация работала правильно, вам также необходимо использовать метааннотацию, которая представляет собой аннотацию, которую можно аннотировать в аннотации. Существует пять метатегов @Retention @Documented @Target @Inherited @Repeatable
@Retention указывает время существования аннотации. Значение аннотации RetentionPolicy.SOURCE сохраняется только на этапе исходного кода и отбрасывается при компиляции компилятора; аннотация RetentionPolicy.CLASS сохраняется только до тех пор, пока не будет выполнена компиляция, и не будет загружаться в JVM. RetentionPolicy.RUNTIME можно оставить до запуска программы, он будет загружен в JVM, поэтому их можно будет получить во время работы программы.
Элементы, аннотированные @Documented, включаются в javadoc.
@Target определяет сценарии применения аннотаций, ElementType.FIELD аннотирует свойства, ElementType.LOCAL_VARIABLE может аннотировать локальные переменные, ElementType.METHOD может аннотировать методы, ElementType.PACKAGE может аннотировать пакет, ElementType.TYPE может аннотировать аннотации типа пакета, такие как классы. , интерфейсы, перечисления
@Inherited Если надкласс аннотирован аннотациями @Inherited, а его подклассы не применяются никакими аннотациями, подклассы могут наследовать аннотации суперкласса;
Роль аннотаций:
- Предоставьте информацию компилятору: компилятор может использовать аннотации для обнаружения ошибок и предупреждений.
- Стадия компиляции: программные средства могут использовать аннотационную информацию для генерации кода, html-документов или другой соответствующей обработки;
- Запуск фазы: когда программа запущена, вы можете использовать аннотации для извлечения кода
Аннотации получаются посредством отражения.Можно использовать метод isAnnotationPresent() объекта Class, чтобы определить, применена ли аннотация, а затем получить объект Annotation с помощью метода getAnnotation().
12 , расскажите о принципе дженериков и приведите пример
ДженерикиТип становится переданным параметром, чтобы разнообразить типы, которые можно использовать, тем самым добившись разделения. Дженерики Java появились после Java 1.5.Для сохранения совместимости с предыдущими версиями для реализации дженериков использовался метод стирания. Стирание относится к игнорированию параметра типа T в определенной степени и стиранию непосредственно из класса, в котором находится T, в родительский класс T, например, вызов универсального метода, передача параметра типа T в метод, если не выполняется что-то похожее при объявлении public T methodName(T extends Father t){}, Java выполняет стирание восходящего типа и напрямую обрабатывает параметр t как класс объекта вместо переданного T. То есть внутри любого класса и метода с дженериками он не может знать свои собственные дженерик-параметры, стирание и трансформация происходят на границе, то есть переданные параметры стираются при входе в класс или метод, а когда вышел, то был преобразуется в T, который мы установили. Внутри универсального класса или метода не могут выполняться никакие операции, связанные с конкретным типом (т. е. подклассом стертого типа), например, new T() или T.play() (play — это метод подкласса, а не метод стертого класса)
**13 **, Java середина String понимание
1) Класс String является конечным типом, поэтому класс String не может быть унаследован, а его методы-члены по умолчанию являются конечными методами. Как только объект String создан, он фиксируется, любые изменения в объекте String не повлияют на исходный объект, а любые связанные операции изменения будут генерировать новый объект String.
2) Класс String хранит строки через массивы char, а String перерабатывает метод equals для сравнения значений на равенство.
String a = "test"; String b = "test"; String c = new String("test");
A, B и буквально тестируйте все пункты на объект «Test» в постоянном пуле строки JVM, и они указывают на тот же объект. Новое ключевое слово должно создать тест объекта, который хранится в куче. Таким образом, новая строка («тест») производит два объекта C на стеке и тестируйте на кучу. В Java нет двух идентичных строковых объектов вообще, поэтому тест в куче следует обратиться к тесту в пуле постоянного пука.
пример:
*String str1 = "abc"; **// *Создайте пространство в стеке для хранения ссылок str1 *, *str1 **указать на бассейн String **постоянный "abc" String **str2 = "def *"; **// *Создайте пространство в стеке для хранения ссылок str2 *, *str2 **указать на бассейн String **постоянный "def" String **str3 = str1 *+ **str2;// *Создайте пространство в стеке для хранения ссылок str3
//str1+str2 пройти через StringBuilder последний шаг *toString() *метод возвращает новый String объект "abcdef"
*// *Откроет место в куче для хранения этого объекта, ссылка str3 указывает на кучу *(str1+str2) *вернулся новый String *объект. *System.out.println(str3 == *"abcdef");// *возвращение false
так как str3 указывает на кучу *"abcdef" *объект и *"abcdef" *является объектом в пуле символов, поэтому результат false *. *JVM правильно String ***str="abc" *Объекты помещаются в постоянный пул во время компиляции, а String **str3=str1+str2 **известно во время выполнения *правильно, *new **Объекты также выполняются во время выполнения.
**14 **, String Зачем проектировать, чтобы быть неизменным?
Для пулов строковых констант требуется, чтобы строка была неизменной. Поскольку String спроектирован так, чтобы быть неизменяемым, при создании объекта String, если строковое значение уже существует в пуле констант, новый объект не будет создан, а будет сделана ссылка на существующий объект. Если разрешить изменение строковой переменной, это приведет к различным логическим ошибкам, например, изменение одного объекта повлияет на другой независимый объект.
1) Строковые объекты могут кэшировать hashCode. Неизменяемость строки обеспечивает уникальность хеш-кода, поэтому хэш-код строки можно кэшировать, чтобы хэш-код не нужно было каждый раз пересчитывать. При сравнении строк hashCode можно сравнивать напрямую, что повышает безопасность производительности.
2) Безопасность. String Java Class используется многими в качестве параметра, такого как параметры строки URI адрес, путь пути к файлу, требуется отражение, если строковая переменная, приведет к тому, что всевозможные риски безопасности будут вызывать все виды безопасности.