Инструменты пользователя

Инструменты сайта


develop:java:in

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
develop:java:in [2023/02/27 10:25]
admin
develop:java:in [2023/05/03 15:18] (текущий)
admin
Строка 431: Строка 431:
 сам поток не может генерировать никакие исключения наружу, но завершится при любом необработанном, не существует такой конструкции "catch" чтобы словить это исключение, для этого есть т.н. обработчик не обрабатываемых исключений, он должен относится к классу реализующему интерфейс "Thread.UncaughtExceptionHandler". Там единственный метод, он ставится на любой поток исполнения\\ сам поток не может генерировать никакие исключения наружу, но завершится при любом необработанном, не существует такой конструкции "catch" чтобы словить это исключение, для этого есть т.н. обработчик не обрабатываемых исключений, он должен относится к классу реализующему интерфейс "Thread.UncaughtExceptionHandler". Там единственный метод, он ставится на любой поток исполнения\\
  
-****\\ +**Приоритеты**\\ 
- +**setPriority()**, зависит от системы исполнения, ряд нюансов, в линуксе вроде вообще игнорируется, в целом особо не распространено\\
-****\\ +
- +
-****\\ +
- +
-****\\ +
  
  
 +**Синхронизация потоков**\\
 +Проблема в общих ресурсах возникает тогда, когда обращение к ним происходит одновременно, т.к. операции в основном **не атомарные** (например a=+2), то в байт коде они разбиты на несколько шагов, и прерывание потоков может происходить внутри этих шагов, т.е. **до полного завершения операции**, в основном в этом самая главная и опасная проблема одновременного доступа\\
  
 +**Блокировка**\\
 +Есть по сути аналог критической секции. Класс **ReentrantLock**\\
 +<code java>
 +private Lock myLock = new ReentrantLock();
 +myLock.lock();
 +try:
 +{
 +  критический раздел кода
 +}
 +finally
 +{
 +  myLock.unlock();
 +}
 +</code>
 +Есть еще объекты блокировки с условиями\\
 </details> </details>
  
  
 +==== Коллекции данных ====
 +=== Разделение интерфейсов и реализаций ===
 +Собсна такое разделение является стандартом и дает множество преимуществ\\
 <details> <details>
-<summary> </summary>+<summary>:!: на примере структуры данных "Очередь (Queue)" </summary
 +Самая простая форма интерфейса может выглядеть так: 
 +<code java> 
 +interface Queue<E> 
 +
 +  void add(E e lement); 
 +  Е remove(); 
 +  int size(); 
 +
 +</code> 
 +А реализация с-но может сильно варьироваться и определяется классом, реализующим интерфейс "Queue" 
 +<code java> 
 +class CircularArrayQueue<E> implements Queue<E> 
 +
 + CircularArrayQueue(int capacity) 
 + public void add(E element) 
 + public Е remove () 
 + public int size ()  
 + private Е[] elements; 
 + private int head; 
 + private int tail; 
 +
 +// или  
 +class LinkedListQueue<E> implements Queue<E> 
 +
 + LinkedListQueue () 
 + void add (Е element) 
 + public Е remove () 
 + public int size() 
 + private Link head; 
 + private Link tail; 
 +
 +</code> 
 +</details>
  
 +<details>
 +<summary>:!: Интерфейс **Collection** </summary>
 +Основополагающий для классов коллекций
 <code java> <code java>
 +public interface Collection<E>
 +{
 +  boolean add(E element);
 +  Iterator<E> iterator();
 +}
 </code> </code>
 </details> </details>
Строка 454: Строка 509:
  
  
 +<details>
 +<summary>:!: Итераторы </summary>
 +<code java>
 +public interface Iterator<E>
 +{
 +  E next();
 +  boolean hasNext();
 +  void remove();
 +}
 +</code>
 +Нужно проверять наличие через "hasNext()" иначе **генерится исключение** при достижении конца\\ 
 +Порядок в котором перебираются элементы, зависит от типа коллекции, может быть последовательный а может быть и случайный\\
 +Итераторы в java отличаются от сишных, к ним не применим инкремент, они не моделируются по индексам, скорее это "объекты между элементами", он возвращает ссылку на элемент который он только что "прошел", когда перескочил при вызове "next()"\\
 +Тобишь для каких либо д-й с итератором, его нужно позиционировать, затем вызывать например "remove()", примечательно что после этого он автоматом не перепозиционируется, и для повторного remove() надо повторно вызывать next()\\
 +</details>
  
  
 +=== Коллекции в Java ===
 +<details>
 +<summary>:!: Notes </summary>
 +{{:develop:java:2023-03-11_11-57.png?direct&400|}}\\
  
 +**Связные списки**\\
 +Двунаправленные элементы, т.е. в каждом элементе хранится ссылка предшествующего и последующего элемента, благодаря этому **операция удаления в середине дается дешево**\\
 +{{:develop:java:2023-03-11_12-05.png?direct&400|}}\\
  
 +**Списочные массивы**\\
 +Интерфейс List описывает упорядоченную коллекцию, в которое имеет значение расположение элемента\\
 +К слову, отличие **Vector** и **ArrayList** в том что первый потокобезопасный, но на это тратятся доп ресурсы, а второй нет, с-но выбор зависит от задач и баланса эффективности\\
  
 +**Хеш-множества**\\
 +Более эффективный поиск элементов в списке\\
 +Из-за специфики реализации, элементы располагаются (извлекаются) с (псвдо-)случайном порядке\\
  
 +**Древовидные множества**\\
 +Основным отличием является то что все элементы в нем всегда отсортированы, сортируются они сразу же перед записью, вычисляется место для вставки\\
 +Работает немного медленнее чем хеш, но многое зависит от типа данных, должен быть реализован интерфейс "comparable" для сравнения элементов\\
  
- +**Одно- и двустроние очереди**\\ 
- +Впринципе рассмотрено уже\\ 
- +Так же существуют очереди **по приоритету**\\ 
- +</details>
- +
  
  
develop/java/in.1677493546.txt.gz · Последнее изменение: 2023/02/27 10:25 — admin