Академический Документы
Профессиональный Документы
Культура Документы
Вопросы Для Подготовки к Собеседованию
Вопросы Для Подготовки к Собеседованию
12. Как правильно сравнить две строки в Java игнорируя регистр букв?
20. Что дает типу String то, что его сделали immutable?
23. Зачем использовать ключевое слово final при создании анонимных классов?
37. Можно ли создать объект внутреннего класса, если у внешнего класса только
private конструктор?
52. В какие состояния может перейти нить, при входе в блок synchronized?
57. Три нити в блоке synchronized вызвали wait() у объекта-мютекса. В какое состояние
перейдут эти нити, если четвертая нить вызовет notifyAll()?
126. Что произойдет, если поместить оператор return или System.exit () в блок
try/catch/finally?
131. Что вернет выражение 1.0/0.0? Приведет ли оно к генерации исключения или
ошибке при компиляции?
132. Что будет, если попытаться вставить в HashMap уже имеющийся в ней ключевой
объект?
Ответы.
boolean equals(Object)
int hashcode()
String toString()
Object clone()
Class getClass()
void finalize()
void notify()
notifyAll()
Метод equals() используется для глубокого сравнения двух объектов, которое обычно
включает в себя сравнение всех полей между собой. Метод hashcode() используется
для быстрого сравнения двух объектов, потому что сравнить два целых числа проще,
чем все поля, некоторые из которых тоже могут быть объектами. Чаще всего
сравнение по хэшкодам используется в коллекциях для ускорения нахождения
необходимого элемента. Сначала объект ищется по хэшкоду, а потом, если объектов с
таким хэшкодом несколько, с помощью метода equals(). Объекты, которые
различаются между собой хоть немного, должны выдавать false при сравнении друг с
другом с помощью equals(). Все объекты, которые имеют одинаковые поля, должны
выдавать true при сравнении их хэшкодов.
Недостатки:
- нет гарантии, что он будет вызван, т.к. где-то может остаться ссылка на объект.
- нет гарантии на то, в какое время будет вызван метод, так как он не вызывается
сразу, а помещается в очередь, которая обрабатывается специально созданным для
этого потоком. В очередь на финализацию попадают только те объекты, в которых
переопределен метод finalize.
- есть вероятность, что этот метод не будет вызван совсем. Это может произойти в
момент, когда объект уже станет доступным для сборщика мусора и программа
завершит свою работу.
Для освобождения ресурсов рекомендуется использовать конструкции try - catch -
finally или try-with-resourses.
Метод sleep (long millis) является статическим методом класса Thread, метод wait(long
timeoutMillis) является методом класса Object и может быть вызван для любого
объекта, но только в блоке synchronized. В случае с wait(1000) нить может проснутся
раньше, если получит уведомление об освобождении ресурса, вызванное с помощью
notify() или notifyAll(). Также wait() освобождает те ресурсы, с которыми работала нить.
В первом случае (i++) инкрементирование произойдет после того, как значение i будет
использовано в каком-либо выражении. Во втором случае (++i) переменная сначала
инкрементируется, а потом ее значение используется в выражении.
С помощью метода equals(). В классе String данный метод переопределен так, что
сравнивает не ссылки, а последовательность символов в строках.
String s = "cat";
12. Как правильно сравнить две строки в Java игнорируя регистр букв?
String s = "cat";
list.add("zas");
list.add("fas");
list.add("sd");
list.add("asdg");
Collections.sort(list);
В кодировке UTF-16
while (tokenizer.hasMoreTokens())
System.out.println(token);}
new StringBuilder().append("A").append("b").append("C").toString();
20. Что дает типу String то, что его сделали immutable?
-String широко используется, как параметр для многих классов Java, в частности для
открытия сетевых соединений, подключений к БД, открытию файлов и пр. И если бы
строка изменялась, то мы могли получить доступ к объекту (файлу например), на
который мы имеем право, затем изменить строку с именем (случайно или намеренно)
и получить доступ уже к другому файлу.Так же String используется в механизме
загрузки файлов, и это – фундаментальный аспект. И если бы строка изменялась, то
запрос на загрузку "java.io.Writer" мог бы быть изменён на "DiskErasingWriter".
- Из-за того, что строка не изменяется, она кэширует свой хэшкод и не вычисляет его
каждый раз, когда мы его вызываем, что делает строку очень быстрой как ключ для
hashmap.
- Локальные
- Анонимные
23. Зачем использовать ключевое слово final при создании анонимных классов?
Да.
...
};
4)не может иметь статических полей, методов, классов (за исключением финальных);
37. Можно ли создать объект внутреннего класса, если у внешнего класса только
private конструктор?
Можно. Если мы объявим внутренний класс как private, доступ к созданию объектов у
нас будет только внутри обрамляющего класса.
Да.
Класс ThreadGroup представляет собой набор нитей, которые могут содержать в себе
другие группы нитей. Группа нитей образует дерево, в котором каждая другая группа
нитей имеет родителя (кроме исходной). Поток имеет право доступа к данным из
своей группы нитей, но не имеет такого доступа к другим группам или к родительской
группе потоков.
http://java-online.ru/concurrent-atomic.xhtml
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());
......
Если требуется создать новые потоки по мере надобности или повторно использовать
предыдущие потоки, если они свободны.
service.submit(new Runnable() {
});
52. В какие состояния может перейти нить, при входе в блок synchronized?
В RUNNABLE, если блок кода, помеченный synchronized, не занят другой нитью. Иначе
- в BLOCKED, после чего будет ждать освобождения объекта-мютекса.
Метод wait является методом класса Object. Его можно вызвать только внутри блока
synchronized у объекта-мютекса, который был заблокирован текущей нитью, в
противном случае метод выкинет исключение IllegalMonitorStateException. В
результате вызова этого метода, блокировка с объекта-мютекса снимается, и он
становится доступен для захвата и блокировки другой нитью. При этом нить переходит
в состояние WAITING для метода wait() без параметров, но в состояние
TIMED_WAITING для метода wait(timeout).
TIMED_WAITING
57. Три нити в блоке synchronized вызвали wait() у объекта-мютекса. В какое состояние
перейдут эти нити, если четвертая нить вызовет notifyAll()?
При вызове join(500) текущая нить будет ожидать 500 миллисекунд завершения нити,
чей метод join() был вызван. Текущая нить может освободиться и раньше, если другая
нить закончит свое выполнение.
asList(T... a)
int hashCode(type[] a)
compare(type[] a, type [] b)
hashCode( type[] a)
sort( type[] a)
toString( type[] a)
...................
63. Как называется сортировка, которая используется при вызове Collections.sort()?
Сортировка слиянием.
https://habr.com/ru/post/277669/
https://habr.com/ru/company/luxoft/blog/157273/
Class ConcurrentHashMap<K,V>
Class Semaphore
Class CopyOnWriteArrayList<E>
Class ReentrantLock
x = 1;
y = 2;
2. лок на мониторе устанавливается только после того как он был освобожден на этом
же самом мониторе. То есть лок не может быть захвачен другой нитью до тех пор пока
нить, захватившая его, полностью не освободила лок. Иначе смысл лока теряется. К
примеру, вторая нить захватила лок, пока первая его держит. И тут первая
освобождает лок, который все еще нужен второй. Таким образом лок освобождается у
обеих нитей и третья нить может установить свой лок. В итоге белиберда. 3. Примерно
тоже самое что и в п.2. То есть войти в синхронизированный блок возможно только
после того как блок был освобожден другой нитью, фактически когда был полностью
снят лок. 4. Запись поля volatile всегда полностью завершается перед тем как кто-то
его попытается прочитать. 5. Перед тем как нить присоединиться и будет ожидать
другую нить она должна завершить свое выполнение. Было бы не логичным ожидать
завершение в рабочем состоянии. Тоже самое касаемо установки проверки isalive.
Флаг завершения нити устанавливается только после того как нить завершила свою
работу полностью. 6. Ну тут нам все время долбили, что start должен быть в начале.
То есть вызов run не запускает нить, а старт запускает нить и запускает run. 7.
Конструктору дают время на создание нити в любом случае. То есть даже если
вызовется finalize конструктор все равно отработает. Не спрашивайте меня как это
может произойти, я не знаю :) 8. если для нити вызывается interrupt() то она увидит что
вызов пришел только после того как он реально пришел. Возможно этот пункт как-то
перекликается с тем, что wait() надо помещать в цикл. То есть виртуальная машина
сама может чото нагенерить и потом отменить в плане вызова interrupt().
69. Что такое «барьер» в канкаренси?
https://www.codeflow.site/ru/article/java-cyclic-barrier
- Потокобезопасность
1. Элементы карты
final K key;
volatile V value;
@SuppressWarnings("unchecked")
}
2. Хэш-функция
h ^= (h >>> 10);
h += (h << 3);
h ^= (h >>> 6);
3. Сегменты
Карта делится на N различных сегментов (16 по умолчанию, максимальное значение
может быть 16-битным и представлять собой степень двойки). Каждый сегмент
представляет собой потокобезопасную таблицу элементов карты.
Serializable {
loadFactor = lf;
}
...
4. ConcurrencyLevel
|| concurrencyLevel <= 0)
concurrencyLevel = MAX_SEGMENTS;
int sshift = 0;
int ssize = 1;
++sshift;
ssize <<= 1;
segmentShift = 32 - sshift;
segmentMask = ssize - 1;
initialCapacity = MAXIMUM_CAPACITY;
++c;
int cap = 1;
cap <<= 1;
Количество сегментов будет выбрано как ближайшая степень двойки, большая чем
concurrencyLevel. Ёмкость каждого сегмента, соответственно, будет определяться как
отношение округлённого до ближайшей большей степени двойки значения ёмкости
карты по умолчанию, к полученному количеству сегментов. Очень важно понимать две
следующие вещи. Занижение concurrencyLevel ведёт к тому, что более вероятны
блокировки потоками сегментов карты при записи. Завышение показателя ведёт к
неэффективному использованию памяти. Если лишь один поток будет изменять карту,
а остальные будут производить чтение — рекомендуется использовать значение 1.
Итого:
Вместо него в Java используется break с меткой, имеющий следующую общую форму:
break label; Здесь label — имя метки, которая идентифицирует некоторый блок кода.
Когда эта форма break выполняется, управление передается из именованного блока
кода (чья метка указана в операторе break) на следующий за этим блоком оператор.
javac fileName.java
https://javarush.ru/groups/posts/2318-kompiljacija-v-java
https://habr.com/ru/post/125210/
79. Как запустить java-файл из консоли?
java fileName
https://javarush.ru/groups/posts/2318-kompiljacija-v-java
package src;
package src;
new File("c:/doc/release/com/javarush/test").mkdirs();
System.out.println(Arrays.toString(f.listFiles()));
return name.toLowerCase().endsWith(".doc");
);
System.out.println(Arrays.toString(docs));
Методы:
boolean offer(E e, long timeout, TimeUnit unit) - Размещение элемента в очереди при
наличии свободного места; при необходимости определенное ожидание времени, пока
не освободиться место.
В зависимости от программы.
Дело в том, что notify может вызвать кто угодно. Просто по ошибке, от которой никто
не застрахован. Если поток ждет выполнения некоторого условия – вариант с while
надежнее. Если поток пустили по ошибке – он опять проверит условие и, если надо,
будет ждать дальше.
https://habr.com/ru/post/440590/
Это модель памяти в Java — (Java Memory Model), которая предоставляет некоторые
правила для написания корректного многопоточного кода.
- Модель happens-before
thG.enumerate(temp);
https://coderoad.ru/1323408/Получить-список-всех-потоков-запущенных-в-данный-
момент-в-Java
Т.к. cсылка на нить удаляется из группы после выполнения и у нити удаляется ссылка
на группу, после того как нить завершиться, можно понять, что, не подготовившись
заранее, нельзя получить список завершенных нитей, группа о них уже не помнит, как
и они о ней.
https://javarush.ru/groups/posts/1328-kak-poluchitjh-spisok-mertvihkh-nitey-iz-gruppih-
threadgroup-level-28?post=full#discussion
executorservice
forkjoinpool
newfixedthreadpool
threadpooltaskexecutor
scheduledthreadpoolexecutor
https://ru.wikipedia.org/wiki/Фабричный_метод_(шаблон_проектирования)#Java
ThreadGroup – это класс, который управляет группами нитей. Такой подход сделан для
того, чтобы нить не могла останавливать и прерывать все нити подряд, а могла
оказывать влияние только на те нити, которые содержатся в той же группе, что и она.
группа main
Паттерн ThreadPool общими словами - группа потоков, которые решают группы задач.
Задачи организованы в очередь. Как только поток завершает работу над задачей, он
запрашивает следующую задачу из очереди, до тех пор, пока все задачи в очереди не
будут выполнены. После этого поток может завершиться, либо уснуть, до тех пор, пока
в очереди не появятся новые задачи.
//Способ 1
@Override
//Способ 2
@Override
System.out.println(Thread.currentThread().getName());
//Способ 3
@Override
return Thread.currentThread().getName();
//Способ 3
}
}
Для того, чтобы узнать, завершилось ли уже выполнение задачи, а также, чтобы
получить результат ее выполнения.
Autoboxing происходит:
Immutable
Метод valueOf() или через конструктор (н-р, new Integer(10)) чтобы преобразовать
примитивные типы в непримитивные.
Примитивные типы сравниваются с помощью операторов >, <, >=, <=, ==. Классы-
обертки сравниваются с помощью методов equals() и compareTo(). Если сравнивается
примитивный и непримитивный тип с помощью вышеперечисленных операторов, то
перед сравнением будет распаковано значение из непримитивного типа.
- Character - от 0 до 127
Это алгоритм для кодирования двоичных данных при помощи только 64 символов
ASCII. Алфавит кодирования содержит текстово-цифровые латинские символы A-Z, a-
z и 0-9 (62 знака) и 2 дополнительных символа, зависящих от системы реализации.
Каждые 3 исходных байта кодируются 4 символами (увеличение на ¹⁄₃). Эта система
широко используется в электронной почте для представления бинарных файлов в
тексте письма (транспортное кодирование).
126. Что произойдет, если поместить оператор return или System.exit () в блок
try/catch/finally?
Блок finally будет выполняться при помещении оператора return в блок try/catch, и не
будет выполняться при вызове из блока try/catch оператора System.exit ().
Можно.
131. Что вернет выражение 1.0/0.0? Приведет ли оно к генерации исключения или
ошибке при компиляции?
132. Что будет, если попытаться вставить в HashMap уже имеющийся в ней ключевой
объект?
Выражение Результат
n ÷ ±Infinity 0
±Infinity × 0 NaN
-выбор битов из IP-адреса для адресации подсети (см. маска подсети) 255.255.224.0
При использовании && с типами boolean правая часть выражения вычисляется, только
если левая часть дает результат true. Иначе правая часть не вычисляется, т.к. всё
выражение становится false вне зависимости от правой части. Т.е. происходят
ленивые вычисления.
ZipEntry entry;
String name;
while((entry=zin.getNextEntry())!=null){
zin.closeEntry();
zout.putNextEntry(entry1);
int size;
zout.write(buffer);
либо
Files.copy(path, zout);
zout.closeEntry();
zos.putNextEntry(entry);
Files.copy(path, zos);
zos.closeEntry();
if (Files.isRegularFile(path)) {
zos.putNextEntry(entry);
Files.copy(path, zos);
} else if (Files.isDirectory(path)) {
zos.putNextEntry(entry);
zos.closeEntry();
@Override
pathList.add(file);
@Override
pathList.add(dir);
if (!Files.exists(path)) {
Files.createDirectories(Paths.get(path.toString().substring(0,
path.toString().lastIndexOf("\\") + 1)));
или
int size;
fos.write(buffer, 0, size);
- Files.readAllLines(Path path, Charset cs) для чтения всех строк файла в List<String>;
Объект File может указывать на каталог (узнать это можно путем вызова метода
isDirectory ). Метод list возвращает список имен (массив String ) содержащихся в нем
файлов (если объект File не указывает на каталог – будет возвращен null ).
Методом toPath().
Files — это утилитный класс, куда были вынесены статические методы из класса File
(по аналогии с Arrays или Collections). Он сосредоточен на управлении файлами и
директориями.
out.putNextEntry(new ZipEntry("myfolder/"));
e.printStackTrace();
Например,
Файл data.properties
directory=c:/text/downloads
email=zapp@javarush.ru
Каждая строка файла обычно содержит один «параметр», который состоит из пары
объектов строкового типа «ключ» (имя параметра) — «значение», записанной в одном
из следующих форматов: ключ=значение, ключ = значение, ключ:значение и ключ :
значение.
Никак, не прочитав предыдущие 9999 строк, или не зная номер байта начала этой
строки.
writer.write("Строка");
registry.lookup(String name);
https://habr.com/ru/post/185710/
170. Распространённые RMI ошибки?
https://docs.oracle.com/javase/9/docs/specs/rmi/exceptions.html
RandomAccessFile создаст пустой файл и запишет в него данные. Если создать файл
не получится, то будет выкинуто исключение FileNotFoundException.
Данный класс также можно использовать для записи информации в поток вывода.
Remote Method Invocation – это механизм, который позволяет объекту в одной Java-
машине вызывать методы объекта в другой Java-машине, даже если они находятся на
разных компьютерах.
https://ru.wikipedia.org/wiki/RMI
@JsonAutoDetect
class Cat
Cat(){}
cat.name = "Murka";
cat.age = 5;
cat.weight = 4;
mapper.writeValue(writer, cat);
System.out.println(result);
@JsonAutoDetect
class Cat {
Cat() {}
JAXB – это многофункциональный фреймворк для работы с XML, который, как и JSON,
часто применяется при пересылке данных между разными программами и
компьютерами.
- jaxb-api
- jaxb-runtime
- javax.activation
* @XmlRootElement указывает на то, что этот объект может быть «корнем дерева»
элементов
* в XML. Т.е. быть элементом самого верхнего уровня, все остальные элементы лежат
в нем.
*/
@XmlType(name = "cat")
@XmlRootElement
class Cat{
Cat(){}
}
public static void main(String[] args) throws JAXBException
cat.name = "Murka";
cat.age = 5;
cat.weight = 4;
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// сама сериализация
marshaller.marshal(cat, writer);
System.out.println(result);
Вывод:
<cat>
<name>Murka</name>
<age>5</age>
<weight>4</weight>
</cat>
@XmlType(name = "cat")
@XmlRootElement
class Cat{
Cat(){}
}
187. Аннотации в JAXB?
https://www.codeflow.site/ru/article/jaxb
https://docs.oracle.com/javaee/7/api/javax/xml/bind/annotation/package-summary.html
https://fasterxml.github.io/jackson-databind/javadoc/2.4/
189. Документация по JAXB?
https://javaee.github.io/jaxb-v2/doc/user-guide/ch03.html
https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/package-frame.html
https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/package-frame.html
https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/util/package-frame.html
System.out.println(cat);
System.out.println(cat.cats.getClass());
class Cat {
@JsonDeserialize(as = LinkedList.class)
}
Аннотация @JsonDeserialize(as = LinkedList.class) означает, какую реализацию
интерфейса List использовать. В случае, если тип данных в List тоже интерфейс, то в
аннотации также можно указать еще и тип параметр.
- выделить некоторое поле, которое используется для того, чтобы отличать один тип
от другого. Если его нет – его заводят.
cat.name = "Murka";
cat.age = 5;
dog.name = "Killer";
dog.age = 8;
house.pets.add(dog);
house.pets.add(cat);
mapper.writeValue(writer, house);
System.out.println(writer.toString());
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property="type")
@JsonSubTypes({
@JsonSubTypes.Type(value=Cat.class, name="cat"),
@JsonSubTypes.Type(value=Dog.class, name="dog")
})
class Pet {
class House {
Вывод:
"pets" : [
]
}
- Jackson
- Genson
- Gson
- LoganSquare (основан на Jackson's streaming API)
- Alibaba Fastjson
- SAX
- DOM
- Stax
- JAXB
http://www.edankert.com/jaxpimplementations.html
https://nsergey.com/jackson-annotations/
196. Какие аннотации JAXB вы знаете?
https://www.codeflow.site/ru/article/jaxb
https://docs.oracle.com/javaee/7/api/javax/xml/bind/annotation/package-summary.html
https://habr.com/ru/post/31225/
DTO (Data Transfer Object) - объект, который создается с целью быть использованным
при транспортировке данных. Обычно к таким объектам два требования: а) уметь
хранить данные, б) уметь сериализоваться. Т.е. их используют только для пересылки
данных.Создал объект, записал в него нужные данные из бизнес-логики, сериализовал
в JSON/XML и отправил куда-надо. Или наоборот – пришло сообщение –
десериализовал его в DTO-объект и вытягивай из него данные."
Основа для сборки мусора не подсчет ссылок, а разделение объектов на два вида —
достижимые и недостижимые. Объект считается достижимым (живым), если на него
ссылается другой достижимый (живой) объект. Достижимость считается от нитей.
Работающие нити всегда считаются достижимыми (живыми), даже если на них никто
не ссылается.
Все объекты в Java хранятся в специальной области памяти, которая называется куча
(heap). Все объекты в программах можно разделить на два типа — условно говоря,
простые объекты и “долгожители”. “Долгожителями” считаются объекты, пережившие
много сборок мусора. Чаще всего они будут существовать до конца работы
программы. В итоге общая куча, где хранятся все созданные объекты, была разделена
на несколько частей.
Первая часть имеет красивое название — Eden (библ. “Райский сад”), куда объекты
попадают после их создания. Именно в этой части выделяется память для новых
объектов, когда мы пишем new. Объектов может создаться много, и когда в этой
области заканчивается место, начинается первая, “быстрая” сборка мусора. Надо
сказать, что сборщик мусора очень умен и выбирает алгоритм работы в зависимости
от того, чего в куче больше — мусора или рабочих объектов. Если почти все объекты
являются мусором, сборщик помечает “живые” объекты и переносит их в другую
область памяти, после чего текущая область очищается полностью. Если же мусора
мало и большую часть занимают живые объекты, он помечает мусор, очищает его, а
остальные объекты компонует.
Область памяти, куда переносятся все объекты, пережившие хотя бы одну сборку
мусора, называется Survival Space (“место для выживших”). Survival Space в свою
очередь делится на поколения. Каждый объект относится к своему поколению в
зависимости от того, сколько сборок мусора он пережил. Если одну — он относится к
“Поколению 1”, если 5 — к “Поколению 5”. Вместе Eden и Survival Space образуют
область под названием Young Generation (“молодое поколение”).
G1 Garbage Collector
Z garbage collector
Объект, на который ссылаются только мягкие ссылки, может быть удален сборщиком
мусора, если программе не хватает памяти. Если программе вдруг не хватает памяти,
прежде чем выкинуть OutOfMemoryException, сборщик мусора удалит все объекты, на
которые ссылаются мягкие ссылки и попробует выделить программе память еще раз.
Объект, который удерживает от смерти только SoftReference может пережить сколько
угодно сборок мусора и скорее всего, будет уничтожен при нехватке программе
памяти.
Если на объект остались только слабые ссылки, то этот объект является живым, но он
будет уничтожен при ближайшей сборке мусора.
Во-первых, ее очень легко получить, если использовать сам объект в качестве ключа.
Логгер — это объект, с помощью которого можно вести логирование (вывод или запись
информации о произошедших событиях).
Чаще всего в лог пишется информация о параметрах метода, с которыми он был
вызван, все перехваченные ошибки и еще много промежуточной информации.
Обычно настройки логгера log4j задаются в файле log4j.properties или log4j.xml. В этом
файле можно задать несколько appender’ов – объектов, в которые будут писаться
данные.
a. место, куда будет писаться информация (файл, консоль, база данных, сеть и
т.д.)
Этот метод вызывается Java-машиной у объекта перед тем, как объект будет
уничтожен. Однако Java-машина сама решает – вызвать данный метод или нет. Чаще
всего объекты, созданные в методе и объявленные мусором после его завершения,
уничтожаются сразу же и без всяких вызовов метода finalize().
Можно вручную запустить вызовы этого метода у всех недостижимых объектов метод
ом System.runFinalization() или Runtime.getRuntime().runFinalization().
Во время старта JVM запускается поток finalizer, который работает в фоне. Этот поток
имеет метод runFinalizer, который игнорирует все исключения методов finalize
объектов перед сборкой мусора. То есть если во время выполнения метода finalize
возникнет исключительная ситуация, его выполнение будет остановлено и это никак
не скажется на работоспособности самого сборщика мусора (garbage collector).
- если после работы finalize() ничего не изменилось и объект все еще может быть
удален, фантомная ссылка на объект помещается в специальную очередь —
ReferenceQueue. Если же метод finalize() не переопределён, то этот объект пропускает
текущую сборку мусора, и попадает в следующую.
Объект не удаляется из памяти до тех пор, пока его фантомная ссылка находится в
этой очереди. Он будет удален только после того, как у фантомной ссылки будет
вызван метод clear().
Также стоит отметить, что метод get() у призрачной ссылка всегда возвращает null (в
отличие от SoftReference и WeakReference ссылок, у которых он возвращает null,
только если объект уже уничтожен).
Для отслеживания того, что объект больше не нужен. Может быть использовано для
закрытия ресурсов, открытых данным объектом (например, удаление созданных
файлов).
б) Git хранит «слепки» файлов в сжатом виде (причём, если файл не менялся, то
хранится ссылка на него), а SVN хранит изменения файлов.
в) В Git коммит может иметь несколько родителей (разных веток) и несколько
потомков (разных веток), а в SVN — нет. Соответственно, в SVN — линейная история
коммитов, а в Git — нет.
г) В Git ветка — это просто указатель на какой-то коммит, в SVN — это полноценная
копия всего репозитория.
д) Git создают одну скрытую папку в корне проекта, в которой хранит всю свою
служебную информацию, а SVN в каждой папке проекта создаёт скрытую папку со
своей служебной информацией.
Пример:
class Account<T>{
private T id;
private int sum;
this.id = id;
this.sum = sum;
System.out.println(acc1Id);
System.out.println(acc2Id);
interface Accountable<T>{
T getId();
int getSum();
Обощенные методы:
list.set(i, val);
В данном случае метод принимает на вход 2 параметра: список объектов T и еще один
отдельный объект Т. За счет использования <T> и достигается типизация метода: мы
не можем передать туда список строк и число. Список строк и строку, список чисел и
число, список наших объектов Cat и еще один объект Cat — только так.
Обощенные конструкторы:
class Account{
this.id = id.toString();
this.sum = sum;
Тип Upper Bounded Wildcards означает, что в конструкцию <? extends Someclass>
можно подставить объект класса Someclass и любых его потомков.
Тип Lower Bounded Wildcards означает, что в конструкцию <? super Someclass> можно
подставить объект класса Someclass и любых его родителей.
extends (Upper Bounded Wildcards) - ограничение сверху (берем только то, что ниже по
иерархии наследования).
super (Lower Bounded Wildcards)- ограничение снизу (берем только то, что выше по
иерархии наследования).
Конструкция <? extends SomeClass> нужна для того, чтобы забирать элементы.
Запись вида ArrayList называется raw type ("сырой" тип, класс-дженерик, из которого
удалили его тип). Если присвоить данной ссылке new ArrayList<>(), то в него можно
добавлять любые элементы и объекты, в т.ч разнотипные.
Запись вида ArrayList<?> означает, что данный список может работать с любыми
элементами. Однако, если присвоить данной ссылке new ArrayList<>(), то в него
нельзя добавлять никакие элементы, кроме null. Но можно присвоить данной ссылке
ArrayList<>() с любым содержимым.
- всякий путь от данного узла до любого листового узла, являющегося его потомка,
содержит одинаковое количество чёрных узлов.
- Активный Вид, который знает о Модели и сам берет из нее нужные данные.
- WEB-Container – (JSP, JSF и т.д.) все что дает конечный вид пользователю, а точней
пользовательский интерфейс.
- Entities – это объекты EJB для хранения данных на период жизненного цикла Entity.
Entities является своего рода отображением таблиц в БД.
DAO (data access object) — это объект для работы с БД или другим объектом хранения
данных, основная задача которого сохранять данные в базу данные, а также извлекать
их из неё.
DTO (Data Transfer Object) - это объект, предназначенный для передачи данных между
различными приложениями, либо между слоями внутри одного приложения. Он
должен уметь хранить данные и быть сериализуемым.
*****
Элементы хранятся внутри HashMap в виде набора групп – корзин (bucket). В какую
корзину попадет элемент — зависит от значения его hashCode(). Смысл такого
хранения в том, что при поиске/удалении можно отбрасывать ненужные корзины, и
исключать все их элементы из рассмотрения.
POJO (Plain Old Java Object) - "старый добрый Java объект", простой Java-объект, не
унаследованный от какого-то специфического объекта и не реализующий никаких
служебных интерфейсов сверх тех, которые нужны для бизнес-модели.
Термин был придуман в пику EJB (Enterprise JavaBeans), так как отсутствие звучного
термина для простых объектов приводило к тому, что молодые Java-программисты
пренебрежительно к ним относились, считая что только EJB «спасут мир». Концепция
POJO появилась как результат поиска путей облегчения и упрощения методов
программирования для задач, требовавших от бизнес-объектов разносторонней
функциональности, включая хранение объектов в базе данных, веб-интерфейс и т.п.
Это объект EJB для хранения данных на период жизненного цикла Entity. Является
своего рода отображением таблиц в БД.
Множества:
Дерево - это связный ациклический граф. При этом обычно одну вершину выбирают
корнем дерева, а остальные объявляют ее ветвями. Ветви дерева, которые не имеют
своих ветвей, называют листьями.
- полным бинарным деревом, если у каждой ветви 2 потомка, а все листья (без
потомков) находятся в одном ряду.
Singleton, Factory, Abstract Factory, Template method, Strategy, Pool, Adapter, Proxy,
Bridge, MVC
Область применения:
- Экземпляр должен быть легко доступен для всех клиентов данного класса.
private Singleton() {}
if (instance == null)
return instance;
}
Вариант второй, с синхронизацией, но использование volatile модификатора может
привести к проблемам производительности на мультипроцессорных системах.
private Singleton() {}
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
return instance;
https://javarush.ru/groups/posts/2365-patternih-proektirovanija-singleton
https://habr.com/ru/post/27108/
// method body
// method body
return writer;
}
При создании объекта нужно передать в метод getWriter в качестве аргумента объект
File или DOM документ. В результате выполнения метода мы получим нужный объект
необходимого уровня абстракции.
https://javarush.ru/groups/posts/2370-pattern-proektirovanija-factory
http://www.javenue.info/post/17
interface Sedan {}
interface Coupe {}
interface CarsFactory {
Sedan createSedan();
Coupe createCoupe();
// Реализуем конкретное воплощение в виде автомобилей, создаваемых на той или иной фабрике
public ToyotaCoupe() {
System.out.println("Create ToyotaCoupe");
public ToyotaSedan() {
System.out.println("Create ToyotaSedan");
public FordCoupe () {
System.out.println("Create FordCoupe");
public FordSedan() {
System.out.println("Create FordSedan");
@Override
@Override
@Override
@Override
Вывод:
Create ToyotaSedan
https://javarush.ru/groups/posts/2379-patternih-proektirovanija-abstractfactory
// Файл Chief.java
// Файл Plumber.java
// Файл ChiefAdapter.java
@Override
return plumber.getKey();
@Override
return plumber.getScrewDriver();
}
@Override
return plumber.getPipe();
// Файл Client.java
https://ru.wikipedia.org/wiki/Адаптер_(шаблон_проектирования)
http://www.javenue.info/post/63
https://javarush.ru/groups/posts/2361-kakie-zadachi-reshaet-shablon-proektirovanija-adapter
Интерфейс TimetableTrains.
interface TimetableTrains {
String[] getTimetable();
//Чтобы каждый раз не читать файл с диска при попытке получить расписание всех
поездов мы //создаем класс-заместитель, который кэширует данные при первом
обращении к файлу.
@Override
public String[] getTimetable() {
if(timetableCache == null) {
timetableCache = timetableTrains.getTimetable();
return timetableCache;
@Override
if(timetableCache == null) {
timetableCache = timetableTrains.getTimetable();
return "";
timetableTrains = null;
@Override
public String[] getTimetable() {
"9B-6854;Лондон;Прага;13:43;21:15;07:32",
"BA-1404;Париж;Грац;14:25;21:25;07:00",
"9B-8710;Прага;Вена;04:48;08:49;04:01",
"9B-8122;Прага;Грац;04:48;08:49;04:01"
};
@Override
return "";
class DisplayTimetable {
String[] tmpArr;
System.out.println("Поезд\tОткуда\tКуда\t\tВремя отправления\tВремя
прибытия\tВремя в пути");
for(int i = 0; i<timetable.length; i++) {
tmpArr = timetable[i].split(";");
Преимущества:
Недостатки:
Перед самым первым спринтом заказчик (или его представитель) формирует список
требований, предъявляемых к будущему продукту. Такие требования называются
"user story", а самого заказчика называют "product owner". Также в этом списке
заказчик (PO) указывает приоритет для каждой задачи. Сначала будут
реализовываться задачи с более высоким приоритетом. Весь список называется
"product backlog", или "резерв продукта".
Кроме product owner, среди участников ещё выделяют scrum-мастера: он проводит все
совещания, следит за соблюдением всех принципов скрама, разрешает противоречия
и защищает команду от отвлекающих факторов. Обычно в качестве скрам-мастера
выступает кто-то из команды.
- Пользователи (Users)
Product Owner - это владелец продукта. Он знает все о продукте, имеет его видение и
постоянно общается в заказчиком (Stakeholder) и командой. Он определяет
требования к продукту и задачи, которые должна решить команда разработки, чтобы
получить конечный продукт. Список требований (или задач) он оформляет в
определённым порядке и с заданным приоритетом для каждого требования (задачи).
Обычно он участвует в планировании спринта (перед началом спринта) и в
демонстрации результатов спринта (после окончания спринта).
Исключения делятся на несколько классов, но все они имеют общего предка — класс
Throwable. Его потомками являются подклассы Exception и Error.
Первый тип ошибок возникает при переполнении стека вызовов — то есть, когда
вызывается слишком много методов и стек вызовов становится слишком большим
(бесконечная рекурсия или рекурсия с большим количеством итераций).
В таком случае параметр e будет неявно иметь модификатор final. Кроме того, байт-
код, сгенерированный компиляцией такого кода (с единым catch-блоком) будет короче,
чем байт-код, сгенерированный компиляцией кода с несколькими catch-блоками.
@interface CatManager
Class manager();
boolean unique();
http://www.seostella.com/ru/article/2012/05/21/annotacii-v-java-retention.html
http://www.seostella.com/ru/article/2012/05/20/annotacii-v-java-target.html
Хотя сервлеты могут обслуживать любые запросы, они обычно используются для
расширения веб-серверов.
- Далее выводится страница, где нужно изменить адрес хоста, на котором находится
Tomcat, и порт
- Перестартовать Tomcat
- Отправить запрос
Щелкнуть ЛКМ в поле между номером строчки и началом строки, либо встать на
какую-то строчку и нажать ctrl+F8, либо встать на строку и в меню выбрать Run ->
Toggle line BreakPoint
Либо сочетанием клавиш ctrl+shift+F8, либо выбрать в меню Run -> View Breakpoints
268. Можно ли с помощью IDEA поменять значение переменной в процессе работы
программы?
Это можно сделать в режиме отладки. Во время отладки нужно в окне переменных
выбрать нужную переменную и нажать F2, либо щёлкнуть по переменной правой
кнопкой мыши и в открывшемся меню выбрать "set value", и ввести нужное значение
переменной.
В настройках (Settings) выбрать Editor, потом — Code Style. Там уже можно изменить
настройки отступов для каждого поддерживаемого формата файла.
Перейти по следующему пути Settings -> Editor -> Code Style -> Java -> Wrapping and
Braces, и дальше в разделе Braces Placement изменять настройки (для класса, метода,
лямбда-выражений и других случаев).
В версии протокола IPv4 IP-адрес имеет длину 4 байта, представляет собой 32-битное
число и записывается в виде четырёх десятичных чисел значением от 0 до 255
(эквивалентых четырём восьмибитным числам), разделённых точками, например,
192.168.0.3.
В версии протокола IPv6 IP-адрес имеет длину 16 байт, представляет собой 128-
битное число и записывается в виде восьми четырёхзначных шестнадцатеричных
чисел (эквивалентных восьми 16-битным числам), разделённых двоеточиями,
например, 2001:0db8:85a3:0000:0000:8a2e:0370:7334
Домен — это адрес сайта или определённая зона, имеющая уникальное имя в
системе доменных имён.
TRACE - возвращает полученный запрос так, что клиент может увидеть, какую
информацию промежуточные серверы добавляют или изменяют в запросе;
UNLINK - удаляет одну или более ссылочных взаимосвязей для ресурса, указанного в
URI-Запроса;
Метод GET используется для запроса содержимого указанного ресурса. Метод POST
применяется для передачи пользовательских данных заданному ресурсу. Метод HEAD
обычно применяется для извлечения метаданных, проверки наличия ресурса
(валидация URL) и чтобы узнать, не изменился ли он с момента последнего
обращения. Метод HEAD аналогичен методу GET, за исключением того, что в ответе
сервера отсутствует тело. Метода GET считается упрощённой версией POST, потому
как не предполагает полноценного запроса, только URL в качестве такового.
Для этого существует класс SimpleDateFormat. Объекту этого класс в аргументе нужно
передать шаблон представления даты в формате строки String. Затем
воспользоваться методом format(Date date) для преобразования даты в строку в
нужном формате либо parse(String date) для считывания объекта Date из строки в
нужном формате.
http://www.seostella.com/ru/article/2012/02/05/formatirovanie-daty-v-java.html
https://www.codeflow.site/ru/article/migrating-to-java-8-date-time-api
Для создания клиентского сокета (Socket) нужно указывать IP-адрес (или домен) и
порт.
Главное отличие в том, что класс URL предназначен для работы с URL-строкой
(парсинг URL-строки), а Socket используется для соединения с удалённым сервером и
отправки информации на сервер и/или приёма информации от сервера (хотя,
используя класс URL, можно получить доступ к ресурсу, на который указывает сам
URL; но делается это не напрямую, а через объект класса URLConnection).
Класс Socket используется для связи с сервером (другой программой), а URL — для
доступа к ресурсу (например, к файлу). Кроме того, URL и URLConnection
ориентированы в основном на работу с HTTP, тогда как Socket может работать с
любыми протоколами.