api. Основные классыšонспект_лекций_2.pdf52 java.io.inputstream...
TRANSCRIPT
![Page 1: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/1.jpg)
1
API. Основные классы
![Page 2: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/2.jpg)
2
Пакет java.lang
● Не нужно импортировать — неявный import
● классы:● Object
● Number, Integer, Byte, Short, Long, Double, Float, Boolean, Char
● Math, BigInteger, BigDecimal
● String, StringBuffer, StringBuilder
● System, Runtime, ClassLoader, SecurityManager
● Class, Enum
● Throwable, Exception, Error, RuntimeException
● Thread, ThreadGroup
● интерфейсы● Cloneable
● Runnable
![Page 3: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/3.jpg)
3
Класс Object
● базовый класс иерархии классов Java
● предок всех классов (и массивов)
● неявное расширение
class A extends Object {
}
![Page 4: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/4.jpg)
4
Класс Object
● методы класса Object:● не переопределяемые
◊ final Class<?> getClass()◊ final void wait()◊ final void notify()◊ final void notifyAll()
● переопределяемые
◊ boolean equals()◊ int hashCode()◊ String toString()◊ protected Object clone()◊ protected void finalize()
![Page 5: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/5.jpg)
5
Метод equals
● boolean equals(Object obj)
● obj1 == obj2 — true, если ссылка на один и тот же объект
● obj1.equals(obj2) — эквивалентность значений
● рефлексивность: x.equals(x) == true
● симметрия: x.equals(y) == y.equals(x)
● транзитивность: x.equals(y) == true && y.equals(z) == true, → x.equals(z) == true
● постоянство
● если x != null, то x.equals(null) == false
● при переопределении — сравнение всех значащих полей
![Page 6: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/6.jpg)
6
Метод hashCode()
● int hashCode()
● если объект не модифицировался, то hashCode не должен меняться
● если x.equals(y) == true, то x.hashCode() == y.hashCode()
● если два объекта не эквивалентны, то hashCode не обязан быть разным — коллизия
● по умолчанию обычно возвращает адрес объекта
● при переопределении — скорость, минимизация коллизий
![Page 7: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/7.jpg)
7
Метод toString()
● String toString()
● Возвращает текстовое представление объекта
● Неявно вызывается при конкатенации строки и объекта
"Hello" + obj
"Hello" + obj.toString()
● Для Object — возвращает ClassName@hashСode16
![Page 8: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/8.jpg)
8
Метод clone()
● protected Object clone()
● Возвращаемый объект следует получать с помощью вызова super.clone()
● Класс должен реализовывать интерфейс Cloneable (интерфейс-метка)
● Object не реализует Cloneable
● Object.clone() создает "мелкую" копию — копируются только значения полей
![Page 9: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/9.jpg)
9
Метод finalize()
● protected void finalize()
● Вызывается сборщиком мусора перед удалением объекта
● Предназначен для освобождения системных ресурсов
● Метод Object.finalize() ничего не делает
![Page 10: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/10.jpg)
10
Классы оболочки
● Коллекции не могут содержать примитивные элементы
● Оболочка — представление в виде объекта
● abstract class Number
● Byte, Short, Integer, Long, Float, Double: extends Number
● Character
● Boolean
● Void — объектное представление типа void
![Page 11: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/11.jpg)
11
Number
● Абстрактный класс
● Методы● byte byteValue()
● short shortValue()
● int intValue()
● long longValue()
● float floatValue()
● double doubleValue()
● Потомки — Byte, Short, Integer, Long, Float, Double
![Page 12: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/12.jpg)
12
Методы преобразования
● примитив ↔ объект● конструктор Integer(int), static Integer valueOf(int)
● int intValue()
● автоупаковка/автораспаковка
● строка ↔ объект● конструктор Integer(String),static Integer valueOf(String)
● String toString()
● строка ↔ примитив● static int parseInt(String)
● "" + int
![Page 13: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/13.jpg)
13
Автоупаковка и автораспаковка
● Integer a = Integer.valueOf(5);
● int i = a.intValue();
● Integer a = 5;
● int i = a;
● Integer a = 500; Integer b = 500;● b.equals(a) → true; b == a → false
● Integer c = 10; Integer d = 10;● c.equals(d) → true; c == d → true!
![Page 14: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/14.jpg)
14
Методы сравнения
● interface Comparable<T>● int compareTo(T)
● static int compare(prim, prim)
● boolean equals(Object)
![Page 15: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/15.jpg)
15
Integer, Long::работа с битами
● static int bitCount(int)
● static int highestOneBit(int)
● static int lowestOntBit(int)
● static int numberOfLeadingZeros(int)
● static int numberOfTrailingZeros(int)
● static int reverse(int)
● static int rotateLeft(int, int distance)
● static int rotateRight(int, int distance)
![Page 16: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/16.jpg)
16
Integer, Long :: беззнаковые целые
● compareUnsigned(x, y)
● divideUnsinged(x, y)
● remainderUnsigned(x, y)
● parseUnsignedInt(String) (parseUnsignedLong)
● toUnsignedInt(x) (toUnsignedLong)
● toUnsingedString(x)
![Page 17: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/17.jpg)
17
Boolean
● compareTo● TRUE.compareTo(TRUE) = 0
● FALSE.compareTo(FALSE) = 0
● TRUE.compareTo(FALSE) = +
● FALSE.compareTo(TRUE) = -
● parseBoolean(String), valueOf(String)● true, если строка содержит "true" без учета регистра
● false, если не содержит
![Page 18: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/18.jpg)
18
Character
● char — 16 бит
● Unicode (сначала 16 бит, потом 21)● U+0000 ... U+10FFFF
● U+0000 ... U+FFFF — Basic Multilingual Plane
● UTF-16● \uD800 ... \uDBFF — high surrogate
● \uDC00 ... \uDFFF — low surrogate
● int toCodePoint(char high, char low)
● char[] toChars(int codePoint)
● Методы принимают или char или int:● isDigit, isLetter, isSpaceChar, isLowerCase, isUpperCase, isTitlecase
● toLowerCase, toUpperCase, toTitleCase
● DŽ (upper), Dž (title), dž (lower)
![Page 19: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/19.jpg)
19
String
● Строка — константа
● String s = "Hello";
s = s.replace('e', 'u') — создается новый объект
● Компилятор сохраняет строки в пул
● "Hello, " + "world" == "Hello, world"
● метод intern() помещает строку в пул, если ее там нет
![Page 20: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/20.jpg)
20
Конструкторы String
● String()
● String(byte[])
● String(byte[], int offset, int count)
● String(char[])
● String(char[], int offset, int count)
● String(int[], int offset, int count)
● String(String)
● String(StringBuilder)
● String(StringBuffer)
![Page 21: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/21.jpg)
21
Методы String
● int length()
● char charAt()
● int codePointAt()
● String concat(String)
● String substring(int begin, int end)
● int indexOf
● int lastIndexOf
● boolean compareTo()
● String replace()
● String trim()
● static String valueOf()
![Page 22: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/22.jpg)
22
StringBuilder и StringBuffer
● StringBuffer — потокобезопасный
● StringBuilder — быстрый
● Конструкторы● StringBuilder()
● StringBuilder(String)
● Методы● String toString()
● append(x) — используется при операции + со строками
● insert(int, x)
● deleteCharAt()
● setCharAt()
● replace
![Page 23: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/23.jpg)
23
Math
● Константы PI, E
● математические функции
![Page 24: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/24.jpg)
24
System
● System.in, System.out, System.err — стандартные потоки
● Console console()● printf(), format()
● readLine(), readPassword()
● exit(int status)● 0 — удачное завершение
● getenv()
● getProperties()
● getSecurityManager()● checkXXX()
● long currentTimeMillis()● nanoTime()
![Page 25: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/25.jpg)
25
Обработка исключения
● Правило "Catch or Specify"
try {
m();
} catch (MyException e) {
System.out.println("А-а-а! Мы все умрём!");
System.exit(666);
} catch (Exception e) {
System.out.println("Или не все...");
} finally {
// закрыть ресурсы
}
![Page 26: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/26.jpg)
26
finally выполняется всегда!
public int test() {
try {
return 0;
} finally {
return 1;
}
}
System.out.println(test());
![Page 27: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/27.jpg)
27
try с ресурсами
● ресурс должен реализовывать интерфейс AutoCloseable
try (Scanner s = new Scanner(System.in)) {
...
} catch (IOException e) {
}
● при выходе из блока try будет вызван метод close()
![Page 28: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/28.jpg)
28
Коллекции
![Page 29: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/29.jpg)
29
Коллекции
● Коллекции предназначены для группировки объектов
● Коллекции могут хранить только ссылочные типы
● Коллекции используют обобщенные типы данных
![Page 30: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/30.jpg)
30
Обобщенные и параметризованные типы
● Stack a = new Stack();
a.put("Hello"); // void put(Object)
String s = (String) a.get(); // Object get()
● Stack<String> b = new Stack<String>(); // Stack<>()
b.put("Hello");
String s = b.get();
● class Stack<T> {
private T object;
void put(T t) { object = t; }
T get() { return object; }
}
![Page 31: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/31.jpg)
31
Ограничение параметров типа
● class NumberStack<T extends Number> {
public int intValue() {
return T.intValue();
}
}
![Page 32: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/32.jpg)
32
Приведение типов и шаблоны
● Number n = new Integer(10);
● Stack<Number> s = new Stack<Integer>(); // error
Stack<Integer> не потомок Stack<Number>
● Stack<?> s = new Stack<Integer>();
● Stack<? extends Number> s = new Stack<Integer>();
![Page 33: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/33.jpg)
33
Стирание типов
● На уровне виртуальной машины обобщенные типы отсутствуют — заменяются на "сырые"
● Добавляется приведение типов
● Совместимость с предыдущими версиями
● Потенциальная возможность несовпадения типов
![Page 34: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/34.jpg)
34
Интерфейс java.util.Collection<E>
● int size()
● boolean isEmpty()
● boolean contains(Object)
● booelan add(E) // true если коллекция изменилась
● boolean remove(Object) // true если коллекция изменилась
● Iterator<E> iterator()
● void clear()
● containsAll(), addAll(), removeAll(), retainAll()
● for (E e : collection) { e }
● for (Iterator i = collection.iterator(); i.hasNext(); ) { i.next(); }
![Page 35: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/35.jpg)
35
Интерфейс Set<E>
● Множество (нет повторяющихся элементов)
● s.containsAll(t) - true, если t — подмножество s
● s.addAll(t) — объединение s и t
● s.retainAll(t) — пересечение s и t
● s.removeAll(t) — разность s и t
● HashSet — самая быстрая реализация, нет порядка
● TreeSet — медленная реализация, натуральный порядок
● LinkedHashSet — средняя скорость, порядок добавления
● Set<Integer> s = new HashSet<Integer>();
![Page 36: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/36.jpg)
36
Интерфейс List<E>
● Список или последовательность — индексация
● E get(int)
● E set(int, E)
● void add(int, E)
● E remove(int)
● indexOf(Object)
● lastIndexOf(Object)
● listIterator() // hasPrevious(), previous()
● ArrayList — оптимальная реализация
● LinkedList — для большого числа вставок-удалений
![Page 37: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/37.jpg)
37
Интерфейс Queue<E>
● Очередь
● add(E), E remove(), E element() - исключение
● offer(E), E poll(), E peek() - специальное значение
● LinkedList — сортировка FIFO
● PriorotyQueue — сортировка по значению
![Page 38: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/38.jpg)
38
Интерфейс Deque<E>
● Очередь + стек
● addFirst/Last(E), E removeFist/Last(), E getFirst/Last()
● offerFirst/Last(E), E pollFirst/Last(), E peekFirst/Last()
● ArrayDeque
● LinkedList
![Page 39: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/39.jpg)
39
Интерфейс Map<K,V>
● Хранит пары ключ-значение
● V put(K,V)
● V get(K)
● V remove(K)
● boolean containsKey(K)
● boolean containsValue(V)
● int size()
● boolean isEmpty()
● Set keySet()
● Set entrySet()
● Collection values()
● HashMap
● TreeMap
● LinkedHashMap
![Page 40: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/40.jpg)
40
класс Collections
● статические методы, возвращающие:● синхронизированные коллекции synchronizedCollection()
● немодифицируемые коллекции unmodifiableCollection()
● проверяемые коллекции checkedCollection()
● алгоритмы● sort()
● shuffle()
● reverse()
● fill()
● swap()
● binarySearch()
![Page 41: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/41.jpg)
41
Сортировка (отдельный компаратор)
public class A {
public static void main(String[] args) {
List<String> list = Arrays.asList(args);
list.sort(new C());
for (String s : list) { System.out.println(s); }
}
}
class C implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
![Page 42: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/42.jpg)
42
Сортировка (статический вложенный класс)
public class A {
public static void main(String[] args) {
List<String> list = Arrays.asList(args);
list.sort(new C());
for (String s : list) { System.out.println(s); }
}
static class C implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
}
![Page 43: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/43.jpg)
43
Сортировка (внутренний класс)
public class A {
public static void main(String[] args) {
List<String> list = Arrays.asList(args);
list.sort(new A().new C());
for (String s : list) { System.out.println(s); }
}
class C implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
}
![Page 44: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/44.jpg)
44
Сортировка (локальный класс)
public class A {
public static void main(String[] args) {
class C implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
List<String> list = Arrays.asList(args);
list.sort(new C());
for (String s : list) { System.out.println(s); }
}
}
![Page 45: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/45.jpg)
45
Сортировка (анонимный класс)
public class A {
public static void main(String[] args) {
List<String> list = Arrays.asList(args);
list.sort(new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
for (String s : list) { System.out.println(s); }
}
}
![Page 46: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/46.jpg)
46
Сортировка (лямбда-выражение)
public class A {
public static void main(String[] args) {
List<String> list = Arrays.asList(args);
list.sort(
(String s1, String s2) -> s1.length() - s2.length()
);
for (String s : list) { System.out.println(s); }
}
}
● sort(Comparator c)
● @FunctionalInterface interface Comparator
● int compare(T o1, T o2);
![Page 47: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/47.jpg)
47
Сортировка и вывод списка (лямбда)
public class A {
public static void main(String[] args) {
List<String> list = Arrays.asList(args);
list.sort(
(String s1, String s2) -> s1.length() - s2.length()
);
list.forEach((s) -> System.out.println(s));
}
}
![Page 48: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/48.jpg)
48
Сортировка и вывод списка (ссылка на метод)
public class A {
public static void main(String[] args) {
List<String> list = Arrays.asList(args);
list.sort(
(String s1, String s2) -> s1.length() - s2.length()
);
list.forEach(System.out::println);
}
}
![Page 49: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/49.jpg)
49
Ввод-вывод
![Page 50: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/50.jpg)
50
Пакет java.io
1)Байтовые и символьные потоки данных (I/O streams)● Поток — последовательность данных (байтов, символов,
примитивных типов, объектов)
● Входной поток — для чтения данных из источника
● Выходной поток — для записи данных в приемник
2)Старый интерфейс работы с файлами — класс File
![Page 51: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/51.jpg)
51
Потоки ввода-вывода
● Байтовые и символьные
● Входные и выходные
● Базовые абстрактные классы для потоков
java.io.InputStream java.io.OutputStream
java.io.Writerjava.io.Reader
![Page 52: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/52.jpg)
52
java.io.InputStream
● абстрактный метод int read()● возвращает байт от 0 до 255, если доступен
● если недоступен — блокируется и ждет
● если поток завершился — возвращает -1
● при ошибке — IOException
● реализованные методы:● int read(byte[] buffer, int len, int offset)
● int read(byte[] buffer)
● int available()
● long skip(long n)
● boolean markSupported()
● void mark(int limit)
● void reset()
● void close()
![Page 53: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/53.jpg)
53
java.io.Reader
● абстрактный метод int read(char[] buffer, int len, int offset)● читает символы в массив, возвращает число прочитанных (-1 при завершении)
● если недоступен — блокируется и ждет
● при ошибке — IOException
● abstract void close()
● реализованные методы:● int read()
● int read(char[] buffer)
● boolean ready()
● int available()
● long skip(long n)
● boolean markSupported()
● void mark(int limit)
● void reset()
![Page 54: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/54.jpg)
54
java.io.OutputStream
● абстрактный метод void write(int b)● записывает байт
● при ошибке — IOException
● реализованные методы:● void write(byte[] buffer, int len, int offset)
● void write(byte[] buffer)
● void flush()
● void close()
![Page 55: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/55.jpg)
55
java.io.Writer
● абстрактный метод void write(char[] buffer, int len, int offset)● записывает символы из массива
● при ошибке — IOException
● abstract void flush()
● abstract void close()
● реализованные методы:● void write(byte[] buffer, int len, int offset)
● void write(char[] buffer)
● void write(String str, int len, int offset)
● void write(String str)
● Writer append(char c)
● Writer append(CharSequence cs)
![Page 56: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/56.jpg)
56
Специализированные потоки
● Работают с определенным источником/приемником
● Обычно источник/приемник указывается в конструкторе● чтение/запись файла
◊ File (InputStream, OutputStream, Reader, Writer)
● чтение/запись массива
◊ ByteArray (InputStream, OutputStream)◊ CharArray (Reader, Writer)
● чтение/запись в конвейер (взаимодействие потоков выполнения)
◊ Piped (InputStream, OutputStream, Reader, Writer)◊ соединение потоков в конвейер
● передача парного потока в конструктор● вызов метода connect()
● чтение/запись строк (только символьные потоки)
◊ String (Reader, Writer)
![Page 57: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/57.jpg)
57
Потоки-фильтры
● Filter (InputStream, OutpurStream, Reader, Writer)● принимают исходный поток как аргумент конструктора
● получившийся поток-фильтр преобразует исходный поток
● Buffered (InputStream, OutpurStream, Reader, Writer)
● LineNumber (InputStream, Reader)
● Print (Stream, Writer)
● ZIP (InputStream, OutputStream)
● Data (InputStream, OutpurStream)
● Object (InputStream, OutpurStream)
● байты ↔ символы● InputStreamReader (байты в символы)
● OutputStreamWriter (символы в байты)
![Page 58: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/58.jpg)
58
PrintStream, PrintWriter
● методы print, println — один аргумент примитивного типа, строка или объект
● методы printf, format — много аргументов, первый из которых — форматная строка
● Синтаксис форматной строки● %[индекс$][флаги][размер][.точность]формат
● %% - символ процента
● %n — перевод строки
● индекс — порядковый номер аргумента или < (предыдущий)
● флаги — зависят от формата
● размер — количество символов для представления числа
● точность — цифры после запятой для дробных форматов
● format("%c = %2$+9.7f", 'π', Math.PI);
● π = +3,1415927
![Page 59: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/59.jpg)
59
Нечисловые форматы
● Общие - любой тип аргумента
● Заглавная буква формата - toUpperCase()):
● %b, %B - boolean● boolean, Boolean → значение
● null → false
● все остальное → true
● %h, %H — hashcode● null → null
● все остальное — 16-ричный хэш-код
● %s, %S — строка● Formattable → formatTo()
● все остальное → toString()
● %c, %C — символ Unicode
● %t, %T — префикс для форматов даты/времени
![Page 60: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/60.jpg)
60
Целые числа
● %d — десятичное целое
● %o — 8-ричное целое
● %x, %X — 16-ричное целое
Флаги
● '-' - левое выравнивание
● '#' - для недесятичных чисел — добавить 0 или 0x
● '+' - обязательно использовать знак
● ' ' - пробел на месте знака для положительных
● '0' — использовать ведущие нули
● ',' - использовать групповой разделитель для десятичных
● '(' - отрицательные — в скобках
поле размер — количество цифр в формате
![Page 61: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/61.jpg)
61
Числа с плавающей запятой
● %e, %E — научная нотация с мантиссой и порядком
● %f — десятичная нотация
● %g, %G — научная или десятичная (зависит от точности)
● %a, %A — 16-ричная с мантиссой и порядком
Флаги — такие же, как для целых
Точность — количество цифр после запятой● для %g/G — общее количество значащих цифр и 10точность —
максимальное число, представляемое в десятичной форме (минимальное — 10-4). По умолчанию =6, то есть как десятичные дроби представляются числа от 0,0001 до 999999
![Page 62: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/62.jpg)
62
Scanner
● Конструкторы● Scanner(File)
● Scanner(Path)
● Scanner(InputStream)
● Scanner(Readable)
● Scanner(String)
● Методы● boolean hasNext(), String next()
● Boolean hasNextInt(), int nextInt(),
● ….
● String nextLine()
● void useDelimiter(String)
● void useRadix(int)
![Page 63: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/63.jpg)
63
DataInputStream, DataOutputStream
● Преобразование примитивных типов и строк в последовательность байтов
● Последовательность при чтении должна быть такой же как и при записи
● Методы:● writeBoolean(boolean), writeByte(int), writeShort(int), writeInt(int),
writeLong(long), writeFloat(float), writeDouble(double), writeChar(int), writeUTF(String)
● bolean readBoolean(), byte readByte(), int readUnsignedByte() short readShort(), int readUnsignedShort(), int readInt(), long readLong(), float readFloat(), double readDouble(), char readUTF()
![Page 64: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/64.jpg)
64
Сериализация объектов
● Сериализация — запись объектов в виде потока байтов
● Классы ObjectOutputStream, ObjectInputStream
● Интерфейс Serializable - метка
● При записи объекты записываются с порядковым номером (serial number)
● Объект записывается в поток только один раз, потом используется ссылка на номер объекта
● При чтении одного и того же объекта из одного потока, он восстанавливается один раз
● При чтении объекта из двух потоков, объект восстанавливается дважды
![Page 65: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/65.jpg)
65
ObjectOutputStream, ObjectInputStream
● Те же методы, что и у DataOutputStream, DataInputStream
● + writeObject(Object)
● + Object readObject()
● Методы записывают/читают:● класс объекта
● сигнатуру класса (вычисляется как хэш-функция первых двух элементов дайджеста SHA-1 из имени и модификаторов класса, интерфейсов, типов и имен полей, имен и сигнатур конструкторов и методов)
● сигнатура класса может быть записана в поле serialVersionUID
● значения нестатических и непереходных полей данного класса, и всех его суперклассов
● поля с модификатором transient (переходные) не сериализуются
● поля записываются в поток иерархически
![Page 66: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/66.jpg)
66
Переопределение стандартной сериализации
● Методы в сериализуемом классе● private void writeObject(ObjectOutputStream os)
● private void readObject(ObjectInputStream is)
● в методах вызываются методы класса Object...Stream:
◊ os.defaultWriteObject()◊ is.defaultReadObject()
● методы заботятся только о своих данных (суперкласс не трогаем)
● интерфейс Externalizable● методы (обрабатывают весь объект, включая данные
суперкласса):
◊ writeExternal(ObjectOutput o)◊ readExternal(ObjectInput i)
![Page 67: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/67.jpg)
67
java.nio
● java.nio.Buffer — контейнер для хранения данных
● Создание буфера: allocate(capacity), wrap(array[])
● Методы:● limit(lim) и position(pos)
● mark() и reset() mark <-> position
● clear() - позиция = 0, граница = емкость
● flip() - граница = позиция, позиция = 0
● rewind() - позиция = 0
limit capacitypositionmark
get/put
![Page 68: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/68.jpg)
68
Запись и чтение данных
● методы get и put
● Относительная индексация (по текущей позиции)● позиция смещается после операции
● одиночные и групповые операции
● Абсолютная индексация (явное указание индекса)● позиция не меняется
● только одиночные
● Стандартное использование буфера — заполнение (запись), потом получение данных (чтение)
![Page 69: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/69.jpg)
69
Запись и чтение данных
● clear();
while () {
put(byte);
}
● flip();
while(hasRemaining()) {
get();
}
● rewind();
while(hasRemaining()) {
get();
}
![Page 70: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/70.jpg)
70
Классы-потомки Buffer
● ByteBuffer
● CharBuffer
● IntBuffer, ShortBuffer, LongBuffer, FloatBuffer, DoubleBuffer
![Page 71: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/71.jpg)
71
java.nio.charset
● Класс Charset● методы
● CharBuffer decode(ByteBuffer b)
● ByteBuffer encode(CharBuffer c)
![Page 72: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/72.jpg)
72
Каналы
● java.nio.channels
● Файловые каналы и сетевые каналы
● FileChannel● FileChannel.open(), FileInputStream.getChannel()
● write(ByteBuffer b) — запись в данный канал данных из буфера
● read(ByteBuffer b) — чтение из канала данных в буфер
● write для канала = get для буфера
● read для канала = put для буфера
● map() - получение MappedByteBuffer — отображение файла в память
![Page 73: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/73.jpg)
73
Работа с путями (java.nio.file.*)
● Класс Path — путь к файлу в файловой системе
● Paths — класс-помощник
● Path p1 = Paths.get("/home/s888888");
● Path p2 = Paths.get("C:\\Users\s888888");
● Path p3 =Paths.get("home", "s888888");
● Path p = Paths.get(System.getProperty("user.home"));
![Page 74: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/74.jpg)
74
Работа с файлами: проверки
● Класс Files● booelan Files.exists(Path)
● booelan Files.notExists(Path)
● booelan Files.isReadable(Path)
● booelan Files.isWritable(Path)
● booelan Files.isExecutable(Path)
![Page 75: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/75.jpg)
75
Работа с файлами: создание и удаление
● Path Files.createFile(Path)
● Path Files.createDirectory(Path)
● Path Files.createDirectories(Path)
● Path Files.createTempFile(String prefix, String suffix)
● Path Files.createLink(Path, Path)
● Path Files.createSymbolicLink(Path, Path)
● void Files.delete(Path)
● boolean Files.deleteIfExists(Path)
![Page 76: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/76.jpg)
76
Работа с файлами: копирование и перемещение
● Path Files.copy(Path, Path)
● Path Files.move(Path, Path)
![Page 77: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/77.jpg)
77
Работа с файлами: чтение и запись
● byte[] Files.readAllBytes(Path)
● List<String> Files.readAllLines(Path)
● Path Files.write(Path, byte[])
● Path Files.write(Path, Iterable<CharSequence>)
![Page 78: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/78.jpg)
78
java.lang.reflect
● Класс java.lang.Class
● Получение объекта класса Class● new A().getClass();
● Class.forName("A");
● A.class
● Методы● Field[] getFields()
● Method[] getMethods()
● Constructor[] getConstructors()
● isInterface()
● isArray()
![Page 79: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/79.jpg)
79
Многопоточность
![Page 80: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/80.jpg)
80
Потоки выполнения
● Процесс имеет собственный контекст исполнения, собственный набор ресурсов, свою выделенную память.
● Поток (thread) существует внутри процесса, делит память и ресурсы с другими потоками.
● Потоки в JVM● системные потоки:
◊ основной поток виртуальной машины◊ сборщик мусора◊ поток периодических задач◊ поток динамической компиляции
● прикладные потоки
◊ основной поток (main)◊ создаваемые программным путем
![Page 81: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/81.jpg)
81
Класс Thread и интерфейс Runnable
● public class Thread implements Runnable
● 2 варианта создания потока
1) public class A extends Thread {
public void run() { /* тело потока*/ }
}
new A().start;
2) public class A implements Runnable {
public void run() { /* тело потока */ }
}
new Thread(new A()).start();
![Page 82: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/82.jpg)
82
Приостановка и прерывание потока
● try {
Thread.sleep(1000); // спать 1 с
} catch (InterruptedException e) { }
● try {
t.join(1000); // ожидать завершения t в течение 1 с
} catch (InterruptedException e) { }
● t.interrupt(); // устанавливает флаг прерывания
● if (Thread.interrupted() { // сбрасывает флаг
throw new InterruptedException();
}
![Page 83: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/83.jpg)
83
Множественный доступ к переменным
class A {
int counter = 0;
public void up() { counter++; }
public void down() { counter--; }
}
1) получить значение counter
2) увеличить/уменьшить значение на 1
3) сохранить новое значение
1)00
1)00
2) 10
2)-10
3)-1-1
3)11
действиестек
counter
![Page 84: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/84.jpg)
84
Синхронизация
class A {
int counter = 0;
public synchronized void up() { counter++; }
public synchronized void down() { counter--; }
}
● Любой объект имеет монитор
● Поток может выполнить synchronized метод, только захватив монитор
● При выходе из метода поток освобождает монитор
● Для уменьшения времени захвата монитора используются блоки synchronized
synchronized(Object) { }
![Page 85: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/85.jpg)
85
Модификатор volatile
● Переменные класса — общие для всех потоков
● Потоки могут сохранять значения общих переменных в локальном кэше
● Модификатор volatile указывает, что доступ к этой переменной из потоков должен производиться напрямую
![Page 86: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/86.jpg)
86
Взаимодействие потоков
● Методы wait(), notify(), notifyAll()
● Для вызова этих методов поток должен иметь монитор данного объекта, поэтому они вызываются в синхронизированном блоке или методе.
● wait() - поток помещается в список ожидания и освобождает монитор. После выхода из списка ожидания, он может получить монитор, и завершить метод wait.
● notify() - выводит из списка ожидания один из потоков.
● notifyAll() - выводит из списка ожидания все потоки.
![Page 87: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/87.jpg)
87
Диаграмма работы wait/notify
class A {
boolean flag = false;
int value;
synchronized void put(int i) {
while(flag) { wait(); }
flag = true; value = i;
notifyAll();
}
synchronized int get() {
while(!flag) { wait(); }
flag = false;
notifyAll();
return value;
}
}
start() start()
get() BLOCKED
wait()
WAITING put(5)
start() false 0
false 0
false 0
true 5
notify() true 5WAITING
notify()
WAITING
false 5FINISHED
BLOCKED
return 5
FINISHED
![Page 88: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/88.jpg)
88
Состояния потока
new
run()runnable
terminated
blocked
waiting
timedwaiting
start()
диспетчеризация
sleep(time)
wait()notify()
окончание работы
ожидание монитора synchronized
захват монитора synchronized
![Page 89: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/89.jpg)
89
Проблемы многопоточности
● Взаимная блокировка (deadlock)
● Ресурсное голодание (starvation)
● Зацикливание (livelock)
![Page 90: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/90.jpg)
90
пакет java.util.concurrent
● Исполнители● interface Executor : void execute(Runnable)
● interface ExecutorService : Future submit(Callable)
● interface Callable<V> : V call()
● interface Future<V> : V get()
● interface ScheduledExecutorService : ScheduledFuture schedule()
● Реализации● class ThreadPoolExecutor
● class ScheduledThreadPoolExecutor
● Вспомогательный класс● Executors
◊ создание ExecutorService, ScheduledExecutorService, Callable
![Page 91: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/91.jpg)
91
пакет java.util.concurrent.locks
● интерфейс Lock
Lock l = new ReentrantLock();
l.lock(); // tryLock()
try { /* доступ к защищенному ресурсу */ }
finally { l.unlock(); }
● интерфейс Condition
Condition c = l.newCondition();
l.lock();
try {
while(flag) { c.await(); }
flag = true;
c.signal();
} finally { l.unlock(); }
![Page 92: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/92.jpg)
92
пакет java.util.concurrent.atomic
● Содержит классы для реализации атомарных операций
class A {
AtomicInteger counter = new AtomicInteger(0);
public void up() { counter.incrementAndGet(); }
public void down() { counter.decrementAndGet(); }
}
![Page 93: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/93.jpg)
93
Ввод-вывод
![Page 94: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/94.jpg)
94
Пакет java.io
1)Байтовые и символьные потоки данных (I/O streams)● Поток — последовательность данных (байтов, символов,
примитивных типов, объектов)
● Входной поток — для чтения данных из источника
● Выходной поток — для записи данных в приемник
2)Старый интерфейс работы с файлами — класс File
![Page 95: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/95.jpg)
95
Потоки ввода-вывода
● Байтовые и символьные
● Входные и выходные
● Базовые абстрактные классы для потоков
java.io.InputStream java.io.OutputStream
java.io.Writerjava.io.Reader
![Page 96: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/96.jpg)
96
java.io.InputStream
● абстрактный метод int read()● возвращает байт от 0 до 255, если доступен
● если недоступен — блокируется и ждет
● если поток завершился — возвращает -1
● при ошибке — IOException
● реализованные методы:● int read(byte[] buffer, int len, int offset)
● int read(byte[] buffer)
● int available()
● long skip(long n)
● boolean markSupported()
● void mark(int limit)
● void reset()
● void close()
![Page 97: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/97.jpg)
97
java.io.Reader
● абстрактный метод int read(char[] buffer, int len, int offset)● читает символы в массив, возвращает число прочитанных (-1 при завершении)
● если недоступен — блокируется и ждет
● при ошибке — IOException
● abstract void close()
● реализованные методы:● int read()
● int read(char[] buffer)
● boolean ready()
● int available()
● long skip(long n)
● boolean markSupported()
● void mark(int limit)
● void reset()
![Page 98: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/98.jpg)
98
java.io.OutputStream
● абстрактный метод void write(int b)● записывает байт
● при ошибке — IOException
● реализованные методы:● void write(byte[] buffer, int len, int offset)
● void write(byte[] buffer)
● void flush()
● void close()
![Page 99: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/99.jpg)
99
java.io.Writer
● абстрактный метод void write(char[] buffer, int len, int offset)● записывает символы из массива
● при ошибке — IOException
● abstract void flush()
● abstract void close()
● реализованные методы:● void write(byte[] buffer, int len, int offset)
● void write(char[] buffer)
● void write(String str, int len, int offset)
● void write(String str)
● Writer append(char c)
● Writer append(CharSequence cs)
![Page 100: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/100.jpg)
100
Специализированные потоки
● Работают с определенным источником/приемником
● Обычно источник/приемник указывается в конструкторе● чтение/запись файла
◊ File (InputStream, OutputStream, Reader, Writer)
● чтение/запись массива
◊ ByteArray (InputStream, OutputStream)◊ CharArray (Reader, Writer)
● чтение/запись в конвейер (взаимодействие потоков выполнения)
◊ Piped (InputStream, OutputStream, Reader, Writer)◊ соединение потоков в конвейер
● передача парного потока в конструктор● вызов метода connect()
● чтение/запись строк (только символьные потоки)
◊ String (Reader, Writer)
![Page 101: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/101.jpg)
101
Потоки-фильтры
● Filter (InputStream, OutpurStream, Reader, Writer)● принимают исходный поток как аргумент конструктора
● получившийся поток-фильтр преобразует исходный поток
● Buffered (InputStream, OutpurStream, Reader, Writer)
● LineNumber (InputStream, Reader)
● Print (Stream, Writer)
● ZIP (InputStream, OutputStream)
● Data (InputStream, OutpurStream)
● Object (InputStream, OutpurStream)
● байты ↔ символы● InputStreamReader (байты в символы)
● OutputStreamWriter (символы в байты)
![Page 102: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/102.jpg)
102
PrintStream, PrintWriter
● методы print, println — один аргумент примитивного типа, строка или объект
● методы printf, format — много аргументов, первый из которых — форматная строка
● Синтаксис форматной строки● %[индекс$][флаги][размер][.точность]формат
● %% - символ процента
● %n — перевод строки
● индекс — порядковый номер аргумента или < (предыдущий)
● флаги — зависят от формата
● размер — количество символов для представления числа
● точность — цифры после запятой для дробных форматов
● format("%c = %2$+9.7f", 'π', Math.PI);
● π = +3,1415927
![Page 103: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/103.jpg)
103
Нечисловые форматы
● Общие - любой тип аргумента
● Заглавная буква формата - toUpperCase()):
● %b, %B - boolean● boolean, Boolean → значение
● null → false
● все остальное → true
● %h, %H — hashcode● null → null
● все остальное — 16-ричный хэш-код
● %s, %S — строка● Formattable → formatTo()
● все остальное → toString()
● %c, %C — символ Unicode
● %t, %T — префикс для форматов даты/времени
![Page 104: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/104.jpg)
104
Целые числа
● %d — десятичное целое
● %o — 8-ричное целое
● %x, %X — 16-ричное целое
Флаги
● '-' - левое выравнивание
● '#' - для недесятичных чисел — добавить 0 или 0x
● '+' - обязательно использовать знак
● ' ' - пробел на месте знака для положительных
● '0' — использовать ведущие нули
● ',' - использовать групповой разделитель для десятичных
● '(' - отрицательные — в скобках
поле размер — количество цифр в формате
![Page 105: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/105.jpg)
105
Числа с плавающей запятой
● %e, %E — научная нотация с мантиссой и порядком
● %f — десятичная нотация
● %g, %G — научная или десятичная (зависит от точности)
● %a, %A — 16-ричная с мантиссой и порядком
Флаги — такие же, как для целых
Точность — количество цифр после запятой● для %g/G — общее количество значащих цифр и 10точность —
максимальное число, представляемое в десятичной форме (минимальное — 10-4). По умолчанию =6, то есть как десятичные дроби представляются числа от 0,0001 до 999999
![Page 106: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/106.jpg)
106
Scanner
● Конструкторы● Scanner(File)
● Scanner(Path)
● Scanner(InputStream)
● Scanner(Readable)
● Scanner(String)
● Методы● boolean hasNext(), String next()
● Boolean hasNextInt(), int nextInt(),
● ….
● String nextLine()
● void useDelimiter(String)
● void useRadix(int)
![Page 107: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/107.jpg)
107
DataInputStream, DataOutputStream
● Преобразование примитивных типов и строк в последовательность байтов
● Последовательность при чтении должна быть такой же как и при записи
● Методы:● writeBoolean(boolean), writeByte(int), writeShort(int), writeInt(int),
writeLong(long), writeFloat(float), writeDouble(double), writeChar(int), writeUTF(String)
● bolean readBoolean(), byte readByte(), int readUnsignedByte() short readShort(), int readUnsignedShort(), int readInt(), long readLong(), float readFloat(), double readDouble(), char readUTF()
![Page 108: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/108.jpg)
108
Сериализация объектов
● Сериализация — запись объектов в виде потока байтов
● Классы ObjectOutputStream, ObjectInputStream
● Интерфейс Serializable - метка
● При записи объекты записываются с порядковым номером (serial number)
● Объект записывается в поток только один раз, потом используется ссылка на номер объекта
● При чтении одного и того же объекта из одного потока, он восстанавливается один раз
● При чтении объекта из двух потоков, объект восстанавливается дважды
![Page 109: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/109.jpg)
109
ObjectOutputStream, ObjectInputStream
● Те же методы, что и у DataOutputStream, DataInputStream
● + writeObject(Object)
● + Object readObject()
● Методы записывают/читают:● класс объекта
● сигнатуру класса (вычисляется как хэш-функция первых двух элементов дайджеста SHA-1 из имени и модификаторов класса, интерфейсов, типов и имен полей, имен и сигнатур конструкторов и методов)
● сигнатура класса может быть записана в поле serialVersionUID
● значения нестатических и непереходных полей данного класса, и всех его суперклассов
● поля с модификатором transient (переходные) не сериализуются
● поля записываются в поток иерархически
![Page 110: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/110.jpg)
110
Переопределение стандартной сериализации
● Методы в сериализуемом классе● private void writeObject(ObjectOutputStream os)
● private void readObject(ObjectInputStream is)
● в методах вызываются методы класса Object...Stream:
◊ os.defaultWriteObject()◊ is.defaultReadObject()
● методы заботятся только о своих данных (суперкласс не трогаем)
● интерфейс Externalizable● методы (обрабатывают весь объект, включая данные
суперкласса):
◊ writeExternal(ObjectOutput o)◊ readExternal(ObjectInput i)
![Page 111: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/111.jpg)
111
java.nio
● java.nio.Buffer — контейнер для хранения данных
● Создание буфера: allocate(capacity), wrap(array[])
● Методы:● limit(lim) и position(pos)
● mark() и reset() mark <-> position
● clear() - позиция = 0, граница = емкость
● flip() - граница = позиция, позиция = 0
● rewind() - позиция = 0
limit capacitypositionmark
get/put
![Page 112: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/112.jpg)
112
Запись и чтение данных
● методы get и put
● Относительная индексация (по текущей позиции)● позиция смещается после операции
● одиночные и групповые операции
● Абсолютная индексация (явное указание индекса)● позиция не меняется
● только одиночные
● Стандартное использование буфера — заполнение (запись), потом получение данных (чтение)
![Page 113: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/113.jpg)
113
Запись и чтение данных
● clear();
while () {
put(byte);
}
● flip();
while(hasRemaining()) {
get();
}
● rewind();
while(hasRemaining()) {
get();
}
![Page 114: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/114.jpg)
114
Классы-потомки Buffer
● ByteBuffer
● CharBuffer
● IntBuffer, ShortBuffer, LongBuffer, FloatBuffer, DoubleBuffer
![Page 115: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/115.jpg)
115
java.nio.charset
● Класс Charset● методы
● CharBuffer decode(ByteBuffer b)
● ByteBuffer encode(CharBuffer c)
![Page 116: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/116.jpg)
116
Каналы
● java.nio.channels
● Файловые каналы и сетевые каналы
● FileChannel● FileChannel.open(), FileInputStream.getChannel()
● write(ByteBuffer b) — запись в данный канал данных из буфера
● read(ByteBuffer b) — чтение из канала данных в буфер
● write для канала = get для буфера
● read для канала = put для буфера
● map() - получение MappedByteBuffer — отображение файла в память
![Page 117: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/117.jpg)
117
Работа с путями (java.nio.file.*)
● Класс Path — путь к файлу в файловой системе
● Paths — класс-помощник
● Path p1 = Paths.get("/home/s888888");
● Path p2 = Paths.get("C:\\Users\s888888");
● Path p3 =Paths.get("home", "s888888");
● Path p = Paths.get(System.getProperty("user.home"));
![Page 118: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/118.jpg)
118
Работа с файлами: проверки
● Класс Files● booelan Files.exists(Path)
● booelan Files.notExists(Path)
● booelan Files.isReadable(Path)
● booelan Files.isWritable(Path)
● booelan Files.isExecutable(Path)
![Page 119: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/119.jpg)
119
Работа с файлами: создание и удаление
● Path Files.createFile(Path)
● Path Files.createDirectory(Path)
● Path Files.createDirectories(Path)
● Path Files.createTempFile(String prefix, String suffix)
● Path Files.createLink(Path, Path)
● Path Files.createSymbolicLink(Path, Path)
● void Files.delete(Path)
● boolean Files.deleteIfExists(Path)
![Page 120: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/120.jpg)
120
Работа с файлами: копирование и перемещение
● Path Files.copy(Path, Path)
● Path Files.move(Path, Path)
![Page 121: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/121.jpg)
121
Работа с файлами: чтение и запись
● byte[] Files.readAllBytes(Path)
● List<String> Files.readAllLines(Path)
● Path Files.write(Path, byte[])
● Path Files.write(Path, Iterable<CharSequence>)
![Page 122: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/122.jpg)
122
java.lang.reflect
● Класс java.lang.Class
● Получение объекта класса Class● new A().getClass();
● Class.forName("A");
● A.class
● Методы● Field[] getFields()
● Method[] getMethods()
● Constructor[] getConstructors()
● isInterface()
● isArray()
![Page 123: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/123.jpg)
123
Многопоточность
![Page 124: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/124.jpg)
124
Потоки выполнения
● Процесс имеет собственный контекст исполнения, собственный набор ресурсов, свою выделенную память.
● Поток (thread) существует внутри процесса, делит память и ресурсы с другими потоками.
● Потоки в JVM● системные потоки:
◊ основной поток виртуальной машины◊ сборщик мусора◊ поток периодических задач◊ поток динамической компиляции
● прикладные потоки
◊ основной поток (main)◊ создаваемые программным путем
![Page 125: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/125.jpg)
125
Класс Thread и интерфейс Runnable
● public class Thread implements Runnable
● 2 варианта создания потока
1) public class A extends Thread {
public void run() { /* тело потока*/ }
}
new A().start;
2) public class A implements Runnable {
public void run() { /* тело потока */ }
}
new Thread(new A()).start();
![Page 126: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/126.jpg)
126
Приостановка и прерывание потока
● try {
Thread.sleep(1000); // спать 1 с
} catch (InterruptedException e) { }
● try {
t.join(1000); // ожидать завершения t в течение 1 с
} catch (InterruptedException e) { }
● t.interrupt(); // устанавливает флаг прерывания
● if (Thread.interrupted() { // сбрасывает флаг
throw new InterruptedException();
}
![Page 127: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/127.jpg)
127
Множественный доступ к переменным
class A {
int counter = 0;
public void up() { counter++; }
public void down() { counter--; }
}
1) получить значение counter
2) увеличить/уменьшить значение на 1
3) сохранить новое значение
1)00
1)00
2) 10
2)-10
3)-1-1
3)11
действиестек
counter
![Page 128: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/128.jpg)
128
Синхронизация
class A {
int counter = 0;
public synchronized void up() { counter++; }
public synchronized void down() { counter--; }
}
● Любой объект имеет монитор
● Поток может выполнить synchronized метод, только захватив монитор
● При выходе из метода поток освобождает монитор
● Для уменьшения времени захвата монитора используются блоки synchronized
synchronized(Object) { }
![Page 129: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/129.jpg)
129
Модификатор volatile
● Переменные класса — общие для всех потоков
● Потоки могут сохранять значения общих переменных в локальном кэше
● Модификатор volatile указывает, что доступ к этой переменной из потоков должен производиться напрямую
![Page 130: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/130.jpg)
130
Взаимодействие потоков
● Методы wait(), notify(), notifyAll()
● Для вызова этих методов поток должен иметь монитор данного объекта, поэтому они вызываются в синхронизированном блоке или методе.
● wait() - поток помещается в список ожидания и освобождает монитор. После выхода из списка ожидания, он может получить монитор, и завершить метод wait.
● notify() - выводит из списка ожидания один из потоков.
● notifyAll() - выводит из списка ожидания все потоки.
![Page 131: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/131.jpg)
131
Диаграмма работы wait/notify
class A {
boolean flag = false;
int value;
synchronized void put(int i) {
while(flag) { wait(); }
flag = true; value = i;
notifyAll();
}
synchronized int get() {
while(!flag) { wait(); }
flag = false;
notifyAll();
return value;
}
}
start() start()
get() BLOCKED
wait()
WAITING put(5)
start() false 0
false 0
false 0
true 5
notify() true 5WAITING
notify()
WAITING
false 5FINISHED
BLOCKED
return 5
FINISHED
![Page 132: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/132.jpg)
132
Состояния потока
new
run()runnable
terminated
blocked
waiting
timedwaiting
start()
диспетчеризация
sleep(time)
wait()notify()
окончание работы
ожидание монитора synchronized
захват монитора synchronized
![Page 133: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/133.jpg)
133
Проблемы многопоточности
● Взаимная блокировка (deadlock)
● Ресурсное голодание (starvation)
● Зацикливание (livelock)
![Page 134: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/134.jpg)
134
пакет java.util.concurrent
● Исполнители● interface Executor : void execute(Runnable)
● interface ExecutorService : Future submit(Callable)
● interface Callable<V> : V call()
● interface Future<V> : V get()
● interface ScheduledExecutorService : ScheduledFuture schedule()
● Реализации● class ThreadPoolExecutor
● class ScheduledThreadPoolExecutor
● Вспомогательный класс● Executors
◊ создание ExecutorService, ScheduledExecutorService, Callable
![Page 135: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/135.jpg)
135
пакет java.util.concurrent.locks
● интерфейс Lock
Lock l = new ReentrantLock();
l.lock(); // tryLock()
try { /* доступ к защищенному ресурсу */ }
finally { l.unlock(); }
● интерфейс Condition
Condition c = l.newCondition();
l.lock();
try {
while(flag) { c.await(); }
flag = true;
c.signal();
} finally { l.unlock(); }
![Page 136: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/136.jpg)
136
пакет java.util.concurrent.atomic
● Содержит классы для реализации атомарных операций
class A {
AtomicInteger counter = new AtomicInteger(0);
public void up() { counter.incrementAndGet(); }
public void down() { counter.decrementAndGet(); }
}
![Page 137: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/137.jpg)
137
java.lang.reflect
● Класс java.lang.Class
● Получение объекта класса Class● new A().getClass();
● Class.forName("A");
● A.class
● Методы● Field[] getFields()
● Method[] getMethods()
● Constructor[] getConstructors()
● isInterface()
● isArray()
![Page 138: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/138.jpg)
138
Вспомогательные классы
![Page 139: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/139.jpg)
139
Лямбда-выражения и функциональные интерфейсы
● λ-выражение — блок кода, предназначенный для объявления анонимной функции.
● λ-выражение — экземпляр функционального интерфейса.
● λ-выражение можно присвоить переменной, типом которой является функциональный интерфейс (целевой тип лямбда-выражения).
● Функциональный интерфейс — интерфейс, в котором определен один и только один абстрактный метод (не считая default и методов Object)
![Page 140: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/140.jpg)
140
Пример
@FunctionalInterface interface Comparator<T> {
public int compare(T obj1, T obj2);
}
public void sort(Comparator<T>) // метод сортировки
class X implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
sort(new X());
sort((String s1, String s2) -> s1.length() - s2.length());
![Page 141: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/141.jpg)
141
Синтаксис λ-выражений
(параметры) -> выражение
(параметры) -> { инструкции; }
(int x, int y) -> x + y
(x, y) -> x * y
() -> 42
(String s) -> System.out.println(s)
x -> x / 2
c -> { int s = c.size(); c.clear(); return s; }
● тип параметров — либо явно, либо из контекста
● может либо возвращать значение, либо не возвращать (void)
● круглые скобки можно опускать, если контекстный параметр один
![Page 142: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/142.jpg)
142
Захват переменных
● Область видимости λ-выражения = область видимости окружающего блока
● В λ-выражении можно использовать только эффективно финальные переменные из окружающего его блока
● λ-выражение захватывает значения переменных из окружающего блока.
● λ-выражение + значения захваченных переменных = замыкание (closure)
public static void repeatMessage(int count, String s) {
Runnable r = () -> {
for (int i = 0; i < count; i++) { println(s); }
}
new Thread(r).start();
}
![Page 143: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/143.jpg)
143
Ссылка на метод
● Если единственное, что делает λ-выражение — вызывает уже существующий метод, его можно заменить на ссылку на метод (method reference)
● s -> A.method(s) ~ A::method
● s -> a.method(s) ~ a::method
● (S s) -> s.method() ~ S::method
● s -> new A(s) ~ A::new
![Page 144: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/144.jpg)
144
Ссылка на метод (пример)
@FunctionalInterface FI { public String func(String s); }
public class Test {
public static String upper(String s) { return s.toUpperCase(); } public String lower(String s) { return s.toLowerCase(); }
public static void trans(FI f, String s) { println(f.func(s)); }
public static void main(String[] args) { Test t = new Test(); trans(Test::upper, "Hello"); // s -> upper(s), "Hello" trans(t::lower, "Hello"); // s -> t.lower(s), "Hello" trans(String::toLowerCase, "Hi"); // s -> s.toLowerCase(), "Hi" trans(String::new, "Hello"); // s -> new String() , "Hello" }}
![Page 145: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/145.jpg)
145
Функциональные интерфейсы
● java.lang.Runnable
void run();
● java.util.Comparator<T>
int compare(T o1, T o2);
● java.util.function.* - набор функциональных интерфейсов общего назначения для разных случаев
![Page 146: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/146.jpg)
146
Пакет java.util.function
● Supplier<R> { R get() }
● Consumer<T> { void accept(T t) }
● Predicate<T> { boolean test(T t) }
● Function<T,R> { R apply(T t) }● UnaryOperator<T> { T apply(T t) }
● BiFunction<T,U,R> { R apply(T t, U u) }● BinaryOperator<T> { T apply(T t1, T t2) }
![Page 147: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/147.jpg)
147
Пакет java.util.function
● int, long, double
● IntSupplier { int getAsInt() }
● IntConsumer { void accept(int value) }
● IntPredicate { boolean test(int value) }
● IntFunction<R> { R apply(int value) }
● IntUnaryOperator { int applyAsInt(int value) }
● IntBinaryOperator { int applyAsInt(int v1, int v2) }
● ToIntFunction<T> { int applyAsInt(T t) }
● ToIntBiFunction<T,U> { int applyAsInt(T t, U u) }
● ObjIntConsumer<T> { accept (T t, int value) }
![Page 148: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/148.jpg)
148
Пакет java.util.stream
● Конвейерная обработка данных
● Поток — последовательность элементов
● Поток может быть последовательным или параллельным
● Конвейер — последовательность операций
![Page 149: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/149.jpg)
149
Конвейеры и коллекции
● Отличия конвейера от коллекции● Элементы не хранятся
● Неявная итерация
● Функциональный стиль — операции не меняют источник
● Большинство операций работают с λ-выраженями
● Ленивое выполнение
● Возможность неограниченного числа элементов
![Page 150: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/150.jpg)
150
Состав конвейера
● Конвейер =● Источник
● Промежуточные операции (0 или больше)
● Завершающая операция
![Page 151: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/151.jpg)
151
Пример
List<String> words
1) long count = 0;
for (String s : words) {
if (s.length() > 5) count++;
}
2) long count = words.stream()
.filter(s -> s.length() > 5)
.count();
![Page 152: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/152.jpg)
152
Источники конвейера
Способы получения потока из источника:
● Collection.stream()
● Collection.parallelStream()
● Arrays.stream(Object[])
● Stream.of(Object[])
● IntStream.range(int, int)
● Stream.empty()
● Stream.generate(Supplier<T> s)
● Stream.iterate(T seed, UnaryOperator<T> f)
![Page 153: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/153.jpg)
153
Промежуточные операции
● Промежуточные операции возвращают поток
● Промежуточные операции выполняются "лениво" — фактически выполнение операции может быть задержано.
● Промежуточные операции делятся на:● Не хранящие состояние (stateless) — выполняются над
элементом вне зависимости от других элементов
● Хранящие состояние (stateful) — выполнение зависит от других элементов (например, сортировка)
![Page 154: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/154.jpg)
154
Завершающие операции
● Завершающие операции возвращают некий результат, либо имеют побочное действие. После завершающей операции поток прекращает существование.
![Page 155: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/155.jpg)
155
Классы и интерфейсы
● интерфейс BaseStream● void close()
● S parallel()
● S sequential()
● S unordered()
● Iterator iterator()
● Spliterator spliterator()
● Интерфейс Stream<T>
● Интерфейсы IntStream, LongStream, DoubleStream
![Page 156: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/156.jpg)
156
Spliterator
● Параллельный Iterator● Spliterator trySplit() — возвращает часть элементов как
отдельный сплитератор
● boolean tryAdvance(Consumer action) — выполнить операцию для очередного элемента
● void forEachRemaining(Consumer action) — выполнить операцию для всех оставшихся элементов
![Page 157: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/157.jpg)
157
Промежуточные операции
● Методы для промежуточных операций (stateless)
● Stream<T> filter (Predicate<T> p)● возвращает поток из элементов, соответствующих условию
● Stream<R> map(Function<T,R> mapper)● преобразует поток элементов T в поток элементов R
● Stream<R> flatMap(Function <T,Stream<R>> mapper)● преобразует каждый элемент потока T в поток элементов R
● Stream<T> peek(Consumer<T> action)● выполняет действие для каждого элемента потока T
![Page 158: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/158.jpg)
158
Промежуточные операции
● Методы для промежуточных операций (stateful)
● Stream<T> distinct()● возвращает поток неповторяющихся элементов
● Stream<T> sorted(Comparator<T> comp)● возвращает отсортированный поток
● Stream<T> limit(long size)● возвращает усеченный поток из size элементов
● Stream<T> skip(long n)● возвращает поток, пропустив n элементов
![Page 159: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/159.jpg)
159
Класс java.util.Optional<T>
● Оболочка, которая может содержать или не содержать значение
● boolean isPresent() - true, если значение есть
● T get() - возвращает значение
● Optional<T> of(T value) — возвращает оболочку со значением
● T orElse(T other) — возвращает значение, если есть, other, если нет
![Page 160: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/160.jpg)
160
Завершающие операции
● void forEach(Consumer<T> action)
● void forEachOrdered(Consumer<T> action)● выполняет действие для каждого элемента потока
● второй вариант гарантирует сохранение порядка элементов
● Optional<T> min(), Optional<T> max()● возвращают минимальный и максимальный элементы,
● long count(), int (long, double) sum()● возвращают количество и сумму элементов
![Page 161: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/161.jpg)
161
Завершающие операции
● T reduce(T identity, BinaryOperator<T> accumulator)● операция редукции — аккумулятор заменяется
T result = identity;
for (T element : stream) {
result = accumulator.apply(result, element);
}
return result;
.stream
.reduce(0, (a, b) -> a + b)
![Page 162: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/162.jpg)
162
Проверки
● boolean anyMatch(Predicate<T> p)● истина, если условие выполняется хотя бы для одного элемента
● При нахождении первого совпадения прекращает проверку
● boolean allMatch(Predicate<T> p)● истина, если условие выполняется для всех элементов.
● При нахождении первого несовпадения прекращает проверку
● boolean noneMatch(Predicate<T> p)● истина, если условие не выполняется ни для одного элемента.
● При нахождении первого совпадения прекращает проверку
![Page 163: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/163.jpg)
163
Пример
public static void main(String[] args) {
List<String> a = Arrays.asList(args);
a.stream()
.filter(s -> s.length() < 5)
.map(String::toUpperCase)
.sorted()
.forEachOrdered(System.out::println);
}
![Page 164: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/164.jpg)
164
Класс java.util.Random
● public Random()
● public Random(long seed)
● nextInt(), nextDouble, nextLong, nextGaussian
● IntStream ints()
● LongStream longs()
● DoubleStream doubles()
![Page 165: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/165.jpg)
165
Регулярные выражения
● Класс Pattern — представляет регулярное выражение
● Класс Matcher — движок, проверяющий соответствие
String regex = "a*b";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher("aaabbb");
boolean b = m.matches();
boolean b = Pattern.matches(regex, "aaabbb");
![Page 166: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/166.jpg)
166
Вспомогательные классы
![Page 167: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/167.jpg)
167
Контрольная
1)Классы-оболочки и их применение
2)Основные отличия коллекций HashMap, TreeMap и LinkedHashMap
3)Из каких состояний поток может перейти в состояние «выполняющийся» ?
![Page 168: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/168.jpg)
168
Лямбда-выражения и функциональные интерфейсы
● λ-выражение — блок кода, предназначенный для объявления анонимной функции.
● λ-выражение — экземпляр функционального интерфейса.
● λ-выражение можно присвоить переменной, типом которой является функциональный интерфейс (целевой тип лямбда-выражения).
● Функциональный интерфейс — интерфейс, в котором определен один и только один абстрактный метод (не считая default и методов Object)
![Page 169: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/169.jpg)
169
Пример
@FunctionalInterface interface Comparator<T> {
public int compare(T obj1, T obj2);
}
public void sort(Comparator<T>) // метод сортировки
class X implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
sort(new X());
sort((String s1, String s2) -> s1.length() - s2.length());
![Page 170: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/170.jpg)
170
Синтаксис λ-выражений
(параметры) -> выражение
(параметры) -> { инструкции; }
(int x, int y) -> x + y
(x, y) -> x * y
() -> 42
(String s) -> System.out.println(s)
x -> x / 2
c -> { int s = c.size(); c.clear(); return s; }
● тип параметров — либо явно, либо из контекста
● может либо возвращать значение, либо не возвращать (void)
● круглые скобки можно опускать, если контекстный параметр один
![Page 171: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/171.jpg)
171
Захват переменных
● Область видимости λ-выражения = область видимости окружающего блока
● В λ-выражении можно использовать только эффективно финальные переменные из окружающего его блока
● λ-выражение захватывает значения переменных из окружающего блока.
● λ-выражение + значения захваченных переменных = замыкание (closure)
public static void repeatMessage(int count, String s) {
Runnable r = () -> {
for (int i = 0; i < count; i++) { println(s); }
}
new Thread(r).start();
}
![Page 172: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/172.jpg)
172
Ссылка на метод
● Если единственное, что делает λ-выражение — вызывает уже существующий метод, его можно заменить на ссылку на метод (method reference)
● s -> A.method(s) ~ A::method
● s -> a.method(s) ~ a::method
● (S s) -> s.method() ~ S::method
● s -> new A(s) ~ A::new
![Page 173: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/173.jpg)
173
Ссылка на метод (пример)
@FunctionalInterface FI { public String func(String s); }
public class Test {
public static String upper(String s) { return s.toUpperCase(); } public String lower(String s) { return s.toLowerCase(); }
public static void trans(FI f, String s) { println(f.func(s)); }
public static void main(String[] args) { Test t = new Test(); trans(Test::upper, "Hello"); // s -> upper(s), "Hello" trans(t::lower, "Hello"); // s -> t.lower(s), "Hello" trans(String::toLowerCase, "Hi"); // s -> s.toLowerCase(), "Hi" trans(String::new, "Hello"); // s -> new String() , "Hello" }}
![Page 174: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/174.jpg)
174
Функциональные интерфейсы
● java.lang.Runnable
void run();
● java.util.Comparator<T>
int compare(T o1, T o2);
● java.util.function.* - набор функциональных интерфейсов общего назначения для разных случаев
![Page 175: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/175.jpg)
175
Пакет java.util.function
● Supplier<R> { R get() }
● Consumer<T> { void accept(T t) }
● Predicate<T> { boolean test(T t) }
● Function<T,R> { R apply(T t) }● UnaryOperator<T> { T apply(T t) }
● BiFunction<T,U,R> { R apply(T t, U u) }● BinaryOperator<T> { T apply(T t1, T t2) }
![Page 176: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/176.jpg)
176
Пакет java.util.function
● int, long, double
● IntSupplier { int getAsInt() }
● IntConsumer { void accept(int value) }
● IntPredicate { boolean test(int value) }
● IntFunction<R> { R apply(int value) }
● IntUnaryOperator { int applyAsInt(int value) }
● IntBinaryOperator { int applyAsInt(int v1, int v2) }
● ToIntFunction<T> { int applyAsInt(T t) }
● ToIntBiFunction<T,U> { int applyAsInt(T t, U u) }
● ObjIntConsumer<T> { accept (T t, int value) }
![Page 177: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/177.jpg)
177
Класс java.util.Random
● public Random()
● public Random(long seed)
● nextInt(), nextDouble, nextLong, nextGaussian
● IntStream ints()
● LongStream longs()
● DoubleStream doubles()
![Page 178: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/178.jpg)
178
Регулярные выражения
● Класс Pattern — представляет регулярное выражение
● Класс Matcher — движок, проверяющий соответствие
String regex = "a*b";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher("aaabbb");
boolean b = m.matches();
boolean b = Pattern.matches(regex, "aaabbb");
![Page 179: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/179.jpg)
179
Графический интерфейс
![Page 180: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/180.jpg)
180
AWT, Swing, SWT, JavaFX
● AWT — Abstract Window Toolkit● библиотека, зависимая от графической подсистемы ОС
● разный вид на разных платформах
● Swing● надстройка над AWT в виде легковесных Java-компонентов
● изменяемый вид компонентов
● SWT● Часть Eclipse, компоненты-оболочки для компонентов ОС
● Недостающий функционал написан на Java
● JavaFX ● новая графическая библиотека с улучшенной поддержкой
анимации и визуальных эффектов, возможностью задания интерфейса с помощью XML и стилей с помощью CSS
![Page 181: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/181.jpg)
181
Создание графических приложений
1) Создание главного окна
2) Создание остальных компонентов интерфейса
3) Размещение компонентов интерфейса в главном окне
4) Обеспечение реакции компонентов на события
![Page 182: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/182.jpg)
182
Класс java.awt.Component
● Компонент — отображаемый и взаимодействующий с пользователем элемент GUI
● java.awt.Component - абстрактный класс — элемент GUI
● задает размер, цвет, область отображения
● порождает основные события
![Page 183: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/183.jpg)
183
Методы класса Component
● Цвет текста и цвет фона
Color getForeground() void setForeground(Color)
Color getBackground() void setBackground(Color)
● Класс Color● Константы Color.BLACK, Color.WHITE, Color.RED ...
● Конструкторы Color(r, g, b [,a]), Color(int [,boolean])
◊ r,g,b,[a] — int (0-255), float (0.0-1.0), int (0x[AA]RRGGBB)
● Методы
◊ getRed(), getGreen(), getBlue(), getAlpha()◊ brighter(), darker()
![Page 184: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/184.jpg)
184
Методы класса Component
● Шрифт
Font getFont() void setFont(Font)
● Класс Font● физические (Arial, Times) и логические (Dialog, DialogInput, Serif,
SansSerif, Monospaced)
● Константы:
◊ Font.DIALOG, Font.MONOSPACED, Font.SERIF, Font.SANS_SERIF◊ Font.PLAIN, Font.BOLD, Font.ITALIC
● Конструктор Font(String name, int style, int size)
● Методы
◊ String getFontName(), int getStyle(), int getSize()
![Page 185: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/185.jpg)
185
Методы класса Component
● Положение и размеры
void setBounds(Rectangle) Rectangle getBounds()
void setLocation(Point) Point getLocation()
void setSize(Dimension) Dimension getSize()
● Класс Point (int x, int y)● getX(), getY(), setLocation(x,y)
● Класс Dimension (int height, int width)● getHeight(), getWidth(), setSize(h, w)
● Класс Rectangle (int x, int y, int height, int width)● getX(), getY(), getHeight(), getWIdth(), getLocation(), getSize()
● setLocation(x,y), setSize(h,w), setBounds(x,y,h,w)
![Page 186: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/186.jpg)
186
Методы класса Component
● Видимость и активность
boolean isVisible() void setVisible(boolean)
boolean isEnabled() void setEnabled(boolean)
● Компоненты изначально видимы, кроме основных окон, им надо явно вызывать метод setVisible(true)
● Компоненты изначально активны (воспринимают действия пользователя и порождают события)
![Page 187: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/187.jpg)
187
Методы класса Component
● Дополнительное рисование
void paint(Graphics) void update(Graphics) void repaint()
● Graphics — графический контекст компонента
● Метод paint должен содержать весь код отрисовки
● 2 варианта вызова paint — системный и программный
● Системный — первое отображение, изменение размера, необходимость перерисовки
● JVM вызывает paint(Graphics)
● Программный — изменение состояния компонента
● в программе вызывается repaint()● регистрируется событие отрисовки● JVM вызывает update(Graphics)
![Page 188: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/188.jpg)
188
Класс java.awt.Container
● Контейнер — компонент, на котором располагаются другие компоненты
● extends java.awt.Component
● Компонент может находиться только в одном контейнере
● Методы:● add(Component)
● setLayout(LayoutManager)
● validate()
![Page 189: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/189.jpg)
189
Основные компоненты и контейнеры AWT
java.lang.Object
java.awt.Component
Label
Choice
List
Button
Checkbox
Scrollbar
Canvas
TextComponent
TextAreaTextField
MenuComponent
MenuItem MenuBar
Menu
CheckboxMenuItem
PopupMenu
Container
PanelWindow
DialogFrame
![Page 190: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/190.jpg)
190
Менеджер компоновки
● Интерфейс LayoutManager● Container.setLayout(LayoutManager)
● Container.add(Component)
● Интерфейс LayoutManager2● Container.setLayout(LayoutManager2, Object constraints)
● Container.add(Component, Object constraint)
● Расстановка элементов● Container.validate()
● Container.invalidate()
● Управление размером компонентов● Component.getPreferredSize()
● Component.getMinimumSize()
● Component.getMaximumSize()
![Page 191: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/191.jpg)
191
FlowLayout
● Заполнение контейнера слева направо (или справа налево) построчно
● Компоненты сохраняют свой размер preferredSize
● Управление размещением:● setHgap(int), setVgap(int) // 5
● setAlignment(LEFT, RIGHT, CENTER) // CENTER
1 2 3
4
![Page 192: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/192.jpg)
192
GridLayout
● Контейнер делится одинаковые ячейки по строкам и столбцам
● Все компоненты будут одного размера
● GridLayout(int rows, int cols)
● Управление размещением:● setHgap(int), setVgap(int) // 0
● setRows(int), setColumns(int) // 1, 0
1 2 3
4
![Page 193: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/193.jpg)
193
GridBagLayout
● Контейнер делится на ячейки по строкам и столбцам
p.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridX = 0; c.gridY = 0; c.fill = GridBagConstraints.BOTH;
p.add(new Button("1"), c);
c.gridX = GridBagConstraints.RELATIVE;
p.add(new Button("2"), c); p.add(bew Button("3"), c);
c.gridY = 1; c.gridX = 1; c.gridWidth = 2;
c.fill = GridBagConstraints.NONE; p.add(new Button("4"), c);
1 2 3
4
![Page 194: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/194.jpg)
194
CardLayout
● Несколько компонентов отображаются в одном месте
CardLayout cl = new CardLayout();
p.setLayout(cl);
p.add(new Button("1"), "Card1");
p.add(new Button("2"), "Card2");
cl.show(p,"Card1");
cl.show(p,"Card2");
1
2
![Page 195: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/195.jpg)
195
BorderLayout
● Компоненты располагаются в 5 областях
● p.add(new Button("1"), BorderLayout.NORTH);
BorderLayout.NORTH
BorderLayout.SOUTH
BorderLayout.NORTH
BorderLayout.WEST
BorderLayout.EASTBorderLayout.CENTER
![Page 196: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/196.jpg)
196
Обработка событий
● Источник события — любой компонент
● Событие — потомок класса AWTEvent
● Обработчик события — реализует интерфейс XListener и соответствующие методы, в которых располагается код обработки события. Методу передается объект события
class A implements ActionListener {
Button b = new Button("OK");
Label l = new Label("Button pressed");
l.setVisible(false);
b.addActionListener(this);
......
public void actionPerformed(ActionEvent e) {
l.setVisible("true");
}
![Page 197: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/197.jpg)
197
Обработка событий анонимным классом
class A {
Button b = new Button("OK");
final Label l = new Label("Button pressed");
l.setVisible(false);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
l.setVisible("true");
}
});
![Page 198: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/198.jpg)
198
Обработка событий
● Компонент регистрирует слушателей в списке
● При наступлении события у всех слушателей из списка вызывается метод, соответствующий событию
● В объекте события хранится информация об источнике события (getSource), времени его наступления (getWhen) и другая информация, зависящая от типа события (например, координаты клика мышки)
● Низкоуровневые события — KeyEvent, MouseEvent, MouseMotionEvent
● Семантические события — ActionEvent, ItemEvent
![Page 199: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/199.jpg)
199
MouseListener, MouseMotionListener, MouseEvent
● MouseListener● mousePressed(MouseEvent)
● mouseReleased(MouseEvent)
● mouseClicked(MouseEvent)
● mouseEntered(MouseEvent)
● mouseExited(MouseEvent)
● MouseMotionListener● mouseDragged(MouseEvent)
● mouseMoved(MouseEvent)
● MouseEvent● getPoint()
● getLocationOnScreen()
● getButton()
● getClickCount()
![Page 200: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/200.jpg)
200
Классы-адаптеры
● class X implements MouseListener {
public void mousePressed(MouseEvent e) {
// обработка нажатия кнопки мыши
}
// обработка других событий не требуется
public void mouseClicked(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
....
}
● class Y extends MouseAdapter {
public void mousePressed(MouseEvent e) { ... }
}
![Page 201: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/201.jpg)
201
KeyListener, KeyEvent
● KeyListener● keyPressed(KeyEvent)
● keyReleased(KeyEvent)
● keyTyped(KeyEvent)
● KeyEvent● getKeyChar() // для keyTyped()
● getKeyCode() // для keyPressed, keyReleased
● getModifiers() // Shift, Alt, Ctrl, Meta ...
● getKeyLocation() // Standard, Left, Right, Numpad, Unknown
![Page 202: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/202.jpg)
202
WindowListener, WindowEvent
● WindowListener● windowOpened(WindowEvent)
● windowClosing(WindowEvent)
● windowClosed(WindowEvent)
● windowActivated(WindowEvent)
● windowDeactivated(WindowEvent)
● windowIconified(WindowEvent)
● windowDeiconified(WindowEvent)
● WindowEvent● getNewState()
● getOldState()
● getOppositeWindow()
![Page 203: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/203.jpg)
203
ActionListener, ActionEvent
● ActionListener● actionPerformed(ActionEvent)
● ActionEvent● нажата кнопка
● двойной клик в списке
● выбор пункта меню
● клавиша Enter в текстовом поле
![Page 204: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/204.jpg)
204
AdjustmentListener, AdjustmentEvent
● AdjustmentListener● adjustmentValueChanged(AdjustmentEvent)
● AdjustmentEvent● int getValue()
● boolean getValueIsAdjusting()
![Page 205: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/205.jpg)
205
ItemListener, ItemEvent
● ItemListener● itemStateChanged(ItemEvent)
● ItemEvent● Object getItem()
● int getStateChange() // selected-deselected
● установка-сброс флажка
● установка-сброс пункта меню
● выбор элемента списка
![Page 206: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/206.jpg)
206
TextListener, TextEvent
● TextListener● textValueChanged(TextEvent)
● TextEvent● изменился текст в текстовом компоненте
![Page 207: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/207.jpg)
207
Основные компоненты Swing
java.lang.Object
javax.swing.JComponent
JLabel
JComboBox
JList
JCheckbox
JScrollBar
JPanel
JTextComponent
JTextAreaJTextField
AbstractButton
JMenuItem JMenuBar
JMenu
JCheckboxMenuItem
JRadioButtonMenuItem
java.awt.Container
Window
DialogFrame
java.awt.Component
JFrame
JWindow
JDialog
JButton
JRadioButton
JToggleButton
JTable
JTree
![Page 208: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/208.jpg)
208
JFrame
● Не является легковесным компонентом — это окно ОС
● Содержит набор панелей для размещения компонентов
● При создании — невидимый
● JFrame.add() = JFrame.getContentPane.add()
JFrameJRootPane
JLayeredPaneJMenuBar
contentPaneglassPane
![Page 209: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/209.jpg)
209
Организация приложения Swing
public class Main {
public static void main(String... args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
gui();
}
});
}
private void gui() {
JFrame f = new JFrame();
...
f.setVisible(true);
}
}
![Page 210: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/210.jpg)
210
JFrame
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JLabel("Hello!"), BorderLayout.CENTER);
f.setJMenuBar(new JMenuBar());
f.pack(); // установка размеров фрейма
f.setVisible(true);
![Page 211: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/211.jpg)
211
JComponent
● extends java.awt.Container — может содержать картинку
● всплывающие подсказки — setToolTipText()
● построение основано на шаблоне MVC
● встроенная двойная буферизация при отрисовке
● реализация метода paint
void paint(Graphics g) { paintComponent(g); paintBorder(g); paintChildren(g);}
● Для отрисовки нужно переопределить paintComponent(g)
● Необходимо вызывать super.paintComponent(g);
![Page 212: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/212.jpg)
212
MVC и Swing
● MVC — Model, View, Controller
● Модель отвечает за поведение
● Представление — отвечает за отображение
● Контроллер — связывает модель и представление и управляет ими
● Реализация Swing — Model + UI Delegate
● UI Delegate = View + Controller
● Модель может быть визуальной или моделью данных
● Одну модель данных можно назначить разным компонентам
● В случае большого числа событий можно использовать ChangeEvent — изменение в модели.
![Page 213: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/213.jpg)
213
Модели и делегаты
● Модели — интерфейсы: ButtonModel, ListModel, ...
● Реализации моделей по умолчанию — классы, например: DefaultListModel, DefaultTableModel
● Для сложных моделей дополнительно имеются классы абстрактных моделей, предназначенные для облегчения написания своих классов на их основе. Например, AbstractTableModel, AbstractTreeModel
● Делегаты — потомки класса javax.swing.plaf.ComponentUI, например, ButtonUI, ListUI
● Для управления делегатами предназначен класс javax.swing.UIManager
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(frame);
frame.pack();
![Page 214: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/214.jpg)
214
Менеджеры компоновки Swing
● BoxLayout● Компоненты располагаются в один ряд вертикально или
горизонтально
● Класс Box — контейнер с BoxLayout
● Box.createHorizontalBox()
● Box.createVerticalBox()
● createRigidArea(Dimension)
● createHorizontalGlue()
● createVerticalGlue()
● Filler(minSize, prefSize, maxSize)
![Page 215: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/215.jpg)
215
Менеджеры компоновки Swing
● GroupLayout● Все компоненты описываются дважды — горизонтальное
расположение и вертикальное расположение
● Все компоненты являются участниками групп — последовательных и параллельных
GroupLayout gl = new GroupLayout(p);gl.setVerticalGroup( gl.createSequentialGroup() .addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(c1) .addComponent(c2) .addComponent(c3)) .addComponent(c4));
gl.setHorizontalGroup( gl.createSequentialGroup() .addComponent(c1) .addGroup(gl.createParallelGroup(GroupLayout.Alignment.LEADING) .addCompoment(c2) .addComponent(c4)) .addComponent(c3));
с1 с2 с3
с4
![Page 216: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/216.jpg)
216
Менеджеры компоновки Swing
● SpringLayout● Все компоненты соединены пружинами (Spring), которые имеют
минимальную, максимальную и предпочтительную длину
● Между краями соседних компонентов устанавливаются соответствующие пружины, в итоге получается компоновка, в определенных пределах растягивающаяся и сжимающаяся
● Обычно используется автоматическими расстановщиками
с1 с2 с3
с4
![Page 217: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/217.jpg)
217
JLabel
● Метка изначально прозрачная. Если нужна непрозрачная метка, то вызывается метод setOpaque(true)
![Page 218: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/218.jpg)
218
JTextField, JTextArea
● Конструктор принимает строку
● Могут быть редактируемыми и нет
● События — ActionEvent, DocumentEvent
![Page 219: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/219.jpg)
219
JButton, JCheckBox, JRadioButton
● Конструктор принимает строку
● Для JCheckBox и JRadioButton — еще состояние (boolean)
● JRadioButton используется в группе ButtonGroup
● События — ● ActionEvent для JButton, JRadioButton
● ItemEvent для JCheckBox (позволяет отследить select-deselect)
● Модель — DefaultButtonModel — элемент с двумя состояниями
● Почти так же обрабатываются JMenuItem, JMenu, JCheckBoxMenuItem, JRadioButtonMenuItem
![Page 220: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/220.jpg)
220
JList
● Конструктор принимает массив или вектор объектов
● Основное событие — ListSelectionEvent
● Модель DefaultListModel — модель данных (вектор), DefaultListSelectionModel — модель вариантов выбора (одиночный, интервальный, множественный)
![Page 221: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/221.jpg)
221
JComboBox
● Может быть редактируемым и нередактируемым
● Конструктор принимает массив или вектор объектов
● Основное событие — ActionEvent, иногда ItemEvent
● Модель DefaultComboBoxModel реализует 3 интерфейса — ListModel, ComboBoxModel и MutableComboBoxModel.
● По сравнению с ListModel — ComboBoxModel вводит понятие выбранный элемент (отображаемый)
![Page 222: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/222.jpg)
222
JSpinner
● Составной компонент — 2 кнопки и редактор значений
● Конструктор принимает модель SpinnerModel
● Основное событие — ChangeEvent
● 3 готовых модели — SpinnerListModel, SpinnerDateModel, SpinnerNumberModel + AbstractSpinnerModel
● 3 готовых редактора — JSpinner.ListEditor, JSpinner.DateEditor, JSpinner.NumberEditor
![Page 223: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/223.jpg)
223
JSlider
● Составной компонент — 2 кнопки и редактор значений
● Конструктор принимает min и max значения
● Основное событие — ChangeEvent
● Модель — DefaultBoundedRangeModel — еще используется для JProgressBar
![Page 224: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/224.jpg)
224
JPanel
● Универсальный контейнер
● По умолчанию — FlowLayout
![Page 225: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/225.jpg)
225
AWT, Swing, SWT, JavaFX
● AWT — Abstract Window Toolkit● библиотека, зависимая от графической подсистемы ОС
● разный вид на разных платформах
● Swing● надстройка над AWT в виде легковесных Java-компонентов
● изменяемый вид компонентов
● SWT● Часть Eclipse, компоненты-оболочки для компонентов ОС
● Недостающий функционал написан на Java
● JavaFX ● новая графическая библиотека с улучшенной поддержкой
анимации и визуальных эффектов, возможностью задания интерфейса с помощью XML и стилей с помощью CSS
![Page 226: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/226.jpg)
226
Основные концепции SWT
● Компоненты интерфейса (виджеты) — по возможности виджеты ОС
● Коммуникации между JVM и виджетами — с помощью JNI (Java Native Interface)
● Если виджет недоступен в ОС — он эмулируется JVM
![Page 227: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/227.jpg)
227
Виджеты
● Класс org.eclipse.swt.widgets.Widget — предок всех элементов интерфейса.
● Виджеты создаются, уничтожаются, извещают о событиях
● Класс Control — предок оконных элементов управления
● Класс Item — предок всех неоконных элементов, которые распологаются внутри элементов управления
● Пакет org.eclipse.swt.widgets — виджеты ОС
● Пакет org.eclipse.swt.custom — виджеты Java
![Page 228: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/228.jpg)
228
Composite
● Элементы управления, которые могут содержать другие элементы управления
● Аналог контейнера в Swing
![Page 229: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/229.jpg)
229
Display, Shell
● org.eclipse.swt.widgets.Display — класс-прослойка между SWT и ОС.
● Дисплей обеспечивает цикл обработки событий.
● Shell — класс, представляющий окно, которым управляет менеджер окон.
● Окно, связанное с дисплеем — окно верхнего уровня.
● Окно, связанное с другим окном — диалог.
![Page 230: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/230.jpg)
230
Цикл обработки событий
Display display = new Display();
Shell sh = new Shell(display);
sh.setLayout(new FillLayout());
Label l = new Label(sh, SWT.BORDER);
l.setText("Hello!");
l.pack
sh.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
![Page 231: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/231.jpg)
231
Класс org.eclipse.swt.SWT
● Содержит стили виджетов
● Button button = new Button(shell, SWT.PUSH);
![Page 232: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/232.jpg)
232
Обработка событий
Button b = new Button(sh, SWT.PUSH);
b.setText("Press me");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
l.setText("Goodbye!");
}
});
b.pack();
![Page 233: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/233.jpg)
233
JavaFX
![Page 234: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/234.jpg)
234
JavaFX
● JavaFX — новая библиотека для разработки RIA (Rich Internet Applications)
● Поддержка XML для создания интерфейса
● Поддержка стилей CSS
● Поддержка 2D- и 3D-графики ● Prism — поддерживает DirectX, OpenGL, аппаратное ускорение
● GWT (Glass Windowing Toolkit) — связь с ОС
● Quantum — управление потоками, связь Prism и GWT
● Легковесные компоненты
● Интеграция с библиотекой Swing
![Page 235: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/235.jpg)
235
javafx.application
● javafx.application.Application — класс-предок всех приложений JavaFX
● void init() — инициализация приложения (стартовый поток)
● abstract void start(Stage s) — основной поток приложения
● void stop() — освобождение ресурсов
● public static void launch(String args) — запуск приложения
![Page 236: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/236.jpg)
236
javafx.stage
● javafx.stage.Stage — основная платформа
● Контейнер верхнего уровня (аналог Jframe)
● Предоставляется системой при запуске приложения
● Обеспечивает связь с графической подсистемой ОС● setTitle(String)
● setScene(Scene)
● show()
![Page 237: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/237.jpg)
237
javafx.scene
● javafc.scene.Scene — контейнер для элементов сцены
● Должен быть хотя бы один объект класса Scene
● Элементы сцены — узлы (Node)
● Узлы образуют граф (scene graph)
● Граф включает не только контейнеры и компоненты, но также графические примитивы (текст и графические примитивы)
● Узел с дочерними узлами — Parent (extends Node)
● Корневой узел (root node) — узел без родительского узла
● Scene sc = new Scene(root node,300,150);
![Page 238: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/238.jpg)
238
Node
● Свойства (properties)● String id
● Parent (только один)
● Scene
● Стиль (styleClass, style)
● Видимость, активность, прозрачность
● Размеры (min, max, preferred)
● Границы (bouundsInLocal, boundsInParent, layoutBouunds)
● Трансформации (сдвиг, вращение, масштаб, наклон)
● Эффекты
● События (mouse, key, drag, touch, rotate, scroll, swipe, zoom)
![Page 239: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/239.jpg)
239
Основные компоненты JavaFX
Node
Slider
ComboBoxBase
ListView
Checkbox
ScrollBar
Spinner
TextInputControl
TextAreaTextField
Labeled
Cell Label
Region
Pane
Parent
ButtonBase
Hyperlink
ToggleButton
TableView
TreeView
FlowPane
BorderPane
StackPane
GridPane
Button
RadioButton
DateCellIndexedCell
ListCell
TableCell
TreeCell
Canvas ImageView Shape2D
Chart
Group WebView
Control
Shape3D
![Page 240: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/240.jpg)
240
Hello World!
import javafx.application.*;import javafx.stage.*;import javafx.scene.*;import javafx.scene.control.*;import javafx.scene.layout.*;
public class Hello extends Application { public void start(Stage stage) { FlowPane fp = new FlowPane(); fp.getChildren().add(new Label("Hello World!")); stage.setScene(new Scene(fp,100,200)); stage.show(); } public static void main(String... args) { launch(args); }}
![Page 241: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/241.jpg)
241
Контейнеры с компоновкой
● BorderPane — top, bottom, left, right, center
● HBox, VBox — в один ряд по горизонтали/вертикали
● StackPane — один над другим
● GridPane — сетка (таблица)
● FlowPane — последовательно с переносом
● TilePane — равномерные ячейки
● AnchorPane — привязка к границам родителя
![Page 242: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/242.jpg)
242
Обработка событий
● Событие: javafx.event.Event● ActionEvent extends Event
● Обработчик: javafx.event.EventHandler<T extends Event>● void handle(T event)
● Регистрация: ● setOnAction(EventHandler<T>)
Label label = new Label();
Button button = new Button("Нажми меня");
button.setOnAction((ae) → { label.setText("Спасибо");} )
![Page 243: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/243.jpg)
243
Приложение Swing
import javax.swing.*;import java.awt.*;import java.awt.event.*;
public class SwingApp { public SwingApp() { JFrame frame = new JFrame("Hello"); JLabel label = new JLabel(""); JButton button = new JButton("OK"); frame.getContentPane().setLayout(new FlowLayout()); frame.getContentPane().add(label); frame.getContentPane().add(button); button.addActionListener((ae) -> {label.setText("Привет!");}); frame.setSize(240, 120); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { new SwingApp(); }); }}
![Page 244: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/244.jpg)
244
Приложение SWT
import org.eclipse.swt.events.*;import org.eclipse.swt.widgets.*;import org.eclipse.swt.layout.*;import org.eclipse.swt.*;
public class SWTApp { public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setText("Hello"); shell.setSize(240,120); shell.setLayout(new FillLayout(SWT.HORIZONTAL)); Label label = new Label(shell,SWT.BORDER); Button button = new Button(shell, SWT.PUSH); button.setText("OK"); button.pack(); label.pack(); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { label.setText("Привет!"); } }); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); }}
![Page 245: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/245.jpg)
245
Приложение JavaFX
import javafx.application.*;import javafx.event.*;import javafx.geometry.Pos;import javafx.scene.control.*;import javafx.scene.*;import javafx.stage.*;import javafx.scene.layout.*;import javafx.scene.effect.*;
public class FXApp extends Application { public void start(Stage stage) { stage.setTitle("Hello"); FlowPane root = new FlowPane(); Label label = new Label(; Button button = new Button("OK"); root.getChildren().add(label); root.getChildren().add(button); button.setOnAction((ae) -> label.setText("Привет!")); stage.setScene(new Scene(root,240,120)); stage.show(); } public static void main(String... args) { launch(args); }}
![Page 246: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/246.jpg)
246
Конвейерная обработка данных
![Page 247: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/247.jpg)
247
Пакет java.util.stream
● Конвейерная обработка данных
● Поток — последовательность элементов
● Поток может быть последовательным или параллельным
● Конвейер — последовательность операций
![Page 248: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/248.jpg)
248
Конвейеры и коллекции
● Отличия конвейера от коллекции● Элементы не хранятся
● Неявная итерация
● Функциональный стиль — операции не меняют источник
● Большинство операций работают с λ-выраженями
● Ленивое выполнение
● Возможность неограниченного числа элементов
![Page 249: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/249.jpg)
249
Состав конвейера
● Конвейер =● Источник
● Промежуточные операции (0 или больше)
● Завершающая операция
![Page 250: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/250.jpg)
250
Пример
List<String> words
1) long count = 0;
for (String s : words) {
if (s.length() > 5) count++;
}
2) long count = words.stream()
.filter(s -> s.length() > 5)
.count();
![Page 251: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/251.jpg)
251
Источники конвейера
Способы получения потока из источника:
● Collection.stream()
● Collection.parallelStream()
● Arrays.stream(Object[])
● Stream.of(Object[])
● IntStream.range(int, int)
● Stream.empty()
● Stream.generate(Supplier<T> s)
● Stream.iterate(T seed, UnaryOperator<T> f)
![Page 252: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/252.jpg)
252
Промежуточные операции
● Промежуточные операции возвращают поток
● Промежуточные операции выполняются "лениво" — фактически выполнение операции может быть задержано.
● Промежуточные операции делятся на:● Не хранящие состояние (stateless) — выполняются над
элементом вне зависимости от других элементов
● Хранящие состояние (stateful) — выполнение зависит от других элементов (например, сортировка)
![Page 253: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/253.jpg)
253
Завершающие операции
● Завершающие операции возвращают некий результат, либо имеют побочное действие. После завершающей операции поток прекращает существование.
![Page 254: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/254.jpg)
254
Классы и интерфейсы
● интерфейс BaseStream● void close()
● S parallel()
● S sequential()
● S unordered()
● Iterator iterator()
● Spliterator spliterator()
● Интерфейс Stream<T>
● Интерфейсы IntStream, LongStream, DoubleStream
![Page 255: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/255.jpg)
255
Spliterator
● Параллельный Iterator● Spliterator trySplit() — возвращает часть элементов как
отдельный сплитератор
● boolean tryAdvance(Consumer action) — выполнить операцию для очередного элемента
● void forEachRemaining(Consumer action) — выполнить операцию для всех оставшихся элементов
![Page 256: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/256.jpg)
256
Промежуточные операции
● Методы для промежуточных операций (stateless)
● Stream<T> filter (Predicate<T> p)● возвращает поток из элементов, соответствующих условию
● Stream<R> map(Function<T,R> mapper)● преобразует поток элементов T в поток элементов R
● Stream<R> flatMap(Function <T,Stream<R>> mapper)● преобразует каждый элемент потока T в поток элементов R
● Stream<T> peek(Consumer<T> action)● выполняет действие для каждого элемента потока T
![Page 257: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/257.jpg)
257
Промежуточные операции
● Методы для промежуточных операций (stateful)
● Stream<T> distinct()● возвращает поток неповторяющихся элементов
● Stream<T> sorted(Comparator<T> comp)● возвращает отсортированный поток
● Stream<T> limit(long size)● возвращает усеченный поток из size элементов
● Stream<T> skip(long n)● возвращает поток, пропустив n элементов
![Page 258: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/258.jpg)
258
Класс java.util.Optional<T>
● Оболочка, которая может содержать или не содержать значение
● boolean isPresent() - true, если значение есть
● T get() - возвращает значение
● Optional<T> of(T value) — возвращает оболочку со значением
● T orElse(T other) — возвращает значение, если есть, other, если нет
![Page 259: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/259.jpg)
259
Завершающие операции
● void forEach(Consumer<T> action)
● void forEachOrdered(Consumer<T> action)● выполняет действие для каждого элемента потока
● второй вариант гарантирует сохранение порядка элементов
● Optional<T> min(), Optional<T> max()● возвращают минимальный и максимальный элементы,
● long count(), int (long, double) sum()● возвращают количество и сумму элементов
![Page 260: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/260.jpg)
260
Завершающие операции
● T reduce(T identity, BinaryOperator<T> accumulator)● операция редукции — аккумулятор заменяется
T result = identity;
for (T element : stream) {
result = accumulator.apply(result, element);
}
return result;
.stream
.reduce(0, (a, b) -> a + b)
![Page 261: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/261.jpg)
261
Проверки
● boolean anyMatch(Predicate<T> p)● истина, если условие выполняется хотя бы для одного элемента
● При нахождении первого совпадения прекращает проверку
● boolean allMatch(Predicate<T> p)● истина, если условие выполняется для всех элементов.
● При нахождении первого несовпадения прекращает проверку
● boolean noneMatch(Predicate<T> p)● истина, если условие не выполняется ни для одного элемента.
● При нахождении первого совпадения прекращает проверку
![Page 262: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/262.jpg)
262
Пример
public static void main(String[] args) {
List<String> a = Arrays.asList(args);
a.stream()
.filter(s -> s.length() < 5)
.map(String::toUpperCase)
.sorted()
.forEachOrdered(System.out::println);
}
![Page 263: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/263.jpg)
263
Сетевое взаимодействие
![Page 264: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/264.jpg)
264
Сетевое взаимодействие
● Соединение клиент-сервер● Сервер предоставляет данные по запросу клиента
● IP-адрес и порт
● Протоколы транспортного уровня — TCP и UDP● TCP
◊ устанавливается соединение◊ подтверждение доставки◊ надежность передачи данных
● UDP
◊ без установление соединения◊ без подтверждения доставки◊ скорость передачи данных
● Протокол прикладного уровня - HTTP
![Page 265: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/265.jpg)
265
IP-адреса и DNS
● IPv4 и IPv6
● Класс InetAddress (Inet4Address, Inet6Address)
● DNS — Domain Name Service
● Методы InetAddress (статические)● InetAddress getLocalHost()
● InetAddress getByAddress(byte[] addr)
● InetAddress getByName(String name) — обращение к DNS
● Нестатические методы● byte[] getAddress
● String getHostName()
![Page 266: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/266.jpg)
266
Обмен по протоколу UDP
● java.net.DatagramPacket — дейтаграмма (передаваемые данные + служебная информация)
● java.net.DatagramSocket — сокет для обмена
● java.nio.channels.DatagramChannel — сетевой канал
![Page 267: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/267.jpg)
267
Пример обмена по протоколу UDP
DatagramPacket i = new DatagramPacket(b, b.length);s.receive(i);
DatagramPacket i = new DatagramPacket(b, b.length);s.receive(i);
// сервер
byte b[] = new byte[10];
// клиент
byte b[] = {0,1,2,3,4,5,6,7,8,9};
SocketAddress a = new InetSocketAddress(ADDR, PORT);DatagramSocket s = new DatagramSocket();
DatagramPacket o = new DatagramPacket(b, b.length, i.getAddress(), i.getPort());s.send(o);
DatagramPacket o = new DatagramPacket(b, b.length, a);s.send(o);
SocketAddress a = new InetSocketAddress(PORT);DatagramSocket s = new DatagramSocket();
for (byte i : b) { System.out.println(b);}
for (int i = 0; i < 10; i++) { b[i] *= 2;}
![Page 268: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/268.jpg)
268
Пример обмена по протоколу UDP
f.clear();a = s.receive(f);
// сервер
byte b[] = new byte[10];
// клиент
byte b[] = {0,1,2,3,4,5,6,7,8,9};
SocketAddress a = new InetSocketAddress(ADDR, PORT);DatagramChannel s = DatagramChannel.open();s.bind(null);ByteBuffer f = ByteBuffer.bind(b);
f.flip();s.send(f, a);
SocketAddress a = new InetSocketAddress(PORT);DatagramChannel s = DatagramChannel.open();s.bind(a);ByteBuffer f = ByteBuffer.bind(b);
for (byte i : b) { System.out.println(b);}
for (int i = 0; i < 10; i++) { b[i] *= 2;}
f.clear();a = s.receive(f);
f.flip();s.send(f, a);
![Page 269: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/269.jpg)
269
Обмен по протоколу TCP
● java.net.Socket — сокет для обмена
● java.net.ServerSocket — фабрика сокетов
● обмен данными через потоки ввода-вывода
● java.nio.channels.SocketChannel — сетевой канал
![Page 270: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/270.jpg)
270
Пример обмена по протоколу TCP
InputStream i = s.getInputStream();i.read(b);
Socket s = new Socket(ADDR, PORT);
OutputStream o = s.getOutputStream();o.write(b);
OutputStream o = s.getOutputStream();o.write(b);
ServerSocket ss = new ServerSocket(PORT);Socket s = ss.accept();
Arrays.stream(b) .forEach(System.out::println());
InputStream i = s.getInputStream();i.read(b);
// сервер
byte b[] = new byte[10];
// клиент
byte b[] = {0,1,2,3,4,5,6,7,8,9};
i.close(); o.close(); s.close(); i.close(); o.close(); s.close();ss.close();
for (int i = 0; i < 10; i++) { b[i] *= 2;}
![Page 271: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/271.jpg)
271
Пример обмена по протоколу TCP (NIO)
OutputStream o = s.getOutputStream();o.write(b);
InputStream i = s.getInputStream();i.read(b);
// сервер
byte b[] = new byte[10];
// клиент
byte b[] = {0,1,2,3,4,5,6,7,8,9};
s.close(); s.close();ss.close();
SocketAddress a = new InetSocketAddress(ADDR, PORT);
SocketChannel s = SocketChannel.open(a);ByteBuffer f = ByteBuffer.bind(b);
SocketAddress a = new InetSocketAddress(PORT);ServerSocketChannel ss = ServerSocketChannel.open();ss.bind(a);SocketChannel s = ss.accept();
ByteBuffer f = ByteBuffer.bind(b);
f.clear();a = s.read(f);
f.flip();s.write(f, a);
for (int i = 0; i < 10; i++) { b[i] *= 2;}
f.clear();a = s.read(f);
f.flip();s.write(f, a);
![Page 272: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/272.jpg)
272
Протокол HTTP
URL url = new URL("http://www.google.com");
InputStream is = url.openStream();
// is.read();
is.close();
URLConnection uc = url.getConnection();
uc.connect();
InputStream is = uc.getInputStream();
// is.read();
is.close();
uc.close()
![Page 273: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/273.jpg)
273
Шаблоны проектирования
![Page 274: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/274.jpg)
274
● Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. Приемы объектно-оринтированного проектирования. Паттерны проектирования
GoF — Gang of Four = Банда четырех
● Основные
● Порождающие
● Структурные
● Поведенческие
![Page 275: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/275.jpg)
275
Delegation
● Делегирование можно использовать вместо наследования в случаях динамического изменения поведения класса.
A
Role
A Delegate
m() m()
class A { public m() { }}
class Delegate { A obj;
public m() { return obj.m(); }
![Page 276: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/276.jpg)
Interface / Abstract Superclass
● Интерфейс убирает зависимость от реализации конкретного класса
● Наследование от абстрактного класса позволяет задавать общее поведение конкретных потомков
● TableModel <- AbstractTableModel <- DefaultTableModel
Client <<interface>> Service
AbstractService
DefaultService
![Page 277: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/277.jpg)
Immutable
● Основное использование — простая реализация параллельного доступа к объекту без синхронизации
● Запрещено изменять состояние объекта после его создания
● Если необходимо новое состояние объекта — создается новый объект
● String
![Page 278: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/278.jpg)
Marker Interface
● Показывает, реализует ли класс некоторое свойство
● Маркер — интерфейс без методов
● Serializable
![Page 279: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/279.jpg)
Factory Method
● Класс должен инициировать создание объектов, не имея информации о классах создаваемых объектов
Client<<interface>> Product <<interface>> Factory
ConcreteFactoryConcreteProduct
Product factoryMethod()
Product factoryMethod()
![Page 280: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/280.jpg)
Abstract Factory
● Необходимо создание множества совместно использующихся объектов
Client
<<interface>> P1
<<interface>> Factory
FactoryA
P1A
P1 createP1()P2 createP2()
<<interface>> P2
FactoryBP1B
P2A
P2B
![Page 281: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/281.jpg)
Builder
● Создание сложных объектов на основании только типа и содержимого без знания деталей реализации
Client<<interface>> Product
AbstractBuilder
ConcreteBuilderConcreteProduct
AbstractBuilder getInstance()buildPart1()buildPart2()
Product getProduct()
![Page 282: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/282.jpg)
Prototype
● Создание объектов путем копирования прототипов
Client
<<interface>> Cloneable
<<interface>> Proto
Prototype
clone()
clone()
![Page 283: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/283.jpg)
Singleton
● Единственный экземпляр класса
● private конструктор
● public метод getInstance()
![Page 284: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/284.jpg)
Adapter
● Адаптирует произвольный класс для вызова через необходимый клиенту интерфейс
Client <<interface>>Target
method()
Adapter
method()
AnyClass
other()
![Page 285: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/285.jpg)
Bridge
● Связывает иерархию абстракций и иерархию реализаций
Abstraction
Special
method()
method1()
AbstractionImpl
other()
SpecialImpl
other1()
Impl1
Impl2
Spec1
Spec2
![Page 286: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/286.jpg)
Composite
● Для построения иерархических структур
<<interface>> Component
AbstractComponent Composite
SimpleComponent
add(Component)remove(Component)
Component[] getChildren()
![Page 287: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/287.jpg)
Decorator
● Добавляет объекту функциональность динамически
<<interface>> Service
Decorated Decorator
Dec1 Dec2
![Page 288: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/288.jpg)
Facade
● Предоставляет простой доступ к сложным подсистемам
FacadeClient
![Page 289: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/289.jpg)
Flyweight
● Для поддержки множества мелких объектов, которые образуют группы с одинаковым состоянием
AbstractFlyweight
SharedFlyweight UnsharedFlyweightFlyweightFactory
Client
![Page 290: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/290.jpg)
Proxy
● Замещает объект, создание которого требует времени, создавая его только в случае необходимости
SlowServiceServiceProxy
<<interface>>ServiceClient
![Page 291: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/291.jpg)
Chain of Responsibility
● Передача запроса по цепочке обработчиков
Client Handler
Hand1 Hand2
![Page 292: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/292.jpg)
Command
● Управление командами
Invoker
Receiver
action()cancel()
<<interface>> Command
ConcreteCommand
execute()undo()
execute()undo()
![Page 293: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/293.jpg)
Interpreter
● Позволяет управлять поведением с помощью простого языка
Client <<interface>> Expression
Terminal Non-Terminal
![Page 294: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/294.jpg)
Iterator
Client<<interface>> Collection <<interface>> Iterator
ConcreteIteratorConcreteCollection
hasNext()next()
hasNext()next()
● Последовательный доступ к элементам коллекции
![Page 295: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/295.jpg)
Mediator
● Класс-посредник для управления изменением состояния других объектов
<<interface>> Mediator <<interface>> Colleague
Mediator
C1
C2
![Page 296: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/296.jpg)
Memento
● Хранение и восстановление состояния объекта
Caretaker
<<interface>> Memento
<<static inner>> Mem Originator
Memento createMemento()setMemento(Memento)
![Page 297: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/297.jpg)
Observer
● Оповещение объектов об изменении состояния
<<interface>> Observer<<interface>> Observable
ConcreteObservableConcreteObserveer
attach(Observer)detach(Observer)
update()
![Page 298: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/298.jpg)
State
● Изменяет поведение объекта в зависимости от состояния
Context State
S1 S2
State currentState
![Page 299: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/299.jpg)
Strategy
● Выбор одного из алгоритмов, реализованных в классе
Context Strategy
S1 S2
State currentState
![Page 300: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/300.jpg)
Template Method
● Позволяет реализовать часть поведения в базовом классе, остальное реализуется в подклассах
Abstract Class
template()operation1()operation2()
Concrete Class
operation1()operation2()
![Page 301: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/301.jpg)
Visitor
● Позволяет сгруппировать операции, выполняемые над структурой объектов
Client
<interface>> Visitor
visitElementA(ElementA)visitElementB(ElementB)
Vis1 Vis2
ObjStructure Element
ElementA ElementB
![Page 302: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/302.jpg)
JDBC
![Page 303: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/303.jpg)
JDBC
● JDBC — Java DataBase Connectivity
● API для доступа к табличным данным, например к реляционной базе данных
● Пакеты java.sql и javax.sql
● Стандарт взаимодействия с СУБД
● Для разных СУБД используется свой драйвер
![Page 304: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/304.jpg)
304
Процесс взаимодействия
Connection conn = DriverManager.getConnection( "jdbc:driver:database", "s999999", "xxx999");Statement stat = conn.createStatement();ResultSet res = stat.executeQuery( "SELECT id, name FROM people");while (res.next()) { int i = res.getInt("id"); String n = res.getString("name");}stat.close();conn.close();
![Page 305: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/305.jpg)
Класс DriverManager
● Автоматически загружает найденные JDBC-драйверы (начиная с версии JDBC 4.0). Более ранние версии драйверов надо загружать вручную методом Class.forName()
● Connection getConnection● getConnection(String url)
◊ URL = jdbc:protocol:host:port:dbname
● getConnection(String url, Properties props)
◊ Properties props = new Properties();◊ props.put("user", "s999999");◊ props.put("passwd", "xxx999");
● getConnection(Stiring url, String username, String passwd)
![Page 306: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/306.jpg)
Интерфейс Connection
● Представляет из себя абстракцию соединения (сессия)
● методы:
● Statement createStatement()● интерфейс Statement — для статических запросов без
параметров
● PreparedStatement prepareStatement(String sql)● PreparedStatement — для изменяемых запросов с параметрами
● CallableStatement prepareCall(String sql)● CallableStatement — для выполнения хранимых процедур
![Page 307: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/307.jpg)
Методы execute...()
● ResultSet executeQuery(String sql) — для исполнения команды SELECT. Возвращает ResultSet
● int executeUpdate(String sql) — для выполнения запросов INSERT, UPDATE, DELETE — возвращает количество измененных строк. Для команд DDL возвращает 0
● boolean execute(String sql) — для выполнения любых запросов. Возвращает true, если в результате получился ResultSet и надо будет вызывать метод getResultSet() или false, если в результате — updateCount
![Page 308: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/308.jpg)
Транзакции
● setAutoCommit(false)
● addBatch(String sql)
● clearBatch()
● executeBatch()
● commit()
● rollback()
● setSavePoint(String)
● releaseSavePoint(Savepoint)
![Page 309: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/309.jpg)
Получение результатов запроса
● ResultSet
● createStatement(sql,
● int resultSetType, ● TYPE_FORWARD_ONLY
● TYPE_SCROLL_INSENSITIVE
● TYPE_SCROLL_SENSITIVE
● int resultSetConcurrency,● CONCUR_READ_ONLY
● CONCUR_UPDATABLE
● int resultSetHoldability● HOLD_CURSORS_OVER_COMMIT
● CLOSE_CURSORS_AT_COMMIT
![Page 310: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/310.jpg)
Интерфейс ResultSet
● while (rs.next()) {
● String name = rs.getString(1);
● int id = rs.getInt("id");
● }
● next() / previous()
● insertRow() / updateRow() / deleteRow()
● updateString(), updateInt()
![Page 311: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/311.jpg)
Метаданные
● ResultSetMetaData ResultSet.getMetaData()● getTableName()
● getColumnCount()
● getColumnName(int n)
● getColumnType(int n)
● DatabaseMetaData Connection.getMetaData()● getCatalogs()
● getTables()
● getSchemas()
![Page 312: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/312.jpg)
Интерфейс DataSource
● javax.sql.*
● Новый способ получения соединения
● Может работать при помощи JNDI (Java Naming Directory Interface)
● Реализация зависит от СУБД
![Page 313: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/313.jpg)
Простой источник данных
● org.postgresql.ds.PGSimpleDataSource
● PGSimpleDataSource ds = new PGSimpleDataSource()
● ds.setServeerName("helios.cs.ifmo.ru")
● ds.setDatabaseName("ucheb");
![Page 314: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/314.jpg)
Регистрация в JNDI
● javax.naming.Context ctx = new InitialContext();
● ctx.bind("jdbc/testDB", ds);
● Context ctx = new InitialContext();
● DataSource ds = (DataSource)ctx.lookup("jdbc/testDB");
![Page 315: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/315.jpg)
Другие виды DataSource
● ConnectionPoolDataSource● pc = getPooledConnection();
● Connection c = pc.getConnection()
![Page 316: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/316.jpg)
Интерфейс RowSet
● javax.rowset.*
● RowSet extends ResultSet
● setUrl(), setUsername(), setPassword(), setCommand("Select * from ...");
● execute()
● next()
● getXXX()
![Page 317: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/317.jpg)
Потомки RowSet
● JdbcRowSet — простая реализация RowSet
● CachedRowSet — позволяет не поддерживать постоянно соединение с базой. Полученный результат кэшируется.
● WebRowSet — позволяет сохранять данные в XML
● FilteredRowSet — позволяет применять фильтры к результату
![Page 318: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/318.jpg)
318
l10n и i18n
![Page 319: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/319.jpg)
319
Локализация и интернационализация
● Локализация — адаптация программных продуктов для определенной местности
● Перевод текста
● Использование соответствующих форматов данных
● Замена звуковой и визуальной информации
● localization = l10n
● Интернационализация — проектирование программ таким образом, чтобы их локализация была возможна без конструктивных изменений
● выделение текстовых данных из кода
● отображение данных с учетом местных форматов
● internationalization = i18n
![Page 320: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/320.jpg)
320
Локаль
● Локаль — совокупность характеристик, определяющих географический, политический или культурный регион
● Класс java.util.Locale
● Элементы локали:● язык — 2 строчные буквы (иногда 3) (ru)
● страна (регион) — 2 заглавные буквы (RU) или 3 цифры
● вариант (например, кодировка для русской локали)
● письменность — 4 буквы, первая заглавная (Cyrl)
● расширение
![Page 321: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/321.jpg)
321
Создание локали
● Конструкторы класса Locale● new Locale(String lang)
● new Locale(String lang, String country)
● new Locale(String lang, String country, String variant)
● Класс Locale.Builder● new Locale.Builder().setLanguage("ru").setRegion("RU").build()
● Метод forLanguageTag()● Locale.forLanguageTag("ru-RU);
● Константы класса Locale● Locale.FRENCH
● для русского константы нет
![Page 322: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/322.jpg)
322
Методы для работы с локалью
● Получение списка локалей и локали по умолчанию● static Locale[] getAvailableLocales()
● static Locale getDefault()
● Преобразование в строку● String toString() // ru_RU
● String getDisplayName() // Russian (Russia)
● Класс LanguageRange — набор языков● *, en-*, *-CA
● List<Locale> filter(List<LanguageRange>, Collection<Locale>)
● Locale.lookup((List<LanguageRange>, Collection<Locale>)
● List<LanguageRange> - осортированный по убыванию
![Page 323: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/323.jpg)
323
Управление ресурсами
● Класс ResourceBundle
● Набор ресурсов вида "ключ-значение"
Locale loc = Locale.US; // Locale.getDefault() = ru_RU;
ResourceBundle rb = ResourceBundle.getBundle("GuiLabels", loc);
1) GuiLabels_en_US
2) GuiLabels_en
3) GuiLabels_ru_RU
4) GuiLabels_ru
5) GuiLabels
● MissingResourceException
![Page 324: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/324.jpg)
324
Ресурсы в виде свойств - PropertyResourceBundle
● GuiLabels_en.properties GuiLabels_ru_properties
s1 = Yes s1 = Да
s2 = No s2 = Нет
ResourceBundle r = ResourceBundle.getBundle("GuiLabels");
JButton b1 = new JButton(r.getString("s1");
JButton b2 = new JButton(r.getString("s2");
● + отдельные текстовые файлы
● - только String
● Кодировка ISO-8859-1 — необходима обработка с помощью native2ascii
![Page 325: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/325.jpg)
325
Ресурсы в виде списка - ListResourceBundle
public class GuiLabels_en extends ListResourceBundle {
public Object[][] getContents() { return contents; }
private Object[][] contents = { {"s1", "Yes"}, {"s2", "No"} };
}
public class GuiLabels_ru extends ListResourceBundle {
public Object[][] getContents() { return contents; }
private Object[][] contents = { {"s1", "Да"}, {"s2", "Нет"} };
}
ResourceBundle r = ResourceBundle.getBundle("GuiLabels");
JButton b1 = new JButton(r.getString("s1");
JButton b2 = new JButton(r.getString("s2");● + любые типы объектов
● - нужна компиляция файлов
![Page 326: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/326.jpg)
326
Форматирование числовых данных
● Класс NumberFormat — абстрактный● NumberFormat nf = NumberFormat.getNumberInstance()
● NumberFormat cf = NumberFormat.getCurrencyInstance()
● NumberFormat pf = NumberFormat.getPercentInstance()
● nf.format(new Float(999.8));
● Класс DecimalFormat● df = (DecimalFormat) nf;
● df.applyPattern("##,#0.00");
● df.format(new Float(888.7));
● Класс DecimalFormatSymbols● DecimalFormatSymbols ds = new DecimalFormatSymbols();
● ds.setDecimalSeparator('=');
● df.setDecimalFormatSymbols(ds);
● df.format(new Float(777.6));
![Page 327: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/327.jpg)
327
Символы шаблона
0 — цифра, 0 отображается
# — цифра, 0 не отображается
. — разделитель десятичной дроби
, — разделитель групп разрядов
E — разделитель мантиссы и порядка
- — знак минус
; — разделитель подшаблонов
% — умножить на 100 и отобразить как процент
‰ — умножить на 100 и отобразить как промилле
¤ — символ валюты
![Page 328: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/328.jpg)
328
Форматирование даты и времени
● Класс DateFormat — абстрактный● DateFormat df = DateFormat.getDateInstance(DateFormat.FULL)
● DateFormat tf = DateFormat.getTimeInstance(DateFormat.LONG)
● DateFormat dtf = DateFormat.getDateTimeInstance(DateFormat.SHORT)
● df.format(new Date());
● Класс SimpleDateFormat● sdf = (SimpleDateFormat) df;
● sdf.applyPattern("yyyy-MM-dd");
● sdf.format(new Date());
● Класс DateFormatSymbols● DateFormatSymbols ds = new DateFormatSymbols();
● ds.setShortWeekdays("пнд","втр","срд","чтв","птн","сбт","вск");
● sdf.setDateFormatSymbols(ds);
● sdf.format(new Date());
![Page 329: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/329.jpg)
329
Символы шаблона
Более 4 символов — полный формат, 3 — сокращенный, 2 - число
G — эра
y — год
M — месяц после числа
L — месяц (название)
d — число
E — название дня недели
H — часы
m — минуты
s — секунды
S — миллисекунды
z — временная зона
![Page 330: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/330.jpg)
330
Форматирование сообщений
● Класс MessageFormat● 9 марта 2016 в 1:58 произойдет полное солнечное затмение.
● Total solar eclipse will happen at 1:58 on March 9, 2016.
Solar_en.propertiesmsg = {0} solar eclipse will be at {1,time,short} on {1,date,short}.full = Totalpart = PartialSolar_ru.properties{1,date,short} в {1,time,short} будет {0} солнечное затмениеfull = полноеpart = частное
ResourceBundle r = ResourceBundle.getBundle("Solar");MessageFormat mf = new MessageFormat(r.getString("msg");Calendar x = new Calendar(); x.set(2016,3,9,1,58,0);Object[] args = {r.getString("full", x.getTime()};mf.format(args);
![Page 331: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/331.jpg)
331
Формат с выбором
● Класс ChoiceFormat extends NumberFormat● 0 friends like it
● 1 friend likes it
● 1000 friends like it
Like_en.propertiesmsg = {0} itone = {0,number} friend likesmany = {0,number} friends like
ResourceBundle r = ResourceBundle.getBundle("Like");MessageFormat mf = new MessageFormat(r.getString("msg");double[] lims = { 0, 1, 2 };String o = r.getString("one");String m = r.getString("many");String[] msgs = { m, o, m };ChoiceFormat cf = new ChoiceFormat(lims, msgs);mf.setFormatByArguments(0, cf);Object[] args = { new Integer(15) };mf.format(args);
![Page 332: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/332.jpg)
332
Сравнение строк
● Класс Collator - абстрактный
● Collator getInstance()
● int compare()
List<String> lst = Arrays.asList({"Fluor", "Chlor","Brom","Jod"});
Collator c1 = Collator.getInstance(Locale.EN);
Collator c2 = Collator.getInstance(new Locale("cz","CZ");
lst.sort(c1); // Brom, Chlor, Flour, Jod
lst.sort(c2); // Brom, Fluor, Chlor, Jod
// A, Á, B, C, Č, D, Ď, E, É, Ě, F, G, H, Ch, I, Í, J, K, L, M, N,
// Ň, O, Ó, P, Q, R, Ř, S, Š, T, Ť, U, Ú, Ů, V, W, X, Y, Ý, Z, Ž
● RuleBasedCollator
![Page 333: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/333.jpg)
333
Разбор текста
● Класс BreakIterator — поиск границ
● Методы● getCharacterInstance()
● getWordInstance()
● getSentenceInstance()
● getLineInstance()
● int first()
● int last()
● int next()
● int previous()
● int following(int offset)
● int preceding(int offset)
● BreakIterator.DONE
![Page 334: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/334.jpg)
334
Дата и время
![Page 335: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/335.jpg)
335
Использование даты и времени
● Дата и время — 2 варианта представления:● Человеческое время — часы, минуты, дни, недели, месяцы
● Машинное время — миллисекунды от нулевой точки отсчета
◊ 1 января 1970 года, 00:00:00
![Page 336: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/336.jpg)
336
Традиционные классы. Date
● Date● в версии 1.0 — единственный класс даты
● человеческое и машинное представление
● форматирование даты
● версия 1.1 — Date — момент времени
● почти все методы объявлены deprecated
● Конструкторы● Date
● Date(long)
● Методы● long getTime()
● boolean after(Date)
● boolean before(Date)
![Page 337: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/337.jpg)
337
TimeZone
● Временная зона — смещение от стандартного:
● до 1972 года - Гринвич (GMT)
● после 1972 — UTC — всемирное координированное
● Методы● getDefault()
● getAvailableIDs()
● getRawOffset() - смещение без учета летнего времени
● getOffset(long date) — с учетом летнего времени
● Класс SimpleTimeZone — реализованный потомок
![Page 338: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/338.jpg)
338
Calendar
● Абстрактный класс — преобразование из машинных в человеческие единицы
● Calendar getInstance()
● add(int field, int amount);
● roll(int field, int amount);
● set(int field, int value);
● Date getTime()
● setTime(Date)
● реализованный класс GregorianCalendar● сочетает 2 календаря (григорианский и юлианский)
![Page 339: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/339.jpg)
339
Новые пакеты
● java.time — основной пакет для работы с датой и временем
● java.time.chrono — календарные системы
● java.time.format — классы для форматирования
● java.time.temporal — преобразования времени и вычисления
● java.time.zone — работа с поясным временем
● Все классы — неизменяемые, потокобезопасные
●
![Page 340: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/340.jpg)
340
Соглашения по именам методов
● Статические● of — создает экземпляр на основе входных параметров
● from — конвертирует экземпляр из другого типа
● parse — создает экземпляр из строкового представления
● Методы экземпляра● format — форматирует объект в строку
● get — возвращает частичное состояние объекта
● is — проверяет параметр объекта
● with — возвращает копию объекта с одним измененным элементом
● plus — возвращает копию объекта с добавленным временем
● minus — возвращает копию объекта с убавленным временем
● to — преобразует объект в другой тип
● at — комбинирует объект с другим
![Page 341: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/341.jpg)
341
Перечисляемые типы — дни недели и месяцы
● enum DayOfWeek (1 (MONDAY) — 7 (SUNDAY))
● enum Month (1 (JANUARY) — 12 (DECEMBER))
● метод getDisplayName(style, locale)
● стиль — FULL, NARROW, SHORT / STANDALONE
![Page 342: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/342.jpg)
342
Классы для представления даты и времени
год месяц день час минута секунда нано
Year x
YearMonth x x
MonthDay x x
LocalDate x x x
LocalTime x x x x
LocalDateTime x x x x x x x
.of(year,month,day,hour,min,sec,nano)
.now()
YearMonth Year.atMonth(Month)LocalDate MonthDay.atYear(Year)LocalDate YearMonth.atDay(day)LocalDate Year.atMonthDay(MonthDay)LocalDateTime LocalDate.atTime(LocalTime)LocalDateTime LocalTime.atDate(LocalDate)
.get .with .plus .minus
.getNano() .plusNanos(nano)
.getSecond() .plusSeconds(sec)
.getMinute() .plusMinutes(min)
.getHour() .plusHours(hour)
.getDayOfMonth() .plusDays(day)
.getDayOfWeek() .plusWeeks(week)
.getMonth() .plusMonths(month)
.getYear() .plusYears(year)
![Page 343: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/343.jpg)
343
Классы для представления временной зоны
● ZoneId — идентификатор зоны● Europe/Moscow
● ZoneOffset — разница со стандартным временем● UTC+01:00, GMT-2
● OffsetTime = LocalTime + ZoneOffset
● OffsetDateTime = LocalDateTime + ZoneOffset
● ZonedDateTime = LocalDateTime + ZoneId● использует java.time.zone.ZoneRules
![Page 344: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/344.jpg)
344
Момент времени
● Класс Instant
● now()
● plusNanos()
● plusMillis()
● plusSeconds()
● minusNanos()
● minusMillis()
● minusSeconds()
![Page 345: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/345.jpg)
345
Разбор и форматирование
● java.time.format.DateTimeFormatter● формат можно выбрать из констант:
◊ BASIC_ISO_DATE◊ ISO_DATE/TIME/DATETIME◊ ISO_LOCAL_DATE/TIME/DATETIME◊ ISO_OFFSET_DATE/TIME/DATETIME◊ ISO_ZONED_DATETIME◊ ISO_INSTANT
● задать шаблон
◊ ofPattern()
● методы format() и parse()
![Page 346: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/346.jpg)
346
Периоды даты и времени
● Duration — продолжительность в часах и менее● toNanos(), toMillis(), toSeconds(), toMinutes(), toHours(), toDays()
● Period — период в днях и более● getDays(), getMonths(), getYears()
● .between()
● .plus
● .minus
![Page 347: API. Основные классыšонспект_лекций_2.pdf52 java.io.InputStream абстрактный метод int read() возвращает байт от 0 до 255,](https://reader034.vdocuments.net/reader034/viewer/2022051911/60015d13dfbae20da73ce0c8/html5/thumbnails/347.jpg)
347
Взаимодействие старых и новых классов
Соответствия: ● Date — Instant
● GregorianCalendar — ZonedDateTime
● TimeZone — ZoneId, ZoneOffset
● Методы:● Calendar.toInstant()
● GregorianCalendar.toZonedDateTime()
● GregorianCalendar.fromZonedDateTime()
● Date.fromInstant()
● Date.toInstant()
● TimeZone.toZoneId()