1. Каковы основные типы данных в JAVA и сколько байтов они занимают?
2. Можно ли наследовать класс String и почему?
не может. В Java, пока класс определен как final, можно также сказать, что это класс, измененный final, он не может быть унаследован.
3. Разница между String, Stringbuffer и StringBuilder.
4. В чем разница между ArrayList и LinkedList.
Простая разница: 1. ArrayList — это структура данных, основанная на динамических массивах, а LinkedList — структура данных, основанная на связанных списках. (LinkedList — это двусвязный список со следующим и предыдущим) 2. Для получения и установки произвольного доступа ArrayList лучше, чем LinkedList, потому что LinkedList должен перемещать указатель. 3. Для операций добавления и удаления больше подходит LinedList, потому что ArrayList должен перемещать данные.
Глубина разницы: 1. Для терминов ArrayList и LinkedList добавление элемента в конец списка тратится на фиксированные затраты. Для ArrayList основное увеличение внутреннего массива, указывающее на добавленные элементы, может иногда приводить к перераспределению массива; в случае с LinkedList эти накладные расходы представляют собой унифицированное назначение внутреннего объекта Entry.
2. Вставка или удаление элемента в середине ArrayList означает, что оставшиеся элементы в списке будут перемещены, в то время как вставка или удаление элемента в середине LinkedList имеет фиксированную стоимость.
3. LinkedList не поддерживает эффективный произвольный доступ к элементам.
4. Пустая трата пространства ArrayList в основном отражается в резервировании определенного пространства емкости в конце списка списка, в то время как стоимость пространства LinkedList отражается в том, что каждый элемент должен занимать значительный объем пространства.
5. Расскажите о порядке инстанцирования классов.
Проблема: например, статические данные родительского класса, конструктор, поле, статические данные подкласса, конструктор, слово Сегменты, когда они новые, порядок их выполнения.
Отвечать: Шаги, которые необходимо предпринять при создании экземпляра загрузчика классов (load->connect->initialize). статическая переменная родительского класса, Блок статического кода родительского класса, статические переменные подкласса, блоки статического кода подкласса, Нестатическая переменная родительского класса (переменная-член экземпляра родительского класса), конструктор родительского класса, Нестатические переменные подкласса (переменные-члены экземпляра подкласса), Конструктор подкласса.
6. Какие классы карт использовались и в чем их отличия.
Вопрос: Например, является безопасным потоком Hashmap, какая карта используется в соответствии с параллелизмом, а какие их внутренние принципы, такие как метод хранения, HashCode, расширение, емкость по умолчанию и т. Д. Отвечать: Небезопасно, используйте ConcurrenthashMap при параллелизме.
7. Почему ConcurrentHashMap в JAVA8 отказывается от блокировки сегмента?
Причина: Согласно исходному коду JDK и официальной документации, они считают, что причины отказа от блокировок сегментов следующие: 1. Добавление нескольких блокировок сегментов занимает много места в памяти. 2. В производственной среде вероятность конкуренции за одну и ту же блокировку при постановке карты очень мала, а сегментированная блокировка вызовет длительное ожидание таких операций, как обновление. 3. Для повышения эффективности GC
Поскольку блокировки сегментов устарели, необходимо использовать новое решение для обеспечения безопасности потоков. Давайте посмотрим, как исходный код решает обеспечение безопасности потоков? КАС
Сначала, после нахождения соответствующего связанного списка через хэш, проверяем, является ли он первым объектом, если да, то вставляем его напрямую по принципу cas без блокировки, а затем, если это не первый объект связанного списка, то напрямую используем первый объект связанного списка для блокировки, здесь Добавленная блокировка синхронизируется.Хотя эффективность не так хороша, как ReentrantLock, но это экономит место.Здесь первый объект будет использоваться в качестве блокировки, пока не будет пересчитан размер карты, такой как расширение или операция первого объекта.
8. Почему ConcurrentHashMap (JDK1.8) использует синхронизированные, а не повторные блокировки, такие как ReentranLock?
Мы можем сказать по следующим аспектам: блокировка детализации Первая зернистость замка не утолщается, становится еще более мелкой. При однократном расширении параллелизм ConcurrentHashMap будет удваиваться. Хэш-конфликт JDK1.7, ConcurrentHashMap из вторичного хэша (Segment -> HashEntry), чтобы быстро найти искомые элементы. В 1.8 компенсируется разрыв в производительности при прохождении по списку с добавлением красно-черной древовидной формы. Расширение JDK1.8, когда ConcurrentHashmap для расширения, расширение других потоков может быть ли этот связанный список (красно-черное дерево), расширение размера частицы уменьшается, повышая эффективность расширения, определяемого путем обнаружения узла массива.
Почему синхронизирован, а не замок
- Уменьшить нагрузку на память Предполагая, что для поддержки синхронизации используются повторные блокировки, каждый узел должен наследовать AQS для поддержки синхронизации. Но не каждый узел нуждается в поддержке синхронизации, в синхронизации нуждается только головной узел связанного списка (корневой узел красно-черного дерева), что, несомненно, приносит огромную трату памяти.
- Получить поддержку JVM Ведь реентерабельные блокировки — это уровень API, и места для последующей оптимизации производительности мало. Synchronized напрямую поддерживается JVM, и JVM может выполнять соответствующие меры по оптимизации во время выполнения: огрубление блокировки, устранение блокировки, прокручивание блокировки и так далее. Это позволяет синхронизироваться для достижения повышения производительности при обновлении версии JDK без изменения кода.
9. Существует ли упорядоченный класс реализации Map, и если да, то как они обеспечивают упорядоченность?
Ни Hashmap, ни Hashtable не упорядочены. И TreeMap, и LinkedHashmap упорядочены. (TreeMap по умолчанию использует восходящий порядок ключей, LinkedHashmap по умолчанию использует порядок вставки данных) TreeMap основан на Comparator Comparator для достижения порядка. LinkedHashmap основан на связном списке для упорядоченной вставки данных.
10. Разница между абстрактным классом и интерфейсом: может ли класс наследовать несколько классов, может ли интерфейс наследовать несколько интерфейсов и может ли класс реализовывать несколько интерфейсов?
разница: 1, абстрактные классы и интерфейсы не могут быть созданы напрямую.Если вы хотите создать экземпляр, переменная абстрактного класса должна указывать на подобъекты, которые реализуют все абстрактные методы, а переменные интерфейса должны указывать на объекты класса, которые реализуют все методы интерфейса. 2. Абстрактные классы должны наследоваться подклассами, а интерфейс должен быть реализован. 3. Интерфейс можно только пробить, а абстрактный класс можно заставить объявить, и его тоже можно добиться. 4. Переменные, определенные в интерфейсе, могут быть только общими статическими константами, а переменные в абстрактном классе являются общими переменными. 5, метод абстракции в абстрактном классе должен быть реализован всеми подклассами, и если подкласс не может достичь абстрактного метода родительского класса, подкласс может быть только абстрактным классом. Точно так же при реализации интерфейса, если вы не реализуете интерфейсный метод, класс может быть только абстрактным классом. 6, метод абстракции может быть только объявлен и не может быть реализован. Абстрактная пустота ABC (); не может быть записана как Абстрактная пустота ABC () {}. 7, в абстрактном классе нет абстрактного метода 8. Если в классе есть абстрактный метод, то этот класс может быть только абстрактным классом. 9, абстрактный метод должен быть реализован, поэтому он не может быть статическим и не может быть частным. 10, интерфейс может наследовать интерфейс и может наследовать интерфейс, но класс может наследоваться только.
Класс не может наследовать от нескольких классов Интерфейс может наследоваться от нескольких интерфейсов Класс может реализовывать несколько интерфейсов
11. В чем разница между наследованием и агрегацией?
наследоватьОтносится к способности класса наследовать функции другого класса и добавлять свои новые функции. Наследование — это наиболее распространенная связь между классами и классами или интерфейсами и интерфейсами; в Java такие отношения определяются ключевым словом extends, которое четко обозначено.
полимеризация
Полимеризация отражается в отношениях «целое-часть», в настоящее время между частью и целым является отделимым, они могут иметь свой собственный жизненный цикл, например, отношения с процессором компьютерной компании и работником;
12, Модель IO, которая, NIO рассказывает о вашем понимании разницы между ним и био, AiO действителен, чтобы говорить о моделях реактора.
Разница между каждым IO:
что такое реактор?
- управляемый событиями
- Может обрабатывать один или несколько источников ввода
- Синхронно распределять входные события в соответствующий обработчик запросов (один или несколько) путем мультиплексирования через дескриптор службы.
13. Принцип отражения, каковы три способа создания экземпляра класса по отражению.
//创建Class对象的方式一:(对象.getClass()),获取类中的字节码文件
Class class1 = p1.getClass();
//创建Class对象的方式二:(类.class:需要输入一个明确的类,任意一个类型都有一个静态的class属性)
Class class3 = Person.class;
//创建Class对象的方式三:(forName():传入时只需要以字符串的方式传入即可)
//通过Class类的一个forName(String className)静态方法返回一个Class对象,className必须是全路径名称;
//Class.forName()有异常:ClassNotFoundException
Class class4 = Class.forName("cn.xbmchina.Person");
blog.csdn.net/l ian x U3344 / ...
14. В отражении Class.forName и ClassLoader отличаются.
Class.forName(className), метод, фактически вызываемый внутри, — это Class.forName(className,true,classloader); Второй логический параметр указывает, нужно ли инициализировать класс Class.forName(className) должен быть инициализирован по умолчанию. После инициализации запускается выполнение кода статического блока целевого объекта, и статические параметры также инициализируются снова. ClassLoader.loadClass(className), внутренне вызывается метод ClassLoader.loadClass(className,false); Второй логический параметр указывает, связан ли целевой объект, false означает отсутствие связи, как описано выше, Отсутствие связывания означает отсутствие последовательности шагов, включая инициализацию, тогда статические блоки и статические объекты не будут выполняться.
woo woo woo.cn blog on.com/Why not you/afraid/5…
15. Опишите несколько реализаций динамических агентов и укажите их соответствующие преимущества и недостатки.
Принципиальное отличие:
Динамический прокси-сервер Java использует механизм отражения для создания анонимного класса, реализующего интерфейс прокси-сервера, и вызывает InvokeHandler для его обработки перед вызовом определенного метода.
Динамический прокси-сервер cglib использует пакет с открытым исходным кодом asm, загружает файл класса класса прокси-объекта и генерирует подклассы, изменяя его байт-код.
1. Если целевой объект реализует интерфейс, динамический прокси JDK будет использоваться для реализации АОП по умолчанию. 2. Если целевой объект реализует интерфейс, вы можете принудительно использовать CGLIB для реализации АОП.
3. Если целевой объект не реализует интерфейс, необходимо использовать библиотеку CGLIB, и Spring автоматически преобразует динамический прокси JDK в CGLIB.
Как принудительно реализовать АОП с помощью CGLIB?
(1) Добавьте библиотеку CGLIB, SPRING_HOME/cglib/*.jar
(2) Добавьте
Разница между динамическим прокси JDK и генерацией байт-кода CGLIB? (1) Динамический прокси JDK может генерировать прокси только для классов, реализующих интерфейсы, но не для классов. (2) CGLIB — это прокси для классов, в основном для создания подкласса для указанного класса и переопределения методов в нем. Поскольку это наследование, лучше не объявлять класс или метод как final
16. Цель финала.
1. Класс, измененный с помощью final, не может быть унаследован 2. Метод, измененный final, не может быть переопределен. 3. Переменные, измененные с помощью final, не могут быть изменены (помните, что неизменной является ссылка на переменную, а не содержимое ссылки на объект). 4. Для методов, измененных final, JVM попытается встроить их, что очень важно для повышения эффективности Java. Поэтому, если вы можете быть уверены, что метод не будет унаследован, попробуйте определить метод как final.Подробнее см.методы оптимизации во время выполненияВстроенная часть метода 5. Константы, измененные с помощью final, будут храниться в пуле констант вызывающего класса на этапе компиляции.Подробнее см.механизм загрузки классовпоследняя часть иОбласть памяти Java
woo woo woo.cn blog on.com/Swiss Zhang/…
17. Напишите три реализации одноэлементного шаблона.
Голодный человек Формулы 1
public class EagerSingleton {
static {
System.out.println("EagerSingleton 被加载");
}
//私有化构造方法,限制直接构造,只能调用 getInstance() 方法获取单例对象
private EagerSingleton(){}
private static final EagerSingleton eagerSingleton=new EagerSingleton(); // 私有化静态 final成员,类加载直接生成单例对象,比较占用内存
public static EagerSingleton getInstance(){ //提供对外的公共api获取单例对象
return eagerSingleton;
}
}
Резюме: Особенности синглтона в стиле Hungry: В стиле Hungry создается экземпляр статического объекта при создании класса.Будет ли синглтон использоваться в дальнейшем, он будет занимать определенное количество памяти, но соответственно в первый раз Он также будет быстрее вызываться, потому что его ресурсы уже инициализированы.
2 Ленивец
public class LazySingleton {
static {
System.out.println("LazySingleton 被加载");
}
private LazySingleton(){} //私有化构造方法,限制直接构造,只能调用 getInstance() 方法获取单例对象
private static LazySingleton lazySingleton=null;//静态域初始化为null,为的是需要时再创建,避免像饿汉式那样占用内存
public static LazySingleton getInstance(){//提供对外的公共api获取单例对象
if(lazySingleton==null){
synchronized (LazySingleton.class){ //在getInstance中做了两次null检查,确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,同时避免了每次都同步的性能损耗
if(lazySingleton==null){
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
}
}
Резюме: потребление производительности с синхронизированными блокировками
3 Реализация статического внутреннего класса
public class IoDHSingleton {
static {
System.out.println("IoDHSingleton 被加载");
}
private IoDHSingleton(){} //私有化构造方法,限制直接构造,只能调用 getInstance() 方法获取单例对象
public static IoDHSingleton getInstance(){//提供对外的公共api获取单例对象
//当getInstance方法第一次被调用的时候,它第一次读取HolderClass.ioDHSingleton,内部类HolderClass类得到初始化;
//而这个类在装载并被初始化的时候,会初始化它的静态域,从而创ioDHSingleton 的实例,由于是静态的域,因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。
return HolderClass.ioDHSingleton;
}
private static class HolderClass{
static {
System.out.println("HolderClass 被加载");
}
private static IoDHSingleton ioDHSingleton = new IoDHSingleton();
}
// 防止反序列化获取多个对象的漏洞
private Object readResolve() throws ObjectStreamException {
return HolderClass.ioDHSingleton;
}
}
Преимущество этого шаблона в том, что метод getInstance не синхронизируется и выполняет только доступ к полю, поэтому ленивая инициализация не добавляет никаких затрат на доступ.
Рассмотрим отражение: Поскольку синглтон инициализируется только при вызове SingletonHolder.instance и посредством отражения, свойства внутреннего класса нельзя получить из внешнего класса. Так что эта форма — хороший способ избежать вторжения рефлексии. Рассмотрим многопоточность: Из-за характеристик статических внутренних классов они будут загружаться только при первом обращении к ним, поэтому их потокобезопасность может быть гарантирована. Суммировать: Преимущества: он учитывает оптимизацию памяти в ленивом режиме (инициализируется при использовании) и безопасность голодного режима (не подвергается вторжению при отражении). Недостаток: Для этого необходимо два класса.Хотя объект статического внутреннего класса не будет создан, объект класса все равно будет создан, и это постоянный объект.
блог woo woo woo.cn on.com/nian genyao0217/afraid/9…
18. Как автоматически завершить все реализации hashcode и equals для подклассов в родительском классе? Каковы плюсы и минусы этого.
Woohoo.ITeye.com/blog/Java - нет...
19. Пожалуйста, объедините концепцию объектно-ориентированного дизайна и расскажите о роли модификаторов доступа public, private, protected и default в дизайне приложения.
Модификатор доступа в основном указывает область действия изменяемого блока, что удобно для изоляции и защиты.
общедоступный: язык Java, самые широкие модификаторы ограничений доступа, широко известные как «общедоступные». По своим модифицированным классам, свойствам и методам можно не только обращаться по категориям, но и разрешать межпакетный (пакетный) доступ.
private: Самый узкий модификатор для ограничений доступа в языке Java, обычно называемый «private». Классы, свойства и методы, измененные им, могут быть доступны только объектам этого класса,Доступ к его подклассам невозможен, не говоря уже о межпакетном доступе..
Protect: модификатор доступа между открытым и закрытым, обычно называемый «защищенной формой». Доступ к измененным им классам, свойствам и методам возможен только из методов и подклассов самого класса,Доступен, даже если подклассы находятся в разных пакетах.
по умолчанию: то есть без какого-либо модификатора доступа, обычно называемого «режимом доступа по умолчанию». В этом режиме доступ разрешен только в пределах одного пакета.
20. Разница между глубоким и поверхностным копированием.
Неглубокая копия (неглубокая копия):
① Для переменной-члена, тип данных которой является базовым типом данных, неглубокая копия будет напрямую передавать значение, то есть копировать значение атрибута в новый объект. Поскольку это две разные части данных, изменение значения переменной-члена одного объекта не повлияет на данные, скопированные другим объектом. ②Для переменной-члена, тип данных которой является ссылочным типом данных, например, переменная-член является массивом, объектом определенного класса и т. д., то поверхностная копия будет передана по ссылке, то есть только ссылочное значение (адрес памяти) переменной-члена. Сделайте копию в новый объект. Потому что на самом деле переменные-члены обоих объектов указывают на один и тот же экземпляр. В этом случае изменение переменной-члена в одном объекте повлияет на значение переменной-члена в другом объекте.
Глубокая копия:
Во-первых, вводится понятие графа объектов. Представьте, что класс имеет объект, а его переменные-члены имеют другой объект, который указывает на другой объект, который указывает на другой объект, до определенного экземпляра. Это формирует граф объекта. Затем для глубокой копии необходимо не только скопировать значения всех переменных-членов базового типа данных объекта, но и подать заявку на место для хранения всех переменных-членов эталонного типа данных и скопировать объект на которые ссылается каждая переменная-член ссылочного типа данных, Все объекты, доступные до этого объекта. То есть для глубокой копии объекта требуется копия всего графа объектов!
Проще говоря, глубокая копия открывает место в памяти для всех объектов графа объектов переменных-членов ссылочного типа данных, тогда как поверхностная копия передает только адрес в точку, а новый объект не создает места в памяти для ссылочного типа данных. .
woo woo woo.cn blog on.com/shaking head…
21. Описание структуры данных с массивом и связанным списком, их соответствующая сложность времени.
Разница между массивом и связанным списком: 1. С точки зрения логической структуры: Массив должен иметь фиксированную длину (количество элементов), определенную заранее, и не может адаптироваться к динамическому увеличению или уменьшению данных. При увеличении данных оно может превышать изначально заданное количество элементов, при уменьшении данных память тратится впустую. Связанный список динамически распределяет память, может адаптироваться к динамическому увеличению и уменьшению данных и может легко вставлять и удалять элементы данных. (При вставке или удалении элементов данных в массиве необходимо переместить другие элементы данных) 2. Элементы массива находятся в области стека, а элементы связанного списка — в области кучи; 3. С точки зрения памяти: (Статические) Массивы выделяют место из стека, что удобно и быстро для программистов, но имеет небольшую степень свободы. Связный список выделяет пространство из кучи, которая имеет большую степень свободы, но ее сложнее использовать для управления. Массив расположен по индексу, временная сложность O(1), временная сложность элемента позиционирования связанного списка O(n); Временная сложность вставки или удаления элементов в массиве составляет O (n), а временная сложность связанного списка — O (1).
22. Разница между ошибкой и исключением, CheckedException, разница RuntimeException.
23. В вашем собственном коде, если вы создаете класс java.lang.String, может ли этот класс быть загружен загрузчиком классов? Почему.
24. Расскажите о своем понимании методов hashCode и equals в объекте java.lang.Object. В каких сценариях вам нужно повторно реализовать эти два метода.
Для equals() и hashcode() более общие правила: ① Два объекта, если equals() равны, hashCode() должен быть равен ② Два объекта, если hashCode() равен, equals() не обязательно равен
25. В jdk1.5 представлены дженерики Какие проблемы решают дженерики?
Объектно-ориентированное преобразование будет происходить только в родительских и дочерних классах с отношениями наследования (интерфейс также является своего рода наследованием). Upcasting: его основной целью является унификация параметров, и нет необходимости в принудительном преобразовании типов вообще. Downcasting: Для того, чтобы работать со специальными функциями, определенными подклассами, требуется принудительное преобразование типов, но проблема теперь в том, что downcasting на самом деле является очень небезопасной операцией, думая, что при компиляции программа не сообщит об ошибке, но при запуске, он сообщит об ошибке, которая является легендарно-загадочной ошибкой.
Однако после JDK1.5 была добавлена новая универсальная технология, которая в зародыше устранила упомянутую выше проблему нисходящей трансформации. Основное значение дженериков заключается в том, что при определении класса можно использовать тег. Этот тег представляет тип атрибутов или методов и параметров в классе. Когда тег используется, он динамически устанавливает тип.
26. Как HashSet работает внутри Java.
Внутренняя часть HashSet реализована с помощью HashMap. Поскольку Map требует ключ и значение, все ключи в HashSet имеют значение по умолчанию. Подобно HashMap, HashSet не допускает дублирования ключей, разрешен только один нулевой ключ, что означает, что в HashSet разрешено хранить только один нулевой объект.
27. Что такое сериализация, как сериализовать, зачем сериализация, какие проблемы возникнут при десериализации и как их решить.
Что такое сериализация? Сериализация: процесс преобразования объекта в последовательность байтов называется сериализацией объекта. Десериализация: процесс восстановления последовательности байтов в объект называется десериализацией объекта.
Когда требуется сериализация? Когда вы хотите сохранить состояние объекта в памяти в файл или базу данных; Когда вы хотите использовать сокеты для передачи объектов по сети; Когда вы хотите передать объекты через RMI;
Как реализовать сериализацию? Реализовать сериализуемый интерфейс
Меры предосторожности: Временные измененные свойства не будут сериализованы Статические статические свойства, он не сериализуется. При реализации этого Serializable интерфейса обязательно присвойте значение этому serialVersionUID.
Описание serialVersionUID: Среда выполнения сериализации связана с каждым сериализуемым классом с помощью номера версии, называемого serialVersionUID, который используется во время десериализации для проверки того, что отправитель и получатель сериализованного объекта загрузили один и тот же объект для объекта.Класы, совместимые с сериализацией. Если serialVersionUID класса объекта, загруженного получателем, отличается от номера версии соответствующего класса отправителя, десериализация приведет к InvalidClassException. Сериализуемый класс может явно объявить свой собственный serialVersionUID, объявив поле с именем «serialVersionUID» (которое должно быть статическим, окончательным длинным полем).
28. Новые возможности java8.
Блог Woohoo.cn на.com/Frank etc/Боюсь…