Даны три строки кода:
String s = null;
s = "Hellow";
s = null;
Создали переменную s типа String, которая ни на что не ссылается (хранит пустую ссылку null).
Создаем объект-строку Hellow, переменная s хранит ссылку на объект.
Удаляем из переменной s ссылку на объект.
Вопрос: что происходит со строкой Hellow после удаления ссылки на неё? Остаётся ли она в памяти или удаляется вместе со ссылкой?
В данном сценарии строковый литерал "Hellow" определён в момент компиляции и соответственно будет размещён в пуле строк (string pool).
В старых версиях (Java 6 и раньше) пул строк являлся частью постоянной области памяти PermGen, которая не относилась к основной куче (Heap) и имела постоянный размер, который нельзя было увеличить.
Сборка мусора запускается только при условии, что существующая память исчерпана. Как правило, вероятность такого сценария для постоянной области памяти пренебрежимо мала -- нужно было бы или загружать множество классов или постоянно добавлять в пул новые строки при помощи String::intern. В худшем случае можно было бы добиться и OutOfMemoryError.
Начиная с Java 7 и выше пул строк размещается в куче (heap), для которой сборка мусора вызывается чаще (по сравнению с PermGen), при этом неиспользуемые строки удаляются из пула, освобождая память.
При необходимости размер кучи может увеличиваться, в том числе и превышая объём доступной физической памяти.
#junior #java
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🤔4❤2🔥2
Каким будет результат сравнения в следующем коде?
Ответ:
s1 == s2 ? true
s1 == s3 ? false
s1 equals s3 ? true
Вопрос на понимание работы пула строк в Java и на понимание сравнения строк. Разберем детально: Переменная s1 ссылается на строку в пуле уникальных строк в памяти, переменная s2 ссылается на ту же саму строку в пуле уникальных строк, что и переменная s1, первое сравнение будет true, так как s1 и s2 ссылаются на один и тот же объект. Переменная s3 ссылается на новый объект, который не находится в пуле уникальных строк, так как он создан через new, следовательно второе сравнение будет false, так как сравниваем переменные которые ссылаются на на два разных объекта. Третье сравнение будет true, так как мы сравниваем строки посимвольно на эквивалентность через equals, а содержимое данных строк одинаково.
#junior #собеседования
@javatg
s1 == s2 ? true
s1 == s3 ? false
s1 equals s3 ? true
Вопрос на понимание работы пула строк в Java и на понимание сравнения строк. Разберем детально: Переменная s1 ссылается на строку в пуле уникальных строк в памяти, переменная s2 ссылается на ту же саму строку в пуле уникальных строк, что и переменная s1, первое сравнение будет true, так как s1 и s2 ссылаются на один и тот же объект. Переменная s3 ссылается на новый объект, который не находится в пуле уникальных строк, так как он создан через new, следовательно второе сравнение будет false, так как сравниваем переменные которые ссылаются на на два разных объекта. Третье сравнение будет true, так как мы сравниваем строки посимвольно на эквивалентность через equals, а содержимое данных строк одинаково.
#junior #собеседования
@javatg
👍24❤10🔥2👎1
🔥20 приемов кода Java, которые помогут повысить вашу производительность
1. Используйте расширенный цикл for.
Расширенный цикл for, также известный как цикл for-each, позволяет перебирать массивы или коллекции без ручного управления индексами. Это упрощает код и делает его более читабельным. Взглянем на пример:
i
Stream API, представленный в Java 8, расширяет возможности при выполнении операций обработки коллекций. Он позволяет выполнять такие действия, как фильтрация, сопоставление и сокращение, более лаконичным образом. Потоки могут улучшить читаемость кода и уменьшить количество шаблонов. Например:
3. Пользуйтесь преимуществом ключевого слова var (Java 10+).
Ключевое слово var позволяет вам объявлять переменные с неявным выводом типа. Это уменьшает потребность в явном указании типов, делая код более кратким. Еще один пример кода:
4. Используйте StringBuilder для эффективного объединения строк.
При объединении нескольких строк использование класса StringBuilder более эффективно, чем многократное использование оператора v+. StringBuilder позволяет избежать создания ненужных объектов и обеспечивает более высокую производительность. Взгляните на этот код:
5. Применяйте тернарный оператор для кратких условных выражений.
Тернарный оператор
При работе с ресурсами, которые реализуют интерфейс
Оператор ромба (
8. Используйте пакет java.time для операций с датой и временем.
В Java 8 появился пакет java.time, который предоставляет более полный и интуитивно понятный API для работы с датой и временем. Он предлагает такие классы, как
9. Применяйте ссылки на методы.
Ссылки на методы позволяют обращаться к методу по его имени, не вызывая его. Они могут сделать ваш код более лаконичным и выразительным, особенно при работе с функциональными интерфейсами. Например:
10. Используйте методы по умолчанию (default) в интерфейсах.
Начиная с Java 8, интерфейсы могут иметь методы по умолчанию, которые обеспечивают реализацию по умолчанию (default-реализацию). Методы по умолчанию позволяют добавлять в интерфейсы новые методы, не нарушая существующие реализации. Они могут быть удобны для добавления служебных методов к интерфейсам или обеспечения поведения по умолчанию.
#junior
📌 Читать дальше
@javatg
1. Используйте расширенный цикл for.
Расширенный цикл for, также известный как цикл for-each, позволяет перебирать массивы или коллекции без ручного управления индексами. Это упрощает код и делает его более читабельным. Взглянем на пример:
i
nt[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
// Делаем что-то с number
}
2. Используйте Java Stream API.Stream API, представленный в Java 8, расширяет возможности при выполнении операций обработки коллекций. Он позволяет выполнять такие действия, как фильтрация, сопоставление и сокращение, более лаконичным образом. Потоки могут улучшить читаемость кода и уменьшить количество шаблонов. Например:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(n -> n)
.sum();
3. Пользуйтесь преимуществом ключевого слова var (Java 10+).
Ключевое слово var позволяет вам объявлять переменные с неявным выводом типа. Это уменьшает потребность в явном указании типов, делая код более кратким. Еще один пример кода:
var message = "Hello, world!";
var numbers = List.of(1, 2, 3, 4, 5);
4. Используйте StringBuilder для эффективного объединения строк.
При объединении нескольких строк использование класса StringBuilder более эффективно, чем многократное использование оператора v+. StringBuilder позволяет избежать создания ненужных объектов и обеспечивает более высокую производительность. Взгляните на этот код:
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("world");
String result = sb.toString();
5. Применяйте тернарный оператор для кратких условных выражений.
Тернарный оператор
(?
🙂
позволяет записывать простые условные выражения в компактной форме. Это может быть полезно для присвоения значений или выполнения простой логики ветвления. Например:int x = 10;
String message = (x > 5) ? "Greater than 5" : "Less than or equal to 5";
6. Используйте try-with-resources для автоматического управления ресурсами.При работе с ресурсами, которые реализуют интерфейс
AutoCloseable
, такими как файловые потоки или соединения с базой данных, лучше использовать оператор try-with-resources, чтобы обеспечить надлежащую очистку ресурсов, не закрывая их явным образом. Посмотрите на пример кода:try (FileWriter writer = new FileWriter("myfile.txt")) {
//Запись в файл
}
7. Используйте оператор ромба для вывода типа.Оператор ромба (
<>
) позволяет опустить аргументы типа при создании экземпляра универсального класса, если тип можно вывести из контекста присваивания. Это уменьшает избыточность и делает код чище. Например:List<String> names = new ArrayList<>(); // Определение типа для ArrayList
8. Используйте пакет java.time для операций с датой и временем.
В Java 8 появился пакет java.time, который предоставляет более полный и интуитивно понятный API для работы с датой и временем. Он предлагает такие классы, как
LocalDate
, LocalTime
, LocalDateTime
и Duration, которые упрощают общие операции с датой и временем.9. Применяйте ссылки на методы.
Ссылки на методы позволяют обращаться к методу по его имени, не вызывая его. Они могут сделать ваш код более лаконичным и выразительным, особенно при работе с функциональными интерфейсами. Например:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println); // Ссылка на метод System.out.println
10. Используйте методы по умолчанию (default) в интерфейсах.
Начиная с Java 8, интерфейсы могут иметь методы по умолчанию, которые обеспечивают реализацию по умолчанию (default-реализацию). Методы по умолчанию позволяют добавлять в интерфейсы новые методы, не нарушая существующие реализации. Они могут быть удобны для добавления служебных методов к интерфейсам или обеспечения поведения по умолчанию.
#junior
📌 Читать дальше
@javatg
👍23❤8🔥2
Урок 1. Java Start | Java для начинающих | Java с нуля
Урок 2. Java переменные | Java типы данных | Java для автоматизаторов | Урок 2
Урок 3. Java комментарий | Java как вывести сообщения в консоль | Java конкатенация строк | Урок 3
Урок 4. Java арифметические операции | Java для автоматизаторов | строк | Урок 4
Урок 5. Java библиотеки классов | Java Scanner | строк | Урок 5
Урок 6. Java String | Класс String и его методы
Урок 7. Условный оператор if в Java | Оператор switch | Конструкция if-else |
📌 источник
#junior #java
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥7❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26👍10❤3🤔2