JAVA CORE Flashcards
Что такое класс Object?
Базовый клаасс джава от которого наследуются остальные классы в языке.
Какие в классe Object есть методы?
hashcode()
equals()
clone()
toString()
getClass()
finalize()
notify()
notifyAll()
wait()
Что такое метод equals(). Чем он отличается от операции ==.
equals по умолчанию сравниваются ссылки, а не
поля.
Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
Объект должен равняться себе самому.
Всегда должен быть равным такому же обьекту в обе стороны.
У них должен быть одинаковый хешкод
@Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj == null || obj.getClass() != this.getClass()) { return false; }
Если equals() переопределен, есть ли какие-либо другие методы, которые следует переопределить?
по умолчанию хешкод -адрес ячейки памяти смещенное на три…в старых версиях java, который сохр в переменную(т.е сслучайное число)…сейчас
Последовательность случайных чисел, генерируемая упомянутым алгоритмом, зависит от некоторого начального значения - если его не менять, то и числа будут одни и те же.
модификаторы доступа в Java
private - only class default - package protected - package & subclasses public - all
Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? А если protected? А сузить видимость?
модификатор доступа переопределенных методов дочерних классов может идти только в сторону расширения области видимости package->protected->public…а приватную переменную подкласс не увидит
Что означает ключевое слово final?
Для переменной - это станет константой
для метода - его нельзя переопределить
для класса - ему нельзя создать наследников
Имеет ли смысл объявлять метод private final?
метод final уже является private
Какие особенности инициализации final переменных?
- Если она static, то инициализация при первом обращении к этой переменной, либо при первом создании объекта такого класса.
- Если не static то инициализируются в конструкторе
Что будет, если единственный конструктор класса объявлен как final
Ошибочка компиляции
К каким конструкциям Java применим модификатор static
К методу.
К внутреннему классу.
К полю.
К импортируемым классам
Модификатор static и какие ограничения накладываются на методы?
Модификатор static говорит о том, что метод или поле класса принадлежат не объекту, а классу. Т.е. доступ можно будет получить и не создавая объекта класса
На методы, объявленные как static, накладывается ряд ограничений.
Они могут вызывать только другие статические методы.
Они должны осуществлять доступ только к статическим переменным.
Они не могут ссылаться на члены типа this или super.
Что будет, если в static блоке кода возникнет исключительная ситуация?
Если в явном виде написать любое исключение в static-блоке, то компилятор не скомпилирует исходники. Это все от того, что компилятор умный. В остальном, взаимодействие с исключениями такое же как и в любом другом месте.
Можно ли перегрузить static метод?
Перегрузить можно, но переопределить нельзя
Что такое статический класс, какие особенности его использования?
Это вложенный класс, который может обращаться только к статическим полям обертывающего его класса, в том числе и приватным. Доступ к нестатическим полям обрамляющего класса может быть осуществлен только через ссылку на экземпляр обрамляющего объекта. К классу высшего уровня модификатор static неприменим. public class Test { class A { } static class B { }
public static void main(String[] args) { /*will fail - compilation error, you need an instance of Test to instantiate A*/ A a = new A(); /*will compile successfully, no instance of Test is needed to instantiate B */ B b = new B(); }
}
Какие особенности инициализации final static переменных?
Переменные должны быть инициализированы во время объявления или в static блоке.
Дайте определение понятию “интерфейс”.
Ключевое слово interface используется для создания полностью абстрактных классов. Создатель интерфейса определяет имена методов, списки аргументов и типы возвращаемых значений, но не тела методов.
Наличие слова interface означает, что именно так должны выглядеть все классы, которые реализуют данный интерфейс. Таким образом, любой код, использующий конкретный интерфейс, знает только то, какие методы вызываются для этого интерфейса, но не более того.
Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
Интерфейс может содержать поля, но они автоматически являются статическими (static) и неизменными (final). Все методы и переменные неявно объявляются как public.
. Почему нельзя объявить метод интерфейса с модификатором final или static?
Final модификатор просто бессмысленный. Все методы по умолчанию абстрактные, т.е. их невозможно создать не реализовав где-то еще, но это нельзя будет сделать, если у метода идентификатор final.
Каким образом из вложенного класса получить доступ к полю внешнего класса?
Если вложенный класс не статический и поле не статическое, то можно просто обратиться к этому полю из внутреннего класса, если только у внутреннего класса не существует поля с таким же литералом, в этом случае нужно обращаться через ссылку на внешний класс так — OuterClass.this.имяПоля
Какие вы знаете способы запустить некоторое действие в отдельном потоке
Thread,Runnable
как запустить поток через Runnable
public class Program { public static void main(String[] args) { Thread potokB = new Thread(new Runnable()х { public void run() { System.out.println("Привет из побочного потока!"); } }); potokB .start();
class KodA implements Runnable { public void run() { System.out.println(“Привет из побочного потока!”); }
public class Program static KodA kodA; public static void main(String[] args) { kodA= new KodA (); Thread potokB = new Thread(kodA); potokB .start(); }}
как запустить поток через Thread
class AffableThread extends Thread{ @Override public void run()х { System.out.println("Привет из побочного потока!"); }}
public class Program{ static AffableThread mSecondThread;
public static void main(String[] args) { mSecondThread = new AffableThread(); mSecondThread.start(); }}
Завершение потока
public class ThreadClass extends Thread { boolean a=true; public void run(){ while(!a) //выключатель { Thread.sleep(1500); ///спим } Thread.Stop(); } }
Какие ключевые слова Java, связанные с многопоточностью Вы знаете?
Я много интересных слов знаю, расскажите лучше, что из этого вы используете на проекте
Для чего используется ключевое слово syhcronized?
Захватить монитор обьекта public void myMethod(){ private Object key = new Object(); synchronized (key) { System.out.println("Hi I'm synchronized block!"); }}
либо
synchronized void myMethod() {
System.out.println(“Hi I’m synchronized method!”);
}
Недостатком использования synchronized является как раз то, что другие потоки вынуждены ждать, пока нужный объект или метод освободится.
Есть некоторый метод, который исполняет операцию i++. Переменная i типа int. Предполагается, что код будет исполнятся в многопоточной среде. Следует ли синхронизировать блок?
Да. В противном случае будут race condition…значение будет не всегда актуальным
инкремент/декремент - не атомарные операции
Что служит в качестве mutex, если метод объявлен synchronized?
Экземпляр данного класса…он является тем самым семафором
Можно ли вызвать в разных потоках два synchronized метода одного и того же объекта
нет, второй поток будет ждать, отпущеного монитора
Для чего используется ключевое слово volatile?
Не используется кэш (имется ввиду область памети в которой JVM может сохранять локальную копию переменной, чтобы уменьшить время обращения к переменной) при обращении к полю.
Для чего используется ключевое слово transient?
Для указание того, что при сериализации/десериализации данное поле не нужно сериализовать/десериализовывать.
wait()
Приводит поток в ожидание, пока другой поток не вызовит notify() или notifyAll() методы для этого объекта. При этом все эти методы должны быть вызваны в блоке synchronized.
notify()
- просыпается один поток, который ждет на “мониторе” данного объекта.
notifyAll()
просыпаются все потоки, которые ждут на “мониторе” данного объекта.
Какие стандартные инструменты Java вы бы использовали для реализации пула потоков?
LinkedList, synchronized, wait(), notify()/notifyAll() и библиотеку по многопоточности
Какие виды исключений в Java вы знаете, чем они отличаются?
checked/unchecked. Если checked исключение не отлавливается, то это приводит к ошибке на этапе компиляции. Unchecked исключение - то, которое разработчик не должен допустить, т.к. имеет для этого возможность.
Если исключение потомок RuntimeException или Error, то это unchecked исключение. Если исключение потомок Exception (и не потомок RuntimeException), то это checked исключение.
Иерархия исключений
Throwable Error TrowableDeath VirtualMachineError OutOfMemory StackOverFlow Unknown Exception ReflectionOperationException SQLException IOException RuntimeException Выход за границы массива Null Не тот тип Деление на ноль и др. Ошибки арефметич
Всегда ли исполняется блок finally?
Только если поток ещё исполняется и JVM ещё работает к этому моменту.
Что такое finalize? Зачем он нужен? Что Вы можете рассказать о сборщике мусора и алгоритмах его работы.
Метод finalize() вызывается перед тем, как объект будет удален gc. Существует много различных реализаций gc. Основа работы следующая, gc помечает объекты на которых больше не ссылаются другие объекты для их удаления. Затем на одном из проходов помеченные объекты удаляются.
Вызов finalize() не гарантируется, т.к. приложение может быть завершено до того, как будет запущена ещё одна сборка мусора. Да, можно отменить сборку объекта с помощью метода finalize(), присвоив его ссылку какому-то статистическому мето
Почему метод clone объявлен как protected? Что необходимо для реализации клонирования?
Это сигнализирует о том, что хоть метод и есть в классе Object, но если им разработчик желает воспользоваться, то его нужно переопределить. Для этого нужно реализовать интерфейс Clonable, чтобы соблюсти контракт.
Сколько ключевых слов зарезервировано языком,
50, два из них не используются: const, goto;
Примитивы (byte, short, int, long, char, float, double, boolean)
Циклы и ветвления (if, else, switch, case, default, while, do, break, continue, for)
Исключения (try, catch, finally, throw, throws)
Области видимости (private, protected, public)
Объявление \ Импорт (import, package, class, interface, extends, implements, static, final, void, abstract, native)
Создание \ Возврат \ Вызов (new, return, this, super)
Многопоточность (synchronized, volatile)
instanceof, enum, assert, transient, strictfp, const, goto
Что значит слово “инициализация”?
С точки зрения Java — выделение памяти под объект,
преобразовании примитивных типов данных
один тип преобразуется в другой, если с расширением то норм, если в низ - то возможна потеря данных
значениями инициализируются переменные по умолчанию?
Числа инициализируются 0 или 0.0. Объекты (в том числе String) — null, char — \u0000; boolean — false;
Как передается значение переменной (по ссылке/значению)?
Java передает всё по значению. Java никогда не передает ничего по ссылке. Примитивы, ссылки, null — всё передается по значению, не по «ссылке».
: Когда передается параметр в метод, то параметр копируется в другую переменную и она передается в метод. Поэтому это и называется «передача по значению».
Передача по ссылке: Если мы передаем в метод ссылочный тип (объект), то так же происходит передача копии этого объекта (ссылки)
функция main
public static void main(String[] args) {/тело метода/ }
тернарный оператор выбора?
a=условие ? да : нет
унарные и бинарные арифметические операции
Унарные операции выполняются над одним операндом, бинарные — над двумя операндами, а также тернарные — выполняются над тремя операндами.
Примеры
+ - инкременты декременты и арифметические операции
switch
switch(a) { case 1: a++;break; case 2:a=0; break default: a=10;break; }
виды массивов вы знаете?
В Java — одномерные и многомерные массивы.
классы оболочки?
Для каждого примитивного типа есть соответствующий класс (Byte, Double, Float, Integer, Long, Short)
автоупаковка (boxing/unboxing)?
Это автоматическое преобразование из примитивных типов данных к ссылочным и наоборот.
Javac, jvm, jre что такое вообще это
javac - компилятор,
jvm - виртуалка для байт кода которая через JNI интерфейс взаимодействует с устройством
jre - среда выполнения - виртуалка + классы
Memory in JAVA
non heap метаинформация и кеш JVM
Stack area: Для каждого потока
PC Registers: Хранит адреса
текущих инструкций потока.
methods Area все информация о классе
Native method stacks информация о нативных методах.
heap Здесь хранится вся
информация об объектах.
heap in java
New Generation & Old Generation
New Generation Eden Space(heap) все создаваемые из программы объекты Если мы попробуем разместить ещё
объект, JVM обнаружит, что Eden полон
и надо провести чистку.
Tenured (Old) Generation (heap) — Здесь
скапливаются долгоживущие объекты
Survivor Space (heap) – сюда перемещаются объекты из предыдущей,
после того, как они пережили хотя бы одну сборку мусора
non heap in java
Permanent Generation (non-heap) – Здесь хранится метаинформация, используемая JVM (используемые классы, методы и т.п.). -XX:PermSize – задаёт минимальный -XX:MaxPermSize – задаёт максимальный размер
Code Cache (non-heap) — эта область используется JVM,
когда включена JIT-компиляция, в ней кешируется
скомпилированный платформенно — зависимый код
Существует 3 политики удержания
аннотации. Такие политики
инкапсулированы в перечисление
java.lang.annotation.RetentionPolicy.
Аннотации с политикой SOURCE
содержаться только в исходном файле и
отбрасываются при компиляции.
Аннотации с политикой Class
сохраняются в файле, однако они
недоступны JVM во время выполнения.
Аннотации с политикой удержания RUNTIME
сохраняются в файле во время компиляции и остаются
доступными JVM во время выполнения.
Отличие soap от rest
По русски: rest более прост. А soap
более типизирован для защиты
данных как java через потокобезопасность и транзакционность
SOAP активно использует XML для кодирования запросов и ответов, а также
строгую типизацию данных, гарантирующую их целостность при передаче между
клиентом и сервером. С другой стороны, запросы и ответы в REST могут
передаваться в ASCII, XML, JSON или любых других форматах, распознаваемых
одновременно и клиентом, и сервером. Кроме того, в модели REST отсутствуют
встроенные требования к типизации данных. В результате пакеты запросов и
ответов в REST имеют намного меньшие размеры, чем соответствующие им пакеты
SOAP.В модели SOAP уровень передачи данных протокола HTTP является
«пассивным наблюдателем», и его роль ограничивается передачей запросов SOAP от
клиента серверу с использованием метода POST. Детали сервисного запроса, такие
как имя удаленной процедуры и входные аргументы, кодируются в теле запроса.
Архитектура REST, напротив, рассматривает уровень передачи данных HTTP как
активного участника взаимодействия, используя существующие методы НТТР, такие
как GET, POST, PUT и DELETE, для обозначения типа запрашиваемого сервиса.
Следовательно, с точки зрения разработчика, запросы REST в общем случае более
просты для формулирования и понимания, так как они используют существующие и
хорошо понятные интерфейсы HTTP.Модель SOAP поддерживает определенную
степень интроспекции, позволяя разработчикам сервиса описывать его API в файле
формата Web Service Description Language (WSDL, язык описания веб-сервисов).
Создавать эти файлы довольно сложно, однако это стоит затраченных усилий,
поскольку клиенты SOAP могут автоматически получать из этих файлов подробную
информацию об именах и сигнатурах методов, типах входных и выходных данных и
возвращаемых значениях. С другой стороны, модель REST избегает сложностей
WSDL в угоду более интуитивному интерфейсу, основанному на стандартных методах
HTTP, описанных выше.В основе REST лежит концепция ресурсов, в то время как
SOAP использует интерфейсы, основанные на объектах и методах. Интерфейс SOAP
может содержать практически неограниченное количество методов; интерфейс
REST, напротив, ограничен четырьмя возможными операциями, соответствующими
четырем методам HTTP.
CleanCode
нет лишнего кода
Строка между логическими блоками
Классы и Интерфейсы - название в виде CamelCase
Методы и переменные- название в виде сamelCase
Константы - static final переменные, ЗАГЛАВНЫМИ_БУКВАМИ с андерскопом
строки 80 символов
Как можно более короткий код
///подделки(XXX ) и сломанное(FIXME )/ todo для дел
названия переменных. Говорящие четкие и однозначные
метод 40 строк
///массивы с разнотипными данными заменить на обьекты
Защита от SQL иньекций
приходящие на REST
числа - передай в значение целочисленного типа
экранируй кавычки
public static String addSlashes(String s) { s = s.replaceAll("\\\\", "\\\\\\\\"); s = s.replaceAll("\\n", "\\\\n"); s = s.replaceAll("\\r", "\\\\r"); s = s.replaceAll("\\00", "\\\\0"); s = s.replaceAll("'", "\\\\'"); return s; }
что такое инлайн функция
это функция которая компилируеться джит-компилятором
она выполняеться очень быстро
что нужно сделать чтобы функция с большой вероятностью стала инлайн функцией
В общем если метод файнал и в нем менее 25 операций то он может быть инфйн
Что будет если реализовать метод clone() у объекту с final полем
Ошибка CloneNotSupportedException
Какие есть способы клонировать объект?
- Переопределение метода clone() и реализация интерфейса Cloneable();
- Использование конструктора копирования;
- Использовать для клонирования механизм сериализации
В чем недостаток clone()?
clone() подразумевает, что вы будете использовать механизм так называемого «поверхностного клонирования» и сами позаботитесь о клонировании полей-объектов. Метод clone() в родительском классе Object является protected, поэтому требуется переопределение его с объявлением как public. Он возвращает экземпляр объекта с копированными полями-примитивами и ссылками. И получается что у оригинала и его клона поля-ссылки указывают на одни и те же объекты.
Где ошибка ? class A {} class B { public B(){ System.out.println("A"); super.A(); } }
super.A() - конструктор суперкласса должен вызываться первой строчкой в конструкторе наследника.
Что делает метод String.intern()?
Когда метод intern() вызван, если пул строк уже содержит строку, эквивалентную к нашему объекту, что подтверждается методом equals(Object), тогда возвращается ссылка на строку из пула. В противном случае объект строки добавляется в пул и ссылка на этот объект возвращается. Этот метод всегда возвращает строку, которая имеет то же значение, что что и текущая строка, но гарантирует что это будет строка из пула уникальных строк. Ниже приведен пример работы метода intern() public class StringPool { public static void main(String[] args) { String a = "string a"; String b = new String("string a"); String c = b.intern();
System.out.println(a == b); System.out.println(b == c); System.out.println(a == c); } } Программа выведет следующее: false false true
Есть 2 объекта . REF0 != REF1; Может ли быть REF0.equals(REF1) = true;
Да, если переопределить equals
Checked\Unchecked Exception
checked exception = проверяемое исключение, проверяемое компилятором, его нужно либо обрабатывать либо пробрасывать дальше.
Throwable и Exception и все их наследники (за исключением наследников Error-а и RuntimeException-а) — checked
— Error и RuntimeException и все их наследники — unchecked
Расскажите о классах загрузчиках
базовый загрузчик(из $java.home/lib)
загрузчик расширений(из $java.home/lib/ext)
системный загрузчик все классы в classPath
Unicode что такое
стандарт кодирования символов, включающий в себя знаки почти всех письменных языков мира.
Стандарт состоит из двух основных частей: универсального набора символов (англ. Universal character set, UCS) и семейства кодировок (англ. Unicode transformation format, UTF).
Конструкторы и методы класса BufferedWriter BufferedWriter(Writer) close() flush() newLine() write()
BufferedWriter(Writer) // Создает буферный поток ввода символов который использует размер буфера по умолчанию. close() закрыть flush() записать буфер в файл newLine() // перенос на новую строку write() запись в буфер
Конструкторы и методы класса FileWriter FileWriter(File) FileWriter(String) close() flush() write()
FileWriter(File) конструктор из File
FileWriter(String) конструктор из имени фала
close() закрывает поток
flush() записывает оставшиеся буферные данные в файл.ставить перед закрытием
write() пишет, как посимвольно так и строкой
Конструкторы и методы класса BufferedReader
BufferedReader(Reader)
read()
readLine()
BufferedReader(Reader in) // Создает буферный поток ввода символов который использует размер буфера по умолчанию.
int read() // прочитать буфер
readLine()// следующая строка
КОнструкторы и методы класса FileReader
FileReader(File)
FileReader(String)
read()
FileReader(File file) конструктор по файлу
FileReader(String fileName) конструктор по имени
public int read() throws IOException Читает один символ. Возвращает int, который представляет прочитанный символ.
КОнструкторы и методы класса File File(File, String) File(String) File(String, String) createNewFile() delete() exists() isDirectory() isFile() list() mkdir() renameTo()
File(File parent, String child)Конструктор создает
новый экземпляр файла из родительского абстрактного пути и строки дочернего пути.
File(String pathname)
File(URI uri)
createNewFile() создает если нет delete() удаляет isDirectory() наличие директории isFile()наличие файла exists()провеоряет нличие файла\каталога list() список обьектов в каталоге ()массив строк mkdir()создать директорию renameTo() переименовать
array.deepToString
вывести весь массив
Порядок загрузки классов и иницализации обьектов
читается файл *.class
проверяется на корректность
создается представление в памяти
грузятся суперклассы
грузятся суперинтерфейсы
линкуются все классы для обращений между собой
инициализируется ленивая\энергичная загрузка(то что выбрал разработчик)
код интерпретируется в jvm команды либо CPU(зависит от компилятор JIT налету, Aot перед использованием)
инициализируются другие классы
вызов полей и методов
чем занимается JVM
организует доступ к классам в памяти(heap,создает удаляет представления классов
управляет потоками и синхронизирует(java.io.Input\ouput Stream абстрактные - а потом реализуют куда слать)
обеспечивает функционирование монитора toolInterface
JNI интерфейс доступа к внешним устройствам(через него Awt написана)
грузит классы загрузчика
ПОрядок инициализации обьекта
Static Super Static Public super super constructor public constructor
сериализация
Сериализация это процесс сохранения состояния объекта в последовательность байт; десериализация это процесс восстановления объекта, из этих байт. Java Serialization API предоставляет стандартный механизм для создания сериализуемых объектов.
недостатки сериализации
Библиотека Serializable уступает в скорости работы практически всем другим способам сохранения и восстановления данных. пишется довольно много служебной информации, в результате чего файлы получаются значительно больше того объема, который требуется для хранения самих данных.Самый важный недостаток этого метода заключается в том, что он способен работать только с полями.
структуры данных
это все что наследуется от интерфейса collection