Array vs ArrayList
Выбор между Array и ArrayList зависит от специфики задачи на Java, которую требуется решить.
📌Помните о следующих особенностях этих типов:
• Array имеет фиксированный размер и память для него выделяется в момент объявления, а размер ArrayLists может динамически изменяться.
• Массивы Java работают гораздо быстрее, а в ArrayList намного проще добавлять/удалять элементы.
• При работе с Array велика вероятность получить ошибку
• У ArrayList только одно измерение, а вот массивы Java могут быть многомерными.
Выбор между Array и ArrayList зависит от специфики задачи на Java, которую требуется решить.
📌Помните о следующих особенностях этих типов:
• Array имеет фиксированный размер и память для него выделяется в момент объявления, а размер ArrayLists может динамически изменяться.
• Массивы Java работают гораздо быстрее, а в ArrayList намного проще добавлять/удалять элементы.
• При работе с Array велика вероятность получить ошибку
ArrayIndexOutOfBoundsException.
• У ArrayList только одно измерение, а вот массивы Java могут быть многомерными.
import java.util.ArrayList;
public class arrayVsArrayList {
public static void main(String[] args) {
// объявление Array
int[] myArray = new int[6];
// обращение к несуществующему индексу
myArray[7]= 10; // ArrayIndexOutOfBoundsException
// объявление ArrayList
ArrayList<Integer> myArrayList = new ArrayList<>();
// простое добавление и удаление элементов
myArrayList.add(1);
myArrayList.add(2);
myArrayList.add(3);
myArrayList.add(4);
myArrayList.add(5);
myArrayList.remove(0);
// получение элементов ArrayList
for(int i = 0; i < myArrayList.size(); i++) {
System.out.println("Element: " + myArrayList.get(i));
}
// многомерный Array
int[][][] multiArray = new int [3][3][3];
}
}
👍16❤1👎1🔥1🤗1
Код:
import java.util.Iterator;
public class CustomClass implements Iterable<String> {
private String[] elements;
public CustomClass(String[] elements) {
this.elements = elements;
}
@Override
public Iterator<String> iterator() {
return new CustomIterator();
}
private class CustomIterator implements Iterator<String> {
private int index = 0;
@Override
public boolean hasNext() {
return index < elements.length;
}
@Override
public String next() {
if (this.hasNext()) {
return elements[index++];
} else {
throw new NoSuchElementException();
}
}
}
public static void main(String[] args) {
String[] arr = {"one", "two", "three"};
CustomClass customClass = new CustomClass(arr);
for (String element : customClass) {
System.out.println(element);
}
}
}
💁♂️ Этот код позволяет создать итератор для пользовательского класса
CustomClass. Итератор позволяет перебирать элементы массива elements и использовать их в цикле for-each.Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2🔥1🤝1
// Создание интерфейсов
interface Printable {
void print();
}
interface Showable {
void show();
}
// Реализация интерфейсов в классе
class MyClass implements Printable, Showable {
public void print() {
System.out.println("Printing...");
}
public void show() {
System.out.println("Showing...");
}
}
public class Main {
public static void main(String[] args) {
// Создание объекта класса MyClass
MyClass obj = new MyClass();
obj.print();
obj.show();
}
}
MyClass реализует два интерфейса Printable и Showable, и поэтому класс может использовать методы, определенные в обоих интерфейсах. Это позволяет создавать гибкие и модульные программы, используя механизм интерфейсов в Java.Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4👨💻2❤1
StringBuilder для эффективной конкатенации строк:public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {
sb.append("строка ").append(i).append("\n");
}
String result = sb.toString();
System.out.println(result);
}
}
StringBuilder для объединения 10 строк "строка i" в одну строку. Это более эффективно, чем использование оператора "+" или String.concat(), особенно при большом количестве операций конкатенации строк.StringBuilder предоставляет изменяемую последовательность символов и позволяет выполнять эффективные операции вставки, удаления и конкатенации строк.Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3❤1
💻 Как полезную фишку на Java можно рассмотреть использование лямбда-выражений для упрощения написания анонимных классов. Например, использование лямбда-выражения для выполнения операции над элементами коллекции:
🔝 Использование лямбда-выражений делает код более компактным и удобочитаемым, особенно при работе с коллекциями и функциональными интерфейсами.
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// Использование лямбда-выражения для вывода каждого элемента в консоль
numbers.forEach(n -> System.out.println(n));
// Использование лямбда-выражения для умножения каждого элемента на 2
numbers.replaceAll(n -> n * 2);
System.out.println(numbers); // Вывод: [2, 4, 6, 8, 10]
}
}
🔝 Использование лямбда-выражений делает код более компактным и удобочитаемым, особенно при работе с коллекциями и функциональными интерфейсами.
👍17🔥4❤2🥰2
ExecutorService - это интерфейс, который предоставляет удобный способ для управления параллельным выполнением задач. Он предоставляет пул потоков для выполнения задач и управляет их жизненным циклом:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
// Создание пула потоков
ExecutorService executor = Executors.newFixedThreadPool(5);
// Подача задач на выполнение
for (int i = 0; i < 10; i++) {
executor.execute(new Task(i));
}
// Остановка пула потоков после выполнения задач
executor.shutdown();
}
static class Task implements Runnable {
private int taskId;
public Task(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
System.out.println("Выполнение задачи " + taskId + " в потоке " +
Thread.currentThread().getName());
}
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥5❤3👨💻1
ерфейса Callable вместе с классом Future для выполнения асинхронных задач и получения их результата:
ExecutorService executor = null;
try {
executor = Executors.newFixedThreadPool(1);
Future<Integer> futureResult = executor.submit(() -> {
// Выполнение сложной вычислительной задачи
int result = 0;
for (int i = 0; i < 100; i++) {
result += i;
Thread.sleep(100);
}
return result;
});
// Другие действия, выполняемые параллельно
// Ожидание завершения асинхронной задачи и получение результата
Integer result = futureResult.get();
System.out.println("Результат: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
if (executor != null) executor.shutdown();
}
Callable, который возвращает результат типа Integer. Задача выполняет сложное вычисление с задержкой в 100 миллисекунд каждую итерацию.После создания задачи, она отправляется на выполнение в пул потоков. Далее, можно выполнять другие действия параллельно с ожиданием завершения задачи.
Метод
get() вызывается для ожидания завершения задачи и получения результата. Если задача еще не завершилась, вызов этого метода блокируется. Возможны исключения, такие как InterruptedException или ExecutionException, которые необходимо обработать.💁♂️ Затем поток пул завершается вызовом
shutdown().Please open Telegram to view this post
VIEW IN TELEGRAM
👍10👨💻3❤2🔥1💯1
import java.io.*;
public class DeepCopyExample {
public static void main(String[] args) {
Person person = new Person("John", 30);
Person deepCopy = deepCopy(person);
System.out.println("Original: " + person.getName() + ", " + person.getAge());
System.out.println("Deep copy: " + deepCopy.getName() + ", " + deepCopy.getAge());
}
public static <T extends Serializable> T deepCopy(T object) {
try {
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);
objectOutputStream.writeObject(object);
ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteOutputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(byteInputStream);
T copy = (T) objectInputStream.readObject();
return copy;
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
}
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
Person, который реализует интерфейс Serializable, чтобы объекты этого класса можно было сериализовать и десериализовать. Затем мы создаем метод deepCopy, который принимает объект и возвращает его глубокую копию.Мы используем
ByteArrayOutputStream и ObjectOutputStream, чтобы записать объект в байтовый массив, а затем ByteArrayInputStream и ObjectInputStream, чтобы прочитать копию объекта из массива.В методе
main мы создаем объект Person, затем создаем его глубокую копию с помощью метода deepCopy и выводим на экран значения оригинального и скопированного объекта.Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3🔥2👏1💯1👨💻1
Анонимный класс - это класс без имени, который объявляется и создается внутри другого класса или метода. Он удобен, когда требуется определить класс, который будет использоваться только один раз, и нет необходимости создавать отдельный класс.
public class Main {
interface Greeting {
void sayHello();
}
public static void main(String[] args) {
Greeting greeting = new Greeting() { // объявление и создание анонимного класса
@Override
public void sayHello() {
System.out.println("Привет, мир!");
}
};
greeting.sayHello(); // вызов метода sayHello у анонимного класса
}
} Greeting, содержащий метод sayHello(). Затем, в методе main(), мы создали анонимный класс, реализующий интерфейс Greeting и переопределивший метод sayHello(). Затем мы вызываем метод sayHello() у объекта анонимного класса.Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4🔥3👏1
import java.util.ArrayList;
import java.util.List;
public class WrapperExample {
public static void main(String[] args) {
// Создание списка оберток для целых чисел
List<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
// Использование методов класса-оболочки
int sum = 0;
for (int i = 0; i < numbers.size(); i++) {
sum += numbers.get(i);
}
System.out.println("Сумма чисел: " + sum);
}
}
numbers для целых чисел типа Integer. Затем мы добавляем в список несколько элементов и используем метод get() для получения элементов из списка. Значения оберток автоматически анбоксируются в примитивные типы данных int, и мы можем выполнять с ними операции, например, суммирование.Использование классов-оболочек позволяет работать с коллекциями элементарных типов данных и обеспечивает удобство и безопасность при работе с ними.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤2👍2👏1
Try-With-Resources - это новая конструкция языка, введенная в Java 7, которая облегчает работу с ресурсами такими как файлы или сокеты и сокращает количество кода, необходимого для обработки исключений.Вот пример использования
Try-With-Resources для чтения содержимого файла:try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}BufferedReader внутри блока try с помощью конструктора FileReader. Затем мы можем безопасно читать файл внутри этого блока без необходимости явно закрывать ресурс.После завершения блока
try автоматически вызывается метод close() объекта reader, который закрывает файл и освобождает связанные с ним ресурсы. Если возникнет исключение в блоке try, его можно будет обработать в блоке catch после завершения работы с ресурсом.Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3👏2🥰1
Этот класс предоставляет удобный способ работы с асинхронными задачами, такими как параллельные вычисления, обработка событий и т. д.
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) {
// Создание CompletableFuture объекта
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
// Добавление операций после выполнения асинхронной задачи
CompletableFuture<String> result = future.thenApplyAsync(str -> str + " World")
.thenApply(str -> str + "!");
try {
// Ожидание результата
String message = result.get();
System.out.println(message);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
CompletableFuture объект future, который возвращает строку "Hello". Затем мы добавляем операции thenApplyAsync и thenApply, которые обрабатывают результат асинхронной задачи и добавляют к нему слова "World" и "!", соответственно.get(). Если выполнение асинхронной задачи еще не завершено, данный метод будет блокироваться до получения результата.💁♂️ Таким образом, использование
CompletableFuture позволяет нам эффективно работать с асинхронными задачами и упрощает обработку результатов. Это может быть особенно полезно в многопоточном или параллельном программировании.Please open Telegram to view this post
VIEW IN TELEGRAM
👍9👨💻3❤1
import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
// Фильтрация элементов, начинающихся с буквы "a" и преобразование в верхний регистр
fruits.stream()
.filter(fruit -> fruit.startsWith("a"))
.map(String::toUpperCase)
.forEach(System.out::println);
// Выведет "APPLE"
}
}
📝 В этом примере мы использовали Stream API для фильтрации элементов коллекции, начинающихся с буквы "a", и преобразования их в верхний регистр, а затем вывели результат в консоль. Stream API предоставляет мощный и удобный способ работы с коллекциями данных в Java, позволяя выполнять различные операции, такие как фильтрация, отображение, сортировка, агрегация и многое другое.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥4👏2❤1
import java.util.UUID;
public class UniqueIdGenerator {
public static void main(String[] args) {
// Генерация случайного уникального идентификатора
UUID uuid = UUID.randomUUID();
System.out.println("Уникальный идентификатор: " + uuid);
// Преобразование уникального идентификатора в строку без тире
String uuidString = uuid.toString().replace("-", "");
System.out.println("Уникальный идентификатор без тире: " + uuidString);
}
Этот код генерирует случайный уникальный идентификатор (UUID) и выводит его значение в формате с и без использования тире. Уникальный идентификатор предоставляет уникальное значение, которое может быть использовано для идентификации объектов, сессий, операций и т. д.
Это полезно, например, при создании уникального идентификатора для записи в базу данных или для генерации уникального имени файла.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤1🥰1👏1
Код для расчета разницы во времени:
import java.time.Duration;
import java.time.LocalDateTime;
public class TimeDifferenceCalculator {
public static void main(String[] args) {
LocalDateTime startTime = LocalDateTime.of(2022, 1, 1, 10, 0, 0);
LocalDateTime endTime = LocalDateTime.of(2022, 1, 1, 12, 30, 0);
Duration duration = Duration.between(startTime, endTime);
long hours = duration.toHours();
long minutes = duration.toMinutes() % 60;
long seconds = duration.getSeconds() % 60;
System.out.println("Time difference: " + hours + " hours, " + minutes + " minutes, " + seconds + " seconds.");
}
}
В этом примере мы создаем два объекта
LocalDateTime - startTime и endTime, представляющие начальное и конечное время соответственно. Затем мы используем метод Duration.between() для расчета разницы во времени между startTime и endTime.Далее, мы используем методы
toHours(), toMinutes() и getSeconds() для получения часов, минут и секунд в полученной разнице времени. Наконец, мы выводим результаты на экран.Эта фишка полезна для рассчета временных интервалов, например, для измерения времени выполнения определенной операции или анализа времени работы программы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝6👍5❤1🔥1🏆1
Для этого необходимо импортировать соответствующие пакеты:
import java.util.Timer;
import java.util.TimerTask;
Затем можно создать класс, который наследует
TimerTask и реализует метод run() для определения задачи:class ScheduledTask extends TimerTask {
public void run() {
// выполняем задачу
System.out.println("Задача выполняется!");
}
}Далее, в основном методе программы, можно создать экземпляр класса
Timer и использовать его для запуска задачи с определенной периодичностью:public class Main {
public static void main(String[] args) {
Timer timer = new Timer();
// создаем экземпляр задачи
ScheduledTask task = new ScheduledTask();
// задержка перед выполнением задачи (в миллисекундах)
long delay = 1000;
// интервал между выполнениями задачи (в миллисекундах)
long period = 2000;
// запускаем задачу по расписанию
timer.schedule(task, delay, period);
}
}В данном примере задача будет выполняться сначала через 1 секунду после запуска программы, а затем повторяться каждые 2 секунды. В приведенном коде основной поток программы просто ждет выполнения задачи и не блокируется.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍7❤1🤡1
Когда переменная объявлена с модификатором
volatile, значит ее значение всегда будет считываться напрямую из памяти, а не из кэша потока, и любые изменения этой переменной будут немедленно видны всем другим потокам. Таким образом, используя модификатор volatile, можно гарантировать синхронизацию переменных между потоками без необходимости явной синхронизации с помощью блокировок или синхронизированных методов.Вот пример кода:
public class VolatileExample {
private volatile boolean flag = false;
public void setFlag(boolean value) {
flag = value;
}
public boolean getFlag() {
return flag;
}
}Когда переменная flag объявлена с модификатором
volatile, можно гарантировать, что любые изменения значения flag будут немедленно видны всем потокам, которые обращаются к методу getFlag(). Таким образом, нет необходимости использовать синхронизацию для чтения и записи значения flag в разных потоках.Использование модификатора
volatile может помочь предотвратить ошибки синхронизации и упростить код в многопоточных приложениях. Однако необходимо быть осторожным при использовании этого модификатора, так как он не гарантирует атомарность операций и не является заменой для других механизмов синхронизации, таких как блокировки или атомарные классы.Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2❤1👏1