0% нашли этот документ полезным (0 голосов)
16 просмотров62 страницы

Drip Java Lecture 2

Загружено:

a.sidnevart
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
16 просмотров62 страницы

Drip Java Lecture 2

Загружено:

a.sidnevart
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd

Java Лекция 2

Базовый синтаксис Java

Денис Син
План лекции

Типы данных

Переменные и область
видимости
Операторы

If else, switch и Циклы

Ключевые слова

Массивы и строки

Работа с памятью

2
Повторение
JVM, JDK, JRE

GC

Hello world

3
JDK, JRE, JVM

4
GC - Garbage collector Функция GC
Garbage collector – система, которая раз в какой-то момент времени
освобождает неиспользуемую память

Удобство

Разработчику не нужно
думать про объекты и
руками управлять
памятью, все такую
работу на себя берет GC

5
JVM Архитектура
JVM состоит из 3-х компонентов

▪ Загрузчик классов

▪ Область памяти

▪ Исполнительный механизм

Исполнительный
Загрузчик классов
механизм
Динамически загружает Интерпретирует и
.class файлы в исполняет инструкции
виртуальную машину Java байт кода, в некоторых
случаях применяет JIT
компилятор.

GC (garbage collector)
чистит память

6
Типы данных Примитивные Ссылочные

▪ Предопределены в Java ▪ Создаются разработчиком

▪ Хранят значения ▪ Начинаются с верхнего регистра


В Java существуют 2 вида типов
данных: ▪ Имеют фиксированный размер ▪ Хранят адрес объекта в памяти
• Примитивные
• Ссылочные

7
Примитивные Целочисленные C Плавающей точкой
• byte (1 байт) от -128…127 • float (4 байта) от -3.4E+38…3.4E+38
• short (2 байта) от −215 … 215 − 1 • double (8 байт) от -1.7E+308…1.7E+308
• int (4 байта) от −231 … 231 − 1
• long (4 байта) от −263 … 263 − 1
Всего существует 8 примитивных типов,
которые делятся на 4 группы

Логический Символьный
boolean (1 байт) сhar (1 байт)

8
Ссылочные типы Виды Особенности
данных
• Массивы • Могут иметь значение null
• Классы • Сравниваются по ссылке не по
Хранят адрес расположения • Интерфейсы значению
объекта в памяти • Строки • Создаются разработчиком
• Enum

9
10
Wrapper types

package [Link];

public class WrapperTypes {


public static void main(String[] args) {
Integer a = 1;
Boolean b = false;
long c = 2;
Long d = c;
[Link](a);
[Link](b);
[Link](c);
[Link](d);
}
}

11
Wrapper types

Ссылочные примитивы Зачем нужны? Производительность


Может плохо сказываться на
• Integer, Long, Short, Byte • Позволяют использовать
• Boolean скорости работы программы, так
коллекции с Generic
• Double, Float как создается дополнительный
• Удобно работать, когда нужен
• Character объект
объект обертка

12
Wrapper types с коллекциями

package [Link];

import [Link];
import [Link];

public class Main {


public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
[Link](1);
[Link](2);
[Link](3);
for (var number : numbers) {
[Link](number);
}
}
}

13
Преобразование типов

Явное преобразование типов


• Пунктир – с потерей точности

• Сплошная линия – автоматическое преоборазование

14
Явное преобразование типов

package [Link];

public class TypeConversion {


public static void main(String[] args) {
int a = 5;
byte b = (byte) a;
[Link](b);

int c = 258;
byte d = (byte) c;
[Link](d);
}
}

15
Что будет с кодом?

package [Link];

public class TypeConversion {


public static void main(String[] args) {
int c = 258;
byte d = (byte) c;
[Link](d);
}
}

16
В ответе будет 2

package [Link];

public class TypeConversion {


public static void main(String[] args) {
int c = 258;
byte d = (byte) c;
[Link](d);
}
}

00000000 00000000 00000001 00000010 (258) –> 00000010 (2)

17
Переменные package [Link];

Именованная область памяти для хранения данных, public class Variables {


у каждой переменной есть тип public static void main(String[] args) {
int a = 5;
long b;
int[] c;
}
}

18
Области Локальные переменные Особенности
видимости
package [Link]; • Объявляются внутри методов, • Области видимости могут быть
конструкторов или блоков кода. вложенными.
public class VisibilityAreas { • Доступны только в пределах блока, • Во внутреннем блоке кода нельзя
public static void main(String[] args) где они объявлены. объявлять переменные с тем же
{
• Создаются при входе в блок и именем, что и во внешней области
for (int i = 0; i < 10; i++) {
уничтожаются при выходе из него. действия.
[Link](i * i);
} • Не имеют значений по умолчанию • Модификаторы доступа нельзя
[Link](i); и должны быть инициализированы использовать для локальных
} перед использованием переменных
}

19
Вложенные области видимости

Внутренние области Одинаковые имена во


могут иметь доступ к вложенных блоках
внешним затеняют внешние

20
Вложенные области package [Link];

видимости public class NestedVisibilityAreas {

В данном примере внутри области видимости int number = 10;


метода number затеняется
public static void main(String[] args) {
boolean number = false;
[Link](number);
}
}

21
Вложенные области видимости
Правильное использование областей видимости улучшает структуру кода

Области видимости определяют доступность и время жизни переменных

Понимание областей видимости критично для управления памятью

22
Оптимизация памяти package [Link];

import [Link];

public class VisibilityAreasMemory {


В методе processItem переменная result создает и
void processLargeData(String[] data) {
уничтожается каждый раз в цикле – это позволяет for (String item : data) {
эффективно использовать память String processedItem = processItem(item);
saveToDatabase(processedItem);
}
}

String processItem(String item) {


StringBuilder result = new StringBuilder();
[Link](item);
[Link]("_next_word");
if ([Link]().nextInt() < 10) {
[Link]("Lucky");
}
return [Link]();
}

void saveToDatabase(String item) {


[Link]("Saved item to database");
}
}

23
Операторы
Что это такое Специальные символы, выполняющие определенные действия над операндами

Арифметические
Сравнения
Логические
Присваивания
Побитовые
Условные

Приоритет

24
Operators

Основные категории У всех операторов есть


Символы, выполняющие
операторов приоритет
действия над
переменными • Арифметические
• Сравнения
• Присваивания
• Побитовые
• Логические
• Условные

25
Арифметические Типы Особенности

package [Link]; • + • Целочисленное деление: 5 / 2 = 2


• - • Модуль работает и с отрицательными
public class Operators { • * числами: -7 % 3 = -1
public static void main(String[] args) • / • Операторы присваивания
{ • % остаток от деления =, +=, -=, *=, /=, %=
int x = 1; • ++ инкремент, • Сокращенная запись: a += 5
• -- декремент) эквивалентно a = a + 5
int y = 10;
[Link](y + x);
[Link](y * x);
[Link](2 % y);
[Link](x++);
[Link](++x);
[Link](--y);
[Link](y--);
}
}

