Java. (Лекция 4)

Содержание

Слайд 2

Загадка Бейсбольная бита и мяч вместе стоят $1.10 (доллар и 10

Загадка

Бейсбольная бита и мяч вместе стоят $1.10 (доллар и 10 центов).

Бита ровно на доллар дороже, чем мяч. Сколько стоит мяч (в центах)?
Слайд 3

Загадка В озере есть участок, заросший кувшинками. Каждый день этот участок

Загадка

В озере есть участок, заросший кувшинками. Каждый день этот участок увеличивается

в размере в 2 раза. Известно, что кувшинки покроют всю поверхность озера за 48 дней.
За сколько дней кувшинки покроют ровно половину поверхности озера?
Слайд 4

Загадка

Загадка

Слайд 5

Загадка

Загадка

Слайд 6

Коллекции Коллекции – это хранилища объектов. С ними работать очень удобно

Коллекции

Коллекции – это хранилища объектов.
С ними работать очень удобно когда у

вас множество одинаковых объектов
В Java коллекции описаны следующими интерфейсами:
Слайд 7

List List – это динамический список(массив). Это не класс, а интерфейс.

List

List – это динамический список(массив). Это не класс, а интерфейс.
Интерфейс

List описывает как должен работать динамический список. В нем есть следующие методы: add() – добавление нового элемента
remove() – удаление элемента
size() – размер списка contains() – проверяет содержит ли список указанный элемент.
При объявлении списка, можно и нужно указать тип хранимых объектов в списке. List list; // вместо Type пишется тип
Например, список строк: List strs;
Или список целых чисел List ints;
Все коллекции могут работать только с классами. Вместо примитивных типов, нужно использовать их обертки:
int – Integer, double – Double, char – Character, boolean – Boolean ..
Слайд 8

List ArrayList - это класс, который реализует интерфейс List. Так создается

List

ArrayList - это класс, который реализует интерфейс List. Так создается список

строк:
List names = new ArrayList();
Добавление новых элементов: names.add(“Elizabeth”); String kingsName = “Arthur”; names.add(kingsName);
Получение количества элементов: int count = names.size(); //вернет 2
Удаление какого-либо элемента: names.remove(“Elizabeth”);
Очищение списка: names.clear();
Перед добавлением или удалением, вы можете проверить есть ли этот элемент в списке: if (names.contains(“James”)){ names.remove(“James”); }
Слайд 9

List Списки можно перебирать циклом for: for(String name: names){ System.out.println(name); }

List

Списки можно перебирать циклом for: for(String name: names){ System.out.println(name); }
Списки могут быть любого

типа: List cars = new ArrayList(); //список машин List printers = new ArrayList;
Элементы можно получать по индексу как в массивах: printers.get(0); //получить 0-вой элемент names.get(12); //получить 12-й элемент
Если элемента с таким индексом нет, вы получите IndexOutOfBoundsException
Слайд 10

Set Set – это неупорядоченное множество уникальных элементов. В отличие от

Set

Set – это неупорядоченное множество уникальных элементов. В отличие от List,

в Set нельзя добавлять повторно один и тот же элемент.
Set содержит такие же методы как у List: add(), remove(), size(), contains() кроме get() потому что из множества нельзя получить определенный элемент. Его элементы можно только перебрать циклом.
Или проверить содержит ли множество какое-либо значение. contains()
Так же при объявлении желательно указывать тип хранимых элементов: Set strs; // множество строк Set doubles; //множетсо Double
Слайд 11

Set Стандартная реализация интерфейса Set это HashSet: Set books = new

Set

Стандартная реализация интерфейса Set это HashSet: Set books = new HashSet()
Добавление
books.add(“Harry

Potter 1”);
books.add(“Master and Margaret”);
3. Удаление :
books.remove(“Harry Potter 1”); 4. провека сущестования элемента во множестве: books.contains(“Sherlock”);
5. Даже если добавить один и тот же элемент два раза, множество будет содержать этот элемент всего один раз, в отличие от списка.
Слайд 12

Map Map – словарь или ассоциативный массив - это множество пар,

Map

Map – словарь или ассоциативный массив - это множество пар, где

каждому ключу соответствует определенное значение.
В словаре можно хранить разные значения по определенному уникальному ключу. И каждый уникальный ключ будет соответствовать определенному значению “first name” - > “Jonathan” “last name” -> “Livingston” “city” -> “New York”
Так как и словаря есть ключ и значение, для него нужно указывать сразу два типа при объявлении: тип ключа и тип значения: Map info;
Слайд 13

Map HashMap – стандартная реализация интерфейса Map. Map scores = new

Map

HashMap – стандартная реализация интерфейса Map. Map scores = new HashMap

Integer>;
Добавление нового значения по ключу: scores.put(“Marina”, 3); // У Марины три очка scores.put(“Syrym”, 4); // У Сырым 4 очка
Удаление ключа со значением: scores.remove(“Syrym”);
Получить значение можно по ключу: scores.get(“Marina”); // получим 3
Проверить содержит ли словарь, данный ключ: scores.containsKey()
Проверить содержит ли словарь, данное значение: scores.containsValue()
Получить все ключи: Set keys = scores.keySet();
Получить все значения: Collection values = scores.values();
Слайд 14

Map Пример: Допустим вы хотите хранить разную информацию о каком либо

Map

Пример: Допустим вы хотите хранить разную информацию о каком либо человеке

и заранее не знаете сколько информации может быть о нем. Для этого вы можете создать словарь и добавлять в него любую информацию по мере нахождения:
Потом вы можете все это обработать или сохранить или вывести, перебрав все элементы:

Map info = new HashMap<>(); info.put("Имя", "Рапунцель"); info.put("Должность", "Принцесса"); info.put("Особенность", "Волшебные волосы"); info.put("Родина", "Арендел");

for(String key: info.keySet()){ String value = info.get(key); System.out.println(key+": "+value); }

Должность: Принцесса Родина: Арендел Особенность: Волшебные волосы Имя: Рапунцель

Слайд 15

Queue Queue – это очередь. Т.е. Коллекция которая работает по принципу

Queue

Queue – это очередь. Т.е. Коллекция которая работает по принципу FIFO

– “Первым вошел – первым вышел”. Т.е. В очередь можно добавлять элементы в любом порядке. А получать элементы из нее только по одному в порядке добавления.
У очереди есть методы: add() – добавление элемента в конец очереди poll() – получить первый элемент и удалить его с очереди peek() – получить первый элемент, но не удалять его remove() – просто удалить первый элемент
isEmpty() – проверка пустоты очереди
Очередь используется когда важен порядок элементов. Например: Диспетчер задач может иметь список задач на выполнение. Задачи поступают в разное время, и диспетчер должен выполнить их в порядке поступления.
Или очередь покупателей. Какой покупатель пришел первым, того и первым обслуживают.
Слайд 16

Queue LinkedList – это стандартная реализация очереди. Queue очередь = new

Queue

LinkedList – это стандартная реализация очереди. Queue<Задача> очередь = new LinkedList<Задача>();
Как

примерно выглядит добавление в очередь и ее обработка:

Queue<Задача> очередь = new LinkedList<Задача>(); очередь.add(new Задача("Какая то задача 1")); Задача задача2 = new Задача("задача 2"); очередь.add(задача2); // один и тот же элемент очередь.add(задача2); // можно несколько раз добавлять while (!очередь.isEmpty()){ Задача текущаяЗадача = очередь.poll(); текущаяЗадача.запустить(); }

Слайд 17

Generics Все эти описанные коллекции являются «Обобщенными» типами или “Generic types”.

Generics

Все эти описанные коллекции являются «Обобщенными» типами или “Generic types”.
Generic types

или Generics – это типы которые могут иметь параметры.
И как параметрами для них выступают другие типы данных.
Параметры указываются внутри треугольных скобок рядом с именем типа: List, ArrayList, Map, Queue<Задача>
Такие типы должны уметь работать с любыми другими типами, т.е. быть универсальными.
Вы также можете создавать Generic типы или классы
Для этого при описании класса или интерфейса, должны указать что ваш класс принимает параметр внтури треугольных скобок: public class Box
Слайд 18

Generics Реализуем класс коробку, в которую можно положить любой другой объект,

Generics

Реализуем класс коробку, в которую можно положить любой другой объект, но

только один. При этом вначале указав какого типа объект может в себе держать коробка.
Создание объекта коробки, которая может держать машину в себе:

public class Box { //T – это параметр-тип, он может быть любым private T element; //Поэтому мы заранее не можем сказать // какого типа будет element public T getElement() { return element; } public void putElement(T element) { this.element = element; } }

Box carBox = new Box(); //Car будет подставлен вместо T Car car = new Car(); carBox.putElement(car);

Слайд 19

Обработка ошибок Программа не всегда может работать так, как ожидается от

Обработка ошибок

Программа не всегда может работать так, как ожидается от нее.
На

это могут повлиять внешние факторы как: Память, ресурсы, пользовательское вмешательство и т.п.
На это могут повлиять случаи, которые не учел программист. Т.е. Исключительные ситуации.
И когда ваша программа не знает что дальше делать, она «вылетает» или «кидает» ошибку.
Когда программа вылетает, в обычно видите информацию о том в каком месте произошла ошибка: Это StackTrace
Чтобы пользователь не чувствовал дискомфорта при использовании нашей программы или чтобы программа не вылетала просто, мы должны уметь отлавливать такие ошибки и обрабатывать их как нужно.
Это называется обработкой ошибок.

Exception in thread "main" java.util.NoSuchElementException at java.util.LinkedList.getFirst(LinkedList.java:242) at java.util.LinkedList.element(LinkedList.java:661) at collections.Main.main(Main.java:33)

Слайд 20

Обработка ошибок StackTrace показывает какая последовательность вызовов методов была произведена перед

Обработка ошибок

StackTrace показывает какая последовательность вызовов методов была произведена перед тем

как произошла ошибка. И читается снизу вверх. Т.е. Нижные вызовы были первее верхних.
StackTrace помогает нам понять причину ошибки и обнаружить его местонахождение, показывая тип ошибки, в каком файле и в какой строчке произошла ошибка.
Если мы знаем в каком месте произойдет ошибка, мы можем ее обработать, не останавливая выполнение программы. Это делается с помощью операторов try, catch

Exception in thread "main" java.util.NoSuchElementException at java.util.LinkedList.getFirst(LinkedList.java:242) at java.util.LinkedList.element(LinkedList.java:661) at collections.Main.main(Main.java:33)

try { очередь.element(); //здесь может произойти ошибка, если очередь пустая } catch(NoSuchElementException e){ ... //сделать что нибудь или проигнорировать }

Слайд 21

Обработка ошибок Внутри оператора try { } может находиться любой код,

Обработка ошибок

Внутри оператора try { } может находиться любой код, который

может вызвать исключительную ситуацию.
После try всегда идет один или несколько операторов catch, каждый из которых ловит определенный тип ошибок или исключительных ситуаций. Поэтому в операторе catch указывается тип ошибки. Внутри оператора catch может быть любой код, который как то обработает пойманную ошибку. Пример:

try { очередь.element(); } catch(NoSuchElementException e){ //Элементов нет System.out.print("Очередь пустая"); } catch(NullPointerException e){ // Очередь не инициализирована System.out.print("Очередь еще не создана"); }

Слайд 22

Обработка ошибок Ошибки – это обычные классы, которые наследуются от классов

Обработка ошибок

Ошибки – это обычные классы, которые наследуются от классов Error,

Exception.
По умолчанию наследники от Error – это серьезные системные ошибки, связанные с ОС или Java машиной, которые нельзя обработать в основном никак. Например: VirtualMachineError, ThreadDeath
Наследники Exception – это не очень серьезные ошибки, которые не причиняют большого вреда программе, и их можно и нужно обработать. Например: EOFException, NullPointerException, NoSuchElementException.
Java не позволит вам скомпилировать программу, пока вы не обработаете все необходимые исключительные ситуации.
Есть еще класс RuntimeException, наследников которого Java позволяет не обрабатывать, но соответственно они не должны причинять никакого значимого вреда программе.
Слайд 23

Обработка ошибок Можно так же создавать свои классы ошибок и исключительных

Обработка ошибок

Можно так же создавать свои классы ошибок и исключительных ситуаций.
Для

этого нужно унаследовать от какого либо класса ошибок. Например:
Чтобы вызвать ошибку в коде, используется оператор throw
Например вызовем ошибку, если краска закончилась в принтере:
При этом мы должны указывать наш метод может вызвать исключительную ситуацию

public class CartridgeException extends Exception { … }

public void print(String text) throws CartridgeException { if(cartrdge.isEmpty()){ throw new CartridgeException(); } }

Слайд 24

Итоги Коллекции List, ArrayList Set, HashSet Map, HashMap Queue, LinkedList Метод

Итоги

Коллекции
List, ArrayList
Set, HashSet
Map, HashMap
Queue, LinkedList
Метод add()
Метод isEmpty()
Generics
Error
Exception
throw
try
catch