Одинарные и двойные кавычки
В Java есть такое понятие, как символ (Char). Это определённая буква, цифра, эмодзи и т.д. Несколько таких символов уже составляют строку (String).
Так вот, в одинарных кавычках мы записываем только один символ, а в двойных кавычках мы создаём строку.
С этим нужно быть очень осторожным, поскольку пытаясь получить
#java #lesson #theory
В Java есть такое понятие, как символ (Char). Это определённая буква, цифра, эмодзи и т.д. Несколько таких символов уже составляют строку (String).
Так вот, в одинарных кавычках мы записываем только один символ, а в двойных кавычках мы создаём строку.
С этим нужно быть очень осторожным, поскольку пытаясь получить
"MY"
, выполняя 'M' + 'Y'
, вы получите 166.#java #lesson #theory
Строка на несколько строк
Бывает так, что нам нужно вписать какое-то огромное выражение и сделать это так, чтобы оно выглядело по человечески. Это может быть длинный SQL запрос.
Тут есть два варианта: использовать «одномерные» строковые литералы или «многомерные» (которые начинаются и заканчиваются на """).
Доступно с Java 15.
📌 Документация
#java #lesson #theory
Бывает так, что нам нужно вписать какое-то огромное выражение и сделать это так, чтобы оно выглядело по человечески. Это может быть длинный SQL запрос.
Тут есть два варианта: использовать «одномерные» строковые литералы или «многомерные» (которые начинаются и заканчиваются на """).
Доступно с Java 15.
📌 Документация
#java #lesson #theory
Нужно быстро отправить файлы с одного компьютера на другой?
Важное условие, чтобы они были в одной локальной сети. Вы можете запустить сервер на Java и перекинуть файлы с одного компьютера на другой.
Для этого вводите:
📌 Документация
Доступно с Java 18
#java #lesson #tricks
Важное условие, чтобы они были в одной локальной сети. Вы можете запустить сервер на Java и перекинуть файлы с одного компьютера на другой.
Для этого вводите:
jwebserver -b 0.0.0.0
, а на другом компьютере открываете сервер по IP, выбираете и загружаете нужный вам файл.📌 Документация
Доступно с Java 18
#java #lesson #tricks
Нативные методы и библиотеки
К сожалению, не все участки программы можно реализовать на чистой Java. Чтобы добавить функционал других языков на конкретных машинах используют ключевое слово native.
Его используют для объявления в метода, который будет имплементирован в библиотеке с расширением .dll или .so. Загрузить библиотеку в JVM надо в рантайме с помощью метода System.loadLibrary("name").
Чтобы добавить путь к нативной библиотеке, его указывают как VM-переменную:
К сожалению, не все участки программы можно реализовать на чистой Java. Чтобы добавить функционал других языков на конкретных машинах используют ключевое слово native.
Его используют для объявления в метода, который будет имплементирован в библиотеке с расширением .dll или .so. Загрузить библиотеку в JVM надо в рантайме с помощью метода System.loadLibrary("name").
Чтобы добавить путь к нативной библиотеке, его указывают как VM-переменную:
-Djava.library.path=/path/to/lib
#java #lesson #advancedРефлексия
Java Reflection API — интерфейс, который позволяет анализировать компоненты и окружение во время выполнения, изменять своё поведение и структуру.
Это очень удобно, так можно создать новый класс, которого не было во время компиляции или узнать что-то новое о методе.
Но это сделает ваше приложение более медленным, уязвимым и нестабильным. Пользоваться ей стоит только в крайних случаях.
#java #lesson #theory
Java Reflection API — интерфейс, который позволяет анализировать компоненты и окружение во время выполнения, изменять своё поведение и структуру.
Это очень удобно, так можно создать новый класс, которого не было во время компиляции или узнать что-то новое о методе.
Но это сделает ваше приложение более медленным, уязвимым и нестабильным. Пользоваться ей стоит только в крайних случаях.
#java #lesson #theory
Работаем со временем
В пакете java.util есть класс
Самое интересное и сложное здесь —
📌 Документация
#java #lesson #data
В пакете java.util есть класс
Date()
. Он позволяет узнать, который сейчас час или просто представить какой-либо день.Самое интересное и сложное здесь —
SimpleDateFormat()
. Форматирование определяет то как дата будет считываться/выводится (а это важная задача).📌 Документация
#java #lesson #data
Бесконечность в Java
Это особое состояние числа с плавающей запятой. Оно всегда меньше или больше абсолютно любого другого числа.
Найти их можно в классе Double/Float под названием NEGATIVE_INFINITY и POSITIVE_INFINITY.
Ещё интересная фишка — эти числа больше/меньше не только других чисел, но и себя.
#java #lesson #features
Это особое состояние числа с плавающей запятой. Оно всегда меньше или больше абсолютно любого другого числа.
Найти их можно в классе Double/Float под названием NEGATIVE_INFINITY и POSITIVE_INFINITY.
Ещё интересная фишка — эти числа больше/меньше не только других чисел, но и себя.
#java #lesson #features
Тестируем код
Человеку свойственно совершать ошибки, как бы ему не хотелось, поэтому после каждых изменений систему нужно проверять.
Для этого у нас есть JUnit — самая популярная библиотека чтобы доказать, что тут всё работает и можно спокойно пушить изменения.
📖 Документация
#java #lesson #testing
Человеку свойственно совершать ошибки, как бы ему не хотелось, поэтому после каждых изменений систему нужно проверять.
Для этого у нас есть JUnit — самая популярная библиотека чтобы доказать, что тут всё работает и можно спокойно пушить изменения.
📖 Документация
#java #lesson #testing
Синхронизация потоков
Пока один поток изменяет значение, а второй его считывает, они оба могут получить две абсолютно разные величины. Это может привести к ошибке согласованности памяти.
Простое решение — использовать synchronized. Он приостанавливает один поток, пока второй работает с ячейкой памяти.
📌 Объяснение от Oracle
#java #lesson #multithreading
Пока один поток изменяет значение, а второй его считывает, они оба могут получить две абсолютно разные величины. Это может привести к ошибке согласованности памяти.
Простое решение — использовать synchronized. Он приостанавливает один поток, пока второй работает с ячейкой памяти.
📌 Объяснение от Oracle
#java #lesson #multithreading
BigInteger и BigDecimal
Полезно, если вам нужно работать прямо с очень большими числами (если число больше чем 2 147 483 647). Классы могут хранить числа любого размера и выполнять с ними математические задачи.
#java #lesson #features
Полезно, если вам нужно работать прямо с очень большими числами (если число больше чем 2 147 483 647). Классы могут хранить числа любого размера и выполнять с ними математические задачи.
BigInteger
позволяет нам работать с целыми числами, в то время как BigDecimal
нужен для чисел с плавающей запятой.#java #lesson #features
Синхронизация потоков
Пока один поток изменяет значение, а второй его считывает, они оба могут получить две абсолютно разные величины. Это может привести к ошибке согласованности памяти.
Простое решение — использовать synchronized. Он приостанавливает один поток, пока второй работает с ячейкой памяти.
📌 Объяснение от Oracle
#java #lesson #multithreading
Пока один поток изменяет значение, а второй его считывает, они оба могут получить две абсолютно разные величины. Это может привести к ошибке согласованности памяти.
Простое решение — использовать synchronized. Он приостанавливает один поток, пока второй работает с ячейкой памяти.
📌 Объяснение от Oracle
#java #lesson #multithreading
BigInteger и BigDecimal
Полезно, если вам нужно работать прямо с очень большими числами (если число больше чем 2 147 483 647). Классы могут хранить числа любого размера и выполнять с ними математические задачи.
#java #lesson #features
Полезно, если вам нужно работать прямо с очень большими числами (если число больше чем 2 147 483 647). Классы могут хранить числа любого размера и выполнять с ними математические задачи.
BigInteger
позволяет нам работать с целыми числами, в то время как BigDecimal
нужен для чисел с плавающей запятой.#java #lesson #features
Кроссплатформенность
Это способность одного и того же кода запускаться на разных машинах, на разных операционных системах и работать при этом стабильно.
В Java такое достигается за счёт JVM (Java virtual machine). Эта система берёт ваш код и переводит его в понятный компьютеру язык.
Задач у JVM, на самом деле, несколько больше. Виртуальная машина ещё занимается организацией памяти и сборкой мусора.
#java #lesson #theory
Это способность одного и того же кода запускаться на разных машинах, на разных операционных системах и работать при этом стабильно.
В Java такое достигается за счёт JVM (Java virtual machine). Эта система берёт ваш код и переводит его в понятный компьютеру язык.
Задач у JVM, на самом деле, несколько больше. Виртуальная машина ещё занимается организацией памяти и сборкой мусора.
#java #lesson #theory
Generics
Обобщения (Generics) позволяют нам уйти от жёстких ограничений используемых типов. Так мы сохраняем типобезопасность, но при этом используем разные классы.
Возьмём, к примеру, банковский счёт, где id может быть и Integer, и String, и UUID. Тогда нам надо создать класс, который принимает тип T и подставляет его там, где нужно.
При вызове обобщения передаются так:
#lesson #java #theory
Обобщения (Generics) позволяют нам уйти от жёстких ограничений используемых типов. Так мы сохраняем типобезопасность, но при этом используем разные классы.
Возьмём, к примеру, банковский счёт, где id может быть и Integer, и String, и UUID. Тогда нам надо создать класс, который принимает тип T и подставляет его там, где нужно.
При вызове обобщения передаются так:
Account<Integer>
. На месте, где раньше стоял T будет Integer.#lesson #java #theory
Atomic
Блокировки тяжеловесны, они мешают остальным потокам выполнятся, так как блокируют их, что сильно снижает производительность.
Разработчики придумали неблокирующие алгоритмы. Их сложнее реализовывать, но они более масштабируемые и быстрые.
Классы для реализации неблокирующих программ находятся в пакете
📌 Документация
#java #lesson #concurrent
Блокировки тяжеловесны, они мешают остальным потокам выполнятся, так как блокируют их, что сильно снижает производительность.
Разработчики придумали неблокирующие алгоритмы. Их сложнее реализовывать, но они более масштабируемые и быстрые.
Классы для реализации неблокирующих программ находятся в пакете
java.util.concurrent.atomic
. 📌 Документация
#java #lesson #concurrent
Atomic
Блокировки тяжеловесны, они мешают остальным потокам выполнятся, так как блокируют их, что сильно снижает производительность.
Разработчики придумали неблокирующие алгоритмы. Их сложнее реализовывать, но они более масштабируемые и быстрые.
Классы для реализации неблокирующих программ находятся в пакете
📌 Документация
#java #lesson #concurrent
Блокировки тяжеловесны, они мешают остальным потокам выполнятся, так как блокируют их, что сильно снижает производительность.
Разработчики придумали неблокирующие алгоритмы. Их сложнее реализовывать, но они более масштабируемые и быстрые.
Классы для реализации неблокирующих программ находятся в пакете
java.util.concurrent.atomic
. 📌 Документация
#java #lesson #concurrent
javadoc
Это генератор документации в HTML-формате из комментариев исходного кода Java. Комментарии для документации определяются так:
У javadoc есть дескрипторы:
#java #lesson #javadoc
Это генератор документации в HTML-формате из комментариев исходного кода Java. Комментарии для документации определяются так:
/** комментирование документации */
.У javadoc есть дескрипторы:
@author
, @version
, @since
, @see
, @param
, @return
, которые определяют какое значение мы записываем в комментариях.#java #lesson #javadoc
Не оставляйте try/catch блоки пустыми
Обязательно выводите ошибки или обрабатывайте их! Если их игнорировать, будет трудно найти баг и придётся дебажить код.
Исключения стоит выводить хотя бы через
#java #lesson #best_practices
Обязательно выводите ошибки или обрабатывайте их! Если их игнорировать, будет трудно найти баг и придётся дебажить код.
Исключения стоит выводить хотя бы через
System.out.println()
, но ещё лучше воспользоваться логгером log4j.#java #lesson #best_practices
Scanner
Класс, способный получать данные от пользователя через командную строку. На вход Scanner принимает строку или I/O объект.
Если это String, то объект можно использовать для последовательного считывания строк.
Если это I/O объект, то позволяет считывать разные типы данных: строки, числа и подобное. Для получения данных от пользователя, передаём
#java #lesson #scanner
Класс, способный получать данные от пользователя через командную строку. На вход Scanner принимает строку или I/O объект.
Если это String, то объект можно использовать для последовательного считывания строк.
Если это I/O объект, то позволяет считывать разные типы данных: строки, числа и подобное. Для получения данных от пользователя, передаём
System.in
.#java #lesson #scanner