26
Логические и Сравнения Логические
сравнения
• == (равно) • & (И)
• != (не равно) • && (сокращенное И)
• < (меньше) • | (ИЛИ)
• > (больше) • || (сокращенное ИЛИ)
• <= (меньше либо равно • ! (НЕ)
• >= (больше либо равно)

27
Безопасная проверка package [Link];

public class BooleanOperators {


public static void main(String[] args) {
Всегда лучше использовать && или || String obj = null;
if (obj != null && [Link]("a")) {
// startWith вызовется когда obj не null
}
}
}

28
Побитовые Операторы Применение
операторы
• & побитовое И • Эффективная работа с флагами
• | побитовое ИЛИ • Оптимизация арифметических
package [Link]; • ^ XOR операций
• ~ побитовое НЕ
public class BitOperators { • << побитовый сдвиг влево
public static void main(String[] args) { • >> побитовый сдвиг вправо
int x = 5;
int y = x << 1;
int z = x >> 1;
[Link](y);
[Link](z);
}
}

29
Особенности операторов
Instanceof Компилятор может
Лучше ставить скобки при приоритетах в
оптимизировать
• Проверяет принадлежность логических операторах
объекта к определенному типу операторы за вас
if ((a > 0 && b < 5) || d < c || (a < b && b > 0)) {
Например, умножение на степени
• Используется для безопасного // Логика
двойки может быть заменено на
приведения типа }
побитовый сдвиг

30
Условный тернарный package [Link];

оператор import [Link];

public class TernaryOperator {


Часто используется на практике public static void main(String[] args) {
Синтаксис: условие ? выражение1 : выражение2 int a = [Link]().nextInt();
int b = [Link]().nextInt();
int max = (a > b) ? a : b;
[Link](max);
}
}

31
Условные конструкции

if-else • Создают ветвления в


switch-case логике
• Позволяют
контролировать поток
выполнения

32
If - else if (condition) {
// Выполняется если условие true
} else {
// Выполняется если условие false
}
Как и в других языка программирования

33
If – else – if if (condition1) {
// Код условия 1
} else if (condition2) {
// Код условия 2
} else {
Как и в других языка программирования // Код если оба условия ложны
}

34
Switch case switch (expression) {
case 'value1':
// код для 1 значения
break;
case 'value2':
Эффективен при множественных сравнения с Java7 // код для 2 значения
поддерживает String break;
default:
// код по умолчанию
}

35
Best practices при if-else
Используйте описательные имена для булевых переменных

Избегайте отрицательных условий

Выносите сложные условия в отдельные методы

36
Best practices при использовании if else

public static void main(String[] args) {


if (isUserEligible() && hasRequiredPermissioins()) {
processRequest();
}
}

static boolean isUserEligible() {


return [Link]().nextBoolean();
}

static boolean hasRequiredPermissioins() {


return [Link]().nextBoolean();
}

static void processRequest() {

}
37
Switch case switch (expression) {
case 'value1':
// код для 1 значения
break;
case 'value2':
Эффективен при множественных сравнения с Java7 // код для 2 значения
поддерживает String break;
default:
// код по умолчанию
}

38
Switch expression package [Link];

(java12+) public class SwitchExpression {


public String getSeasonDescription(int month) {
return switch (month) {
• Компактный синтаксис case 12, 1, 2 -> "Зима - холодное время года ";
• Исключает необходимость писать break case 3, 4, 5 -> "Весна - время пробуждения природы";
• Работает с java12+ case 6, 7, 8 -> "Лето - самое теплое время года";
case 9, 10, 11 -> "Осень - сезон сбора урожая";
default -> "Некорректный номер месяца";
};
}
}

39
Switch expression package [Link];

public class SwitchExpression {


public String getSeasonDescription(int month) {
• Компактный синтаксис
return switch (month) {
• Исключает необходимость писать break case 12, 1, 2 -> "Зима - холодное время года ";
• Работает с java12+ case 3, 4, 5 -> "Весна - время пробуждения природы";
case 6, 7, 8 -> "Лето - самое теплое время года";
case 9, 10, 11 -> "Осень - сезон сбора урожая";
default -> "Некорректный номер месяца";
};
}
}

40
Switch expresion (java13+)
public String getProductTypeByName(String product) {
var result = switch (product) {
case "Apple", "Peach" -> {
[Link]("This is fruit");
yield "Fruit";
}
case "Raspberry", "Cherry" -> {
[Link]("This is a Berry");
yield "Berry";
}
case "Tomato" -> {
[Link]("This is a Vegetables");
yield "Vegetables";
}
default -> {
[Link]("Other");
yield "other";
}
};
return result;
}

41
Switch best practices
Используйте switch для перечислений (enum)

Всегда включайте default case

Группируйте связанные case-метки

Предпочитайте switch expressions для простых сценариев

42
Циклы Виды Особенности

• for • Чаще всего применяются только for


• while и foreach
• do while • В последнее время обработка
• foreach (расширенный for) коллекций и массивов данных идет
без циклов
• Для коллекций и массивов нужно
использовать foreach

43
For for (инициализация; условие; итерация) {
// тело цикла
}
• Используется, когда количество итераций
for (int i = 0; i < 10; i++) {
известно заранее [Link](i);
• Компактная запись с инициализацией, условием и }
обновлением в одной строке

44
while и do while while (условие) {
// тело цикла
}
• While проверяет условие перед выполнением
do {
• Do-While выполняется хотя-бы один раз затем // тело цикла
проверяет условие } while (условие);

45
Foreach for (Тип элемент: коллекция) {
// тело
}
• Используется для перебора коллекций и массивов
• Более читаемый и меньше подверженный int[] numbers = {1, 2, 3, 4};
ошибкам for (int number : numbers) {
[Link](number);
}

46
Метки в цилках

outerLoop: for (int i = 0; i < 5; i++) {


innerLoop: for (int j = 0; j < 5; j++) {
if (i == 2 && j == 2) {
[Link]("Выход из обоих циклов при i = 2, j = 2");
break outerLoop;
}
if (j == 3) {
[Link]("Переход к следующей итерации внешнего цикла при j = 3");
continue outerLoop;
}
[Link]("i = " + i + ", j = " + j);
}
}

47
Best practices
Избегайте вечных циклов, пожалуйста))

Используйте break для преждевременного выхода из цикла при необходимости

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

48
Final final int a = 1;
a = 2;
// Не скомпилируется
• Не дает изменить значение переменной
• Не дает изменить ссылку если тип ссылочный final String a = "hello";
a = "abc";
// Не скомпилируется

49
Unreacheable code

final boolean flag = false;

while (flag) {
// Не скомпилируется unreacheable code
}

50
Var var i = 1;
var s = "hello";
var g = 23.0;
• Получили в java 10
[Link](i);
• Можно не писать тип если он понятен [Link](s);
• Но лучше не злоупотреблять) [Link](g);

51
Массивы

package [Link];

public class Arrays {


public static void main(String[] args) {
int[] numbers = {1, 2, 3, 3, 2, 1};
String[] words = {"Hello", ",", "world", "!"};
int a[];

[Link]([Link]);
[Link]([Link]);
}
}

52
Массивы
Из любого типа можно построить массив

Длина массива определяется в runtime

Массив аллоцируется в куче и передается по ссылке

Массивы проверяют тип данных и границы в runtime

Массивы в реальной жизни не используются

53
Инициализация Объявление Инициализация
и объявление
Два вариант объявления • Int[] a = new int[100]
• Int[] a • Int[] a = {1, 3, 5};
• Int a[] • Foo(new int[]{23, 24, 30})
• Лучше использовать 1 вариант

54
Массивы передаются по ссылке

int[] luckyNumbers = smallPrimes;


luckyNumbers[5] = 12; // теперь smallPrimes[5] тоже 12

luckyNumbers = [Link](luckyNumbers, 2 * [Link]); //теперь luckyNumbers это


отдельный массив //и он стал в два раза длиннее

55
Многомерные int[][] matrix = new int[3][4];
// или
массивы int[][] matrix = {
{1, 2, 3, 4},
• Многомерные массивы в Java представляют собой
{5, 6, 7, 8},
массивы массивов, что позволяет создавать {9, 10, 11, 12}
структуры данных с несколькими измерениями };
• Хороши для представления матриц

56
Массивы Свойства Ограничения

▪ Быстрый доступ к элементам ▪ Фиксированный размер после


создания
▪ Эффективное использование
памяти ▪ Однородность типов данных

▪ Поддерживают многомерные ▪ Необходимость в ручном


структуры управлении размера

▪ Удобство хранения однородных ▪ Отсутствие встроенных методов


данных работы с массивами

57
Строки String a = "Hello";
String b = "Java is the best";
String c = "Kotlin";
String d = "";
• Строки представлены в Java классом String
• Последовательность символов [Link]([Link]());
[Link](b);

58
Неизменяемость String s = "Hello";
s = [Link]("world"); // создается новый объект

• Строки неизменяемы
• Операции над строками создают новые объекты

59
Сравнение строк

60
Пул строк

61
Всем больше Java

Вам также может понравиться