Advertisement
reiziger

Untitled

Aug 17th, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 40.41 KB | None | 0 0
  1. Как создать jar-архив:
  2.     jar cfe hw.jar (имя) HelloWorld (имя главного класса) HelloWorld.class (перечисляем все классы, которые войдут в архив)
  3.  
  4.     Просмотр содержимого : jar tf hw.jar
  5.  
  6.     Распаковка : jar xf hw.jar
  7.  
  8.     j
  9.  
  10. Примитивные типы:
  11.     boolean
  12.     char
  13.     byte, short, int, long
  14.     float, double
  15.  
  16.     переменная примитивного типа - ячейка памяти, в которой хранится значение переменной.
  17.     примитивные типы передаются по значению (когда делаем b = a, то создаётся копия значения а в др.ячейке)
  18.  
  19.     boolean:
  20.         && : если левый операнд - false -> правый не вычисляется (аналогично для ||)
  21.         & и | реализуют вычисления по полной схеме.
  22.  
  23.     целочисленные типы:
  24.         все типы имеют фиксированный диапазон под все платформы.
  25.         беззнаковых типов не существует.
  26.  
  27.         8-ричная сс: 015 (ведущий ноль)
  28.         16-ричная сс: префикс 0x
  29.         двоичная сс: префикс 0b
  30.         между цифрами разрешено ставить подчеркивания (10_000)
  31.         если в коде нужно записать число, не влезающее в int, нужно добавить суффикс L
  32.  
  33.         операторы инкремента и декремента возвращают число (преинкремент вернет после инкремента, пост - до)
  34.  
  35.     char:
  36.         беззнаковый
  37.         хранит код символа в кодировке Unicode
  38.        
  39.  
  40.     float, double:
  41.         вещественные литералы по умолчанию имеют тип double.
  42.         от вещественных чисел можно брать остаток от деления
  43.         +- 1.0 / 0.0 = +- inf (корректное значение, ошибки не будет)
  44.         0.0 / 0.0 = nan
  45.         nan != nan
  46.  
  47.  
  48. Классы-обёртки:
  49.     Класс с единственным полем value соответствующего типа.
  50.     Зачем нужны?
  51.         -хранить в коллекциях (не поддерживают примитивные типы)
  52.         -в программе нужно указать отсутствие значения (null)
  53.     boxing : Integer b = Integer.valueOf(a); //int a;
  54.     unboxing : int a = b.intValue();   
  55.  
  56.     неявное приведение : Integer a = 10; - медленнее, чем примитив
  57.  
  58.  
  59.  
  60. Ссылочные типы:
  61.     все остальные типы в Java - сссылочные.
  62.     переменная ссылочного типа : ячейка памяти, содержащая ссылку на участок памяти, представляющую собой объект.
  63.     объект лежит в произвольном месте памяти.
  64.     в отличие от указателей в С со ссылками нельзя производить какую-либо арифметику.
  65.  
  66.     объявление переменной и выделение памяти под объект - 2 независимых действия.
  67.     объект создается оператором new. new вызывает конструктор.
  68.  
  69.     оператор == сравнивает ссылки!
  70.     для сравнения объектов по содержимому сущ-вует метод equals (не работает для массивов, там тоже сравн. ссылки)
  71.  
  72.     Массивы :
  73.         int[] a / int a[] - корректно.
  74.         int[] a = new int[100]; //размер массива фиксирован и не может быть изменен.
  75.         при создании массива все эл-ты автоматически инициализируются нулями соответствующего типа.
  76.  
  77.         инициализация : int[] a = new int[] {1, 2, 3};
  78.                         int[] a = {1, 2, 3}; - так тоже можно
  79.  
  80.         многомерность массивов не совсем честная : это просто массив ссылок, но это позволяет сделать ступенчатые массивы.
  81.  
  82.         сравнение массивов : Arrays.equals(a, b); - одномерные
  83.                              Arrays.deepEquals(a, b); - многомерные
  84.  
  85.         вывод массива на экран : sout(Arrays.toString(a));
  86.                                  sout(Arrays.deepToString(a));
  87.  
  88.         ключевое слово final действует только на ссылку на массив, к элементам не относится
  89.  
  90.     Строки :
  91.         строка - ссылочный тип, хранящий посл-ность символов произвольной длины
  92.         строка != массив символов, но их можно легко конвертировать : String s = new String(c); //c - array of char;
  93.         строки неизменяемы!!!!! когда объект типа string создан, мы не можем поменять ни один символ.
  94.         любое изменение строки связано с созданием нового объекта
  95.  
  96.         сравнение без учёта регистра : s1.equalsIgnoreCase(s2);
  97.  
  98. Метки :
  99.     -существуют в Java только для операторов break/continue;
  100.  
  101.     пример :
  102.  
  103.         out:
  104.         for () {
  105.             for () {
  106.                 if () {
  107.                     break out;
  108.                 }
  109.             }
  110.         }
  111.  
  112. Преобразование типов:
  113.     -при приведении более ёмкого целого типа к менее ёмкому старшие разряды отбрасываются.
  114.     -слишком большое по модулю вещественное число при приведении к целому превращается в максимальное по модулю
  115.     представимое целое число того же знака.
  116.     -слишком большое double при приведении к float превращается в inf.
  117.  
  118.     -автоматическое приведение типов :
  119.         если один из операндов имеет тип double (float -> long), иначе оба приводятся к типу int! // byte c = (byte) a + b;
  120.  
  121.  
  122.  
  123. ООП :
  124.  
  125. package :
  126.     пакет задаёт область видимости класса; др.классы этого же пакета могут обращаться по короткому имени, классы из др пакетов - по полному, или использовать директиву import.
  127.  
  128.     классы из пакета по умолчанию невозможно использовать из др. пакетов, даже при наличии явного импорта.
  129.     import static - импортировать статические поля и методы.
  130.  
  131.     никакой подстановки тела импортированных классов (как #include) не происходит.
  132.  
  133.     example :
  134.         import static java.lang.Math.sqrt;
  135.         //
  136.         sqrt(4);
  137.  
  138. Модификаторы доступа :
  139.     public - доступ разрешён отовсюду без ограничений.
  140.     protected - доступ разрешён только для классов-наследников и классов текущего пакета.
  141.     package-private - в пределах пакета.
  142.     private - в пределах класса.
  143.     -отсутствие модификатора = область видимости в пределах пакета (package-private)
  144.  
  145.     -protected/private не применимы к классам верхнего уровня, можно применять к вложенным классам.
  146.     -в одном файле могут быть объявлены несколько классов, но модификатором public может обладать только один из них.
  147.      его имя должно совпадать с именем файла
  148.     final - от этого класса нельзя наследоваться
  149.     native - реализация данного метода нах-ся в нативном си-шном коде
  150.  
  151. Классы:
  152.  
  153. Конструктор :
  154.     -создание : модификатор доступа_имя класса
  155.     -если параметр конструктора имеет имя такое же как и поле класса, то нужно использовать this (this.value = value)
  156.     -если в классе не объявлен ни один конструктор, неявно создается конструктор по умолчанию, без параметров.
  157.     -запретить создание класса = сделать конструктор приватным
  158.     -в классе может быть несколько перегруженных конструкторов с разными агрументами, из одного можно вызывать другой
  159.  
  160. Поля и методы :
  161.     -final - метод не может быть переопределён в классах-наследниках
  162.     -в классе может быть несколько методов с одинаковыми именами, но разными наборами параметров
  163.     -статические поля и методы существуют независимо от экземлпяров класса и могут вызываться по имени класса
  164.     -статический метод не имеет доступа к this и нестатическим полям и методам
  165.     -static final - константа
  166.  
  167. Вложенные классы:
  168.     -если вложенный класс объявлен с модификатором static, то связь с внешним классом теряется
  169.  
  170. Перечисления:
  171.     -enum - полноценный ссылочный тип; класс с фиксированным количеством экземпляров
  172.     -значения эквивалентны public static final полям класса
  173.     -в перечислениях можно объявлять поля и методы, конструктор
  174.     -для enum определены методы name() и ordinal(), values()
  175.  
  176. Аннотации:
  177.     @Deprecated - класс устарел
  178.     @SuppressWarnings - временно отключает предупреждения компилятора о подозрительных местах в коде
  179.  
  180. Наследование:
  181.     -унаследованный класс автоматически получает все поля и методы базового класса
  182.     -при пользовании не важно, объявлено ли поле в классе-наследнике или его родителях
  183.     -в классе-наследнике можно переопределять методы (завести метод с такими же именем и параметрами,
  184.     как в базовом классе). тип возвращаемого значения должен либо совпадать, либо быть подклассом типа, возвращаемого базовым методом, а модификатор доступа либо тем же, либо более открытым. тогда метод наследника заменит собой одноимённый метод базового класса.
  185.  
  186.     -создание экземпляра класса-наследника вкл. в себя инициализацию базового класса (вызов его конструктора)
  187.     -super обязан идти перед всем кодом в классе
  188.     -можно вызвать метод базового класса при наличии переопределённого метода у наследника :
  189.         public StringBuilder append(String str) {
  190.             super.append(str); //если б тут не было super'а, метод вызывал бы сам себя.
  191.             return this;
  192.         }
  193.  
  194.     -super можно писать только в классе-наследнике
  195.  
  196.     -если ничего не сказано про налседование, то подразумевается что он наследуется от java.lang.Object
  197.     -Object - родитель всех ссылочных типов : массивов, перечислений, аннотаций
  198.     -Object содержит методы toString(), equals(), hashCode()
  199.     -реализация метода toString() в классе Object формирует строку вида "имя класса@16-ричный хэш-код"
  200.     -реализация метода equals() в классе Object происходит по ссылке (в наследниках - по содержимому), т.к. на таком абстрактном уровне больше ничего сделать нельзя.
  201.     -реализация метода equals() уровнями ниже :
  202.         приводим классы к одному типу (если один instanceOf другого) и сравниваем по полям
  203.     -если a.equals(b), то a и b одинаковые хэш-коды
  204.     -anObject instanceOf String - является ли объект экземпляром класса String (подклассы тоже считаются)
  205.     -null instanceOf чего угодно - false
  206.     -hashCode() не возвращает адрес объекта!
  207.  
  208.     -принцип подстановки : если S extends T, то все объекты класса T могут быть заменены на объекты класса S
  209.  
  210. Абстрактные классы :
  211.     -если класс объявлен как абстрактный, это значит что нельзя создавать его экземпляры. создать можно только
  212.     экз. класса-наследника, не яв-ся абстрактным
  213.     -в абстрактном классе могут существовать абстрактные методы (без реализации), которые мы не можем реализовать на данной иерархии наследования. все неабстрактные классы-наследники должны реализовать этот метод.
  214.     -наличие неабстрактных методов в абстрактном классе приведёт к ошибке компиляции     ???
  215.  
  216. Интерфейсы :
  217.     -Интерфейс - альтернатива абстрактному классу, в котором все методы публичные и абстрактные
  218.     -поля в интерфейсе могут быть только публичные статические финальные (константы)
  219.     -в интерфейсе могут быть :
  220.         -публичные статические методы
  221.         -default-методы (можно задать реализацию по умолчанию, если в классе, реализующем интерфейс, метод неопределен)
  222.     -в java можно объявлять классы реализующие произвольное кол-во интерфейсов
  223.     -примеры интерфейсов : -CharSequence (String, StringBuilder : length(), charAt(), subSequence()),
  224.                            -Appendable (Stringbuilder : append)
  225.                            -Runnable( : Run())
  226.                            -Comparator<T>( :Compare())
  227.     -интерфейсы, в которых ровно один абстрактный метод, называются функциональными @FunctionalInterface       
  228.     -интерфейсы позволяют писать максимально обобщённый код, допускающий самые разнообразные реализации
  229. ------------------------------------------------------------------------------
  230. Исключения:
  231.     Исключения в Java делятся на 3 группы : Error, Exception, Runtime Exception
  232.  
  233.     Error и его подклассы - ошибки JVM. Их не надо обрабатывать, т.к. помочь виртуальной машине вряд ли удастся
  234.  
  235.     Runtime Exception - unchecked, их не надо декларировать на уровне метода. Exception - checked.
  236.  
  237.     В переопределённом методе можно бросать <= исключений, чем в методе-родителе.
  238.  
  239.     Непроверяемые - NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException (/0)
  240.  
  241.     Обработка икслючений:
  242.         Выполняется только один первый подходящий блок Catch. Остальные не будут.
  243.         Можно делать : catch (FirstException | SecondException e)
  244.  
  245.         После try может быть блок finally, который выполнится в любом случае - было исключение или нет.
  246.         В этом блоке обычно занимаются освобождением ресурсов.
  247.  
  248.         Если в finally случилось исключение, то полетит оно, а предыдущее будет потеряно.
  249.  
  250.         try with resources : try (InputStream is = new FileInputStream("in.txt"); OutputStream..) { };
  251.         Гарантируется, что в каждом из ресурсов будет вызыван метод close.
  252.         Здесь исключение из close не перебьёт собой исходное исключение, а будет добавлено к нему в кач-ве заглушенного
  253.         Ресурс - любой объект, реализующий интерфейс AutoCloseable
  254.  
  255. Доступ к файловой системе:
  256.     -класс File : File file = new File(путь) //объявление
  257.  
  258.     -путь к файлу можно собирать в программе :
  259.         String dirName = "src";
  260.         String fileName = "Main.java";
  261.         String path = dirName + File.separator /*File.separatohChar*/ + fileName;
  262.  
  263.         File.separator - подходящий для данной ОС разделитель.
  264.         File.pathSeparator - разделитель путей
  265.  
  266.     -также задать правильный путь можно с помощью конструктора :
  267.         File file = new File(dirName, fileName); //путь он склеит сам
  268.  
  269.  
  270.     -путь может быть абсолютный (относительно корневой директории) и относительный.
  271.      относительный можно превратить в абсолютный с помощью file.getAbsolutePath(); // isAbsolute() - проверка
  272.                                                            file.getAbsoluteFile(); - возвращает экз. класа File
  273.  
  274.     -из файла можно "вынуть" путь : String path = file.getPath();
  275.                              имя : String name = file.getName();
  276.                              родительскую директорию : String parent = file.getParent(); //getParentFile() возвр. File
  277.  
  278.     -file.getCanonicalPath() /*getCanonicalFile()*/- возвращает канонический путь (без '.', ".." и ссылок) сравнить пути = сравнить канонические пути. Данный метод требует обращение к диску, поэтому может кинуть IOException
  279.  
  280.  
  281.     -существование объекта File не привязано к сущ-ю объекта или директории на диске. конструктор ничего на диске не создает, поэтому путь может указывать на несуществующие директории
  282.  
  283.     -file.exists(); - существует ли? file.isFile() / file.isDirectory() - файл или директория?
  284.  
  285.     -file.length() - длина, file.lastModified() - время посл.изменения (если файлы не сущ. то возвр.0, а не exception)
  286.  
  287.     -if (file.isDirectory())
  288.         directory.list() /* String[] */ или directory.listFiles() /* File[] */ - содержимое (если несущ - null)
  289.  
  290.  
  291.     -boolean success = file.createNewFile(); //создает новый пустой файл, throws IOException (нет прав, не существует директории).
  292.  
  293.     -File dir = new File("a/b/c/d");
  294.      boolean suc = dir.mkdir(); //создает максимум 1 директорию
  295.      boolean succ = dir.mkdirs();
  296.  
  297.     -boolean success = file.delete(); - удаляет файл или директорию (только если директория пуста -> приходится писать рекурсивный обход)
  298.  
  299.     -boolean renameSuc = file.renameTo(targetFile) //принимает File! ; таким образом можно перенести в др. директорию
  300.  
  301.     Java.nio.file.Path
  302.         Аналог старого File
  303.         Path - строчка, обёрнутая набором методов для синтаксических манипуляций, не привязанная к существованию файла на диске
  304.  
  305.         Path path = Paths.get(путь) // так получать экземпляр класса
  306.  
  307.         Files.createDirectory/Files.createDirectories - аналог mkdir(s)
  308.        
  309. Ввод/Вывод:
  310.     Потоки байт:
  311.     Ввод:
  312.         java.io.InputStream - абстрактный класс, представляет собой поток байт, откуда можно читать. На этом уровне абстракции мы даже не знаем, откуда читаем     
  313.  
  314.         read() - возвр. следующий байт входного потока и сдвигается дальше. возвр.значение имеет тип int, но фактически считывается только 1 байт. int нужен чтобы обозначить конец потока (-1). Получить байт = явно прикастовать к byte. Бросает IOException.
  315.  
  316.         read(byte b[]) - читает число байт, равное длине массива и записывает в него. возвр значение - кол-во считанных байт, оно м.б. меньше, чем мы просили (поток закончился / недостаточно данных на данный момент)
  317.  
  318.         read(byte b[], int off, int len) - начиная с какого и сколько заполнять
  319.  
  320.         long skip(long n) - сколько байт пропустить. возвращает, сколько байт удалось пропустить
  321.  
  322.         close() - закрывает поток и освобождает связанные с ним ресурсы
  323.  
  324.  
  325.     Вывод:
  326.         java.io.OutputStream
  327.  
  328.         write(int b) - выводит младшие 8 бит числа b
  329.  
  330.         write(byte b[]) - выводит массив
  331.  
  332.         flush() - сбрасывает буфера
  333.  
  334.         close() - закрывает поток и освобождает связанные с ним ресурсы
  335.  
  336.     Пример кода для копирования данных из входного потока в выходной:
  337.         int totalBytesWritten = 0;
  338.         byte[] buf = new byte[1024];
  339.         int blockSize;
  340.         while ((blockSize = inputStream.read(buf)) > 0) {
  341.             outputStream.write(buf, 0, blockSize);
  342.             totalBytesWritten += blockSize;
  343.         }
  344.  
  345.     FileInputStream/FileOutputStream - чтение/запись из файла. В кач-ве параметра конструктора принимают строку или экземпляр класса File. Если на руках экземпляр Path, то можно получить стрим с помощью
  346.                                                  Files.newInputStream(Paths.get("in.txt"));
  347.  
  348.     Обмен данными по сети:
  349.         Socket - сетевое соединение
  350.         try (Socket socket = new Socket("ya.ru", 80)) {
  351.             OutputStream out = socket.getOutputStream();
  352.             InputStream in = socket.getInputSream();
  353.         }
  354.  
  355.     ByteArrayInputStream - чтение из массива байт
  356.  
  357.  
  358.     Один стрим может быть завёрнут в другой: внутренний занимается реальным вводом/выводом, внешний - его декорирует
  359.     DataOutputStream оборачивает OutputStream и добавляет методы записи примитивных типов : writeInt..
  360.     Аналогично для IS
  361.  
  362.     Закрытие внешнего стрима закрывает вложенные в него стримы
  363.  
  364.     DeflaterInputStream/OutputStream - используются для сжатия и распаковки данных "на лету" (по алгоритму Deflate)
  365.  
  366.  
  367.  
  368.     Потоки символов:
  369.  
  370.     Ввод:
  371.         java.io.Reader
  372.  
  373.         Устроен аналогично InputStream, только char вместо byte
  374.     Вывод:
  375.         java.io.Writer
  376.  
  377.         Устроен аналогично OutputStream, есть перегруженные методы для вывода строк
  378.  
  379.     Можно превратить поток байт в поток символов, завернув его в InputStreamReader/OutputStreamWriter, при этом указав кодировку (правило перевода байтов в символы). Передать ее можно в виде строки с именем или объекта типа Charset (из StandartCharsets или с помощью Charset.forName("имя"))
  380.  
  381.     Если кодировка не будет указана, то будет использоваться системная кодировка по-умолчанию (Charset.defaultCharset)
  382.  
  383.     Reader reader = new InputStreamReader(inputStream, "UTF-8");
  384.  
  385.     FileReader/FileWriter - для работы с файлом. Но они не позволяют явно указать кодировку, поэтому для работы с файлами используются такие конструкции:
  386.         Reader reader = new InputStreamReader(new FileInputStream("in.txt"), StandartCharsets.UTF_8);
  387.  
  388.     CharArrayReader/StringReader - для чтения из массива или строки (writer аналогично)
  389.  
  390.     BufferedReader:
  391.         Запоминает считанные символы в буфере
  392.  
  393.         readLine() считывает строку (символ конца строки не возвращается). Если поток закончился - null
  394.  
  395.         Files.newBufferedReader(Paths.get("in.txt"), StandartCharsets.UTF_8)
  396.         вместо
  397.         BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("in.txt"), "UTF-8"));
  398.  
  399.         Files.readAllLines - вернет строки из файла в виде списка
  400.  
  401.     BufferedWriter:
  402.         Аналогично BufferedReader
  403.  
  404.         writer.write("123");
  405.         writer.newLine(); // перевод строки
  406.  
  407.     Форматированный вывод:
  408.  
  409.         PrintWriter:
  410.             оборачивает Writer
  411.             есть методы print/println, перегруженные для всех примитивных типов, строк, объектов
  412.             есть метод printf (как в С)
  413.             методы не бросают исключений, а устанавливают внутренний флаг ошибки, который можно проверить с помощью checkError()
  414.  
  415.         PrintStream
  416.             оборачивает OutputStream и сам им является
  417.  
  418.     Форматированный ввод:
  419.  
  420.         StreamTokenizer - читает из потока
  421.         StringTokenizer - читает из строки - не очень удобные классы
  422.  
  423.         Scanner:
  424.             Можно указать шаблон разделителя, который будет использоваться для нарезания входного потока на токены, а так же Locale (запятая как разделитель вещественных чисел)
  425.  
  426.  
  427.  
  428.     Класс System:
  429.         System.in - InputStream
  430.         System.out, System.r - PrintStream
  431.  
  432.  
  433. Generics:
  434.     -параметризация возможна только ссылочным типам TreeNode<String>, TreeNode<Integer>, TreeNode<int[]> - ок
  435.     -класс Optional - объект может быть/ не быть:
  436.         Optional<String> abc = Optional.of("abc");
  437.         abc.ifPresent(System.out::println);                <=> if (s != null) sout.. //где s - String
  438.  
  439.         Optional<String> bar = Optional.empty();
  440.         String value = bar.orElse("bar");        <=> s != null ? s : "bar"
  441.  
  442.     -статический (нестатический тоже) можно параметризовать отдельно от класс, объявив Generic-параметр после модификатора доступа
  443.  
  444.     -в отличиие от шаблонов в С++ явная подстановка конкретного типа данных и создание новых классов с ним отсутствует, класс всегда один. В байткоде получается класс, имеющий вместо T тип Object
  445.  
  446.     -если не указать параметризованный тип, то класс будет принимать и отдавать Object
  447.  
  448.     -внутри параметризованного класса или метода нельзя создавать экземпляр или массив Т, также неработает проверка instanceof
  449.  
  450.     -Generics и наследование:
  451.         Экземпляру базового класса можно без приведения присвоить экземпляр производного класса, но
  452.         если они выступают в роли параметров параметризованного класса, так не работает:
  453.  
  454.         Optional<Integer> optionalInt = Optional.of(1);
  455.         Optional<Number> optionalNumber = optionalInt; //тут будет ошибка
  456.  
  457.         Иначе можно было бы сделать так:
  458.         optionalNumber.set(new BigDecimal("3.14"));
  459.  
  460.         В ситуации с массивами так тоже нельзя сделать, будет брошено ArrayStoreException
  461.  
  462.     Если нужно получить объект откуда-то, то нужно использовать <? extends T>
  463.     Если отдавать - <? super T>
  464.  
  465.     Когда нам все равно, каким типом параметризован класс, можно написать <?>
  466.     Если мы захотим из такого класса получить значение типа T, оно будет возвращаться как Object
  467.     Методы, принимающие параметр типа Т, нельзя будет вызвать
  468.  
  469. Collections:
  470.     -коллекции находятся в пакете Java.util
  471.     -коллекции для многопоточных программ - в Java.util.cuncurrent
  472.     -у каждого класса коллекции есть конструктор, принимающий параметром другую коллекцию
  473.  
  474.     public interface Collections<E> extends Iterable<E> {
  475.         int size();
  476.         boolean isEmpty();
  477.         boolean contatins(Object o);
  478.         boolean add(E e);
  479.         boolean remove(Object o);
  480.         void clear();
  481.         Iterator<E> iterator();
  482.     }
  483.  
  484.     Итераторы:
  485.         Java.util.Iterable:
  486.             -hasNext()
  487.             -next() //throws NoSuchElementException
  488.             -remove()
  489.  
  490.         Если в процессе обхода нужно удалять из коллекции некоторые элементы, то придется использовать итератор явно.
  491.         Попытка вызывать remove() при обходе коллекции бросит java.util.ConcurrentModificationException.
  492.         Не стоит менять коллекции в процессе обхода не через итераторы
  493.  
  494.     List:
  495.         public interface Lise<E> extends Collection<E> {
  496.             E get(int index);
  497.             E set(int index, E element);
  498.             void add(int index, E element);
  499.             E remove(int index);
  500.             int indexOf(Object o); //returns -1 if not contains
  501.             int lastIndexOf(Object o); //returns -1 if not contains
  502.             List<E> subList(int fromIndex, int toIndex); //изменения одного списка будут видны в другом (не копирование)
  503.         }
  504.  
  505.         реализации :
  506.             ArrayList<E>
  507.             LinkedList<E> //двусвязный список
  508.  
  509.     Queue:
  510.         public interface Queue<E> extends Collection<E> {
  511.             boolean add(E e); //throws exception
  512.             boolean offer(E e); //returns false
  513.             E remove(); //throws exception
  514.             E poll(); //returns null
  515.             E element(); //throws exception
  516.             E peek(); //returns null
  517.         }
  518.  
  519.     Deque:
  520.         public interface Deque<E> extends Queue<E> {
  521.             void addFirst(E e);
  522.             void addLast(E e);
  523.  
  524.             boolean offerFirst(E e);
  525.             boolean offerLast(E e);
  526.  
  527.             E removeFirst();
  528.             E removeLast();
  529.         }
  530.  
  531.         реализации:
  532.             ArrayDeque<E>
  533.             LinkedList<E>
  534.  
  535.     Set:
  536.  
  537.         Не добавляет новых методов интерфейса Collection
  538.  
  539.         Реализация:
  540.             HashSet // Пока объект лежит в HashSet, не должны меняться его поля, меняющие equals() и hashCode()
  541.             LinkedHashSet
  542.  
  543.     SortedSet:
  544.  
  545.         public interface SortedSet<E> extends Set<E> {
  546.             SortedSet<E> subSet(E fromElement, E toElement);
  547.             SortedSet<E> headSet(E toElement); //возвращает подмн-во элементов, меньших, чем параметр (изменяется вместе с основным)
  548.             SortedSet<E> tailSet(E fromElement);
  549.             E first();
  550.             E last();
  551.         }
  552.  
  553.         Реализация:
  554.             TreeSet//Красно-черное дерево
  555.             Элементы должны либо реализовывать Comparable, либо при создании множества в кач-ве параметра конструктора д
  556.             должен передаваться экземпляр Comparator
  557.  
  558.  
  559.     Map: //не наследует коллекции, но идеологически к ним относится
  560.         public interface Map<K, V> {
  561.             int size();
  562.             boolean isEmpty();
  563.  
  564.             boolean containsKey(Object key);
  565.             boolean contatinsValue(Object value);
  566.  
  567.             V get(Object key);
  568.             V put(K key, V value);
  569.  
  570.             V remove(Object key);
  571.             void clear();
  572.  
  573.             Set<K> keySet();
  574.             Collection<V> values();
  575.             Set<Map.Entry<K,V>> entrySet();
  576.         }
  577.  
  578.         Map не реализует Iterable <=> нельзя обходить итераторами
  579.  
  580.         map.forEach((k, v) -> System.out.println("%s => %s\n", k, v)); // принимает экземпляр BiConsumer<T, U>
  581.  
  582.         Реализации:
  583.             HashMap
  584.             LinkedHashMap
  585.             TreeMap
  586.  
  587.     Устаревшие коллекции:
  588.         Vector
  589.         Stack
  590.         Dictionary
  591.         Hashtable
  592.  
  593.     Класс Java.util.Collections:
  594.          Collections.shuffle(list);
  595.          Collections.sort(list);
  596.  
  597.          unmodifiable:
  598.             Set<String> set = Collections.unmodifiableSet(originalSet);
  599.  
  600.             set.remove("abc"); // throws UnsupportedOperationException
  601.  
  602.             Возвращает объект-обертку, реализующий тот же интерфейс, что и переданный параметр и предоставляющий доступ на чтение к элементам коллекции, но любая попытка изменить приведет к выбросу исключения
  603.  
  604.         Collections.toArray()
  605.  
  606. Функциональные интерфейсы:
  607.     @FunctionalInterface
  608.     Интерфейс называется функциональным, если в нем ровно один абстрактный метод (default и статические методы, статические поля не в счет)
  609.  
  610.     Стандартные функциональные интерфейсы находятся в пакете java.util.function, они делятся на 5 семейств
  611.  
  612.     Consumers:
  613.         -принимают значения, но ничего не возвр. взамен
  614.  
  615.         public interface Consumer<T> {
  616.             void accept(T t);
  617.         }
  618.  
  619.         -существуют также IntConsumer, DoubleConsumer... (т.к. нельзя параметризовывать примитивы)
  620.         -можно скомбинировать с помощью метода andThen, compose (разный порядок применения)
  621.     Suppliers:
  622.         -не принимают ничего в кач-ве параметра, а просто возвр. какое-то значение
  623.  
  624.         public interface Supplier<T> {
  625.             T get();
  626.         }
  627.  
  628.     Predicates:
  629.         -их метод принимает значние какого-то типа, возвращает булевское значение
  630.  
  631.         public interface Predicate<T> {
  632.             boolean test(T t);
  633.         }
  634.  
  635.         имеет статические методы negate, and
  636.  
  637.     Functions:
  638.         -принимает аргумент и возвр.элемент какого-то типа
  639.  
  640.         public interface Function<T, R> {
  641.             R apply(T t);
  642.         }
  643.  
  644.     Operators:
  645.         -частный случай функций (на входе и на выходе значения одного и того же типа)
  646.  
  647.         public interface UnaryOperator<T> extends Function<T, T> {
  648.  
  649.         }
  650.  
  651.     Лямбда-выражения:
  652.         Компилятор не требует повторять типы параметров, т.к. он их знает
  653.         IntUnaryOperation square = x -> {
  654.             return x * x;
  655.         }
  656.  
  657.         Внутри лямбды можно обращаться к полям того класса, внутри которого была объявлена лямбда, к переменным, объявленным внутри метода, где была объявлена лямбда (но значния им должны быть присвоены ровно 1 раз до создания лямбды, после чего меняться они уже не могут)
  658.  
  659.         trick:
  660.             int[] counter = new int[] {0};
  661.             IntSupplier sequence = () -> counter[0]++; //ссылка яв-ся эффективно финальной, содержимое - нет
  662.  
  663.         Функциональные интерфейсы также можно инстанцировать с помощью ссылки на метод:
  664.             ToIntFunction<String> intParser = Integer::parseInt
  665.  
  666.         Когда ссылаяемся на статический метод : classanem :: methodname
  667.         На нестатический : имяэкземпляра::имя метода
  668.  
  669.         Можно также ссылаться на конструктор:
  670.             IntFunction<String[]> arrayAllocator = String[]::new
  671.  
  672.         Comparator<Double> absoluteValueComparator = Comparator.comparing(Math::abs, Double::compare);
  673.  
  674. Streams:
  675.     -Stream - посл-ность элементов, потенциально бесконечная
  676.  
  677.  
  678.  
  679.  
  680. Многопоточность:
  681.     Все, что находится в методе main, выполняется в main-потоке, все остальные - отпочковываются от него
  682.  
  683.     В Java многопоточность представлена в виде виртуальной параллельности (процессор быстро переключается между процессами)
  684.  
  685.     Java пытается распределить потоки между ядрами процессора
  686.  
  687.     Основная цель многопоточного программирования - не ускорить работу программы, а реализовать какой-то функционал (к примеру, параллельное обслуживание сервером нескольких клиентов)
  688.  
  689.     Чтобы создать свой поток, нужно отнаследоваться от java.lang.Thread
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement