JavaRush /Java блог /Random /Кофе-брейк #219. Как инициализировать ArrayList в Java. К...

Кофе-брейк #219. Как инициализировать ArrayList в Java. Как создать неизменяемый класс в Java

Статья из группы Random

Как инициализировать ArrayList в Java

Источник: FreeCodeCamp Из этой статьи вы узнаете, как объявить и инициализировать ArrayList в Java. Также вы ознакомитесь с различными встроенными методами, которые можно использовать для добавления, доступа, изменения и удаления элементов в ArrayList. Кофе-брейк #219. Как инициализировать ArrayList в Java. Как создать неизменяемый класс в Java - 1ArrayList — это реализация изменяемого массива интерфейса List, которая используется для хранения и управления коллекцией похожих переменных. ArrayList напоминает массив, но обеспечивает большую гибкость. Объект ArrayList более динамичен и дает вам широкий контроль над элементами в коллекции.

Как объявить ArrayList со значениями в Java

Объявить ArrayList в Java можно следующим способом:

import java.util.ArrayList;

public class ArrayListTut {
    public static void main(String[] args) {

        ArrayList<String> people = new ArrayList<>(); 
        
    }
}
Перед тем, как использовать ArrayList, вы должны сначала импортировать его из одноименного класса: import java.util.ArrayList;. После этого вы можете создать новый объект ArrayList. В приведенном выше коде мы создали такой объект под именем people. Обратите внимание, что тип данных ArrayList указывается в угловых скобках: ArrayList<String>. Несмотря на то, что мы создали объект ArrayList, в нем пока нет элементов. Далее вы узнаете, как добавлять к нему элементы. Учтите, что вы можете создать ArrayList со значениями/элементами в точке объявления, используя метод add в блоке инициализатора:

import java.util.ArrayList;

public class ArrayListTut {
    public static void main(String[] args) {

        ArrayList<String> people = new ArrayList<>() {{
            add("John");
            add("Jane");
            add("Doe");
        }}; 
        
        System.out.println(people);
        // [John, Jane, Doe]
    }
}

Как добавить элементы в ArrayList

Для добавления элементов в ArrayList необходимо использовать метод add().

import java.util.ArrayList;

public class ArrayListTut {
    public static void main(String[] args) {

        ArrayList<String> people = new ArrayList<>(); 
        
        people.add("John");
        people.add("Jane");
        people.add("Doe");
        
        System.out.println(people);
        // [John, Jane, Doe]
        
    }
}
В данном коде мы объявили ArrayList под названием people без каких-либо элементов. С помощью точки и метода add() мы добавили в people элементы: people.add("John").

Как получить доступ к элементам в ArrayList

Получить доступ к элементам в Java ArrayList можно, используя индекс элемента. Он будет передан в качестве параметра метода get(), примерно вот так:

import java.util.ArrayList;

public class ArrayListTut {
    public static void main(String[] args) {

        ArrayList<String> people = new ArrayList<>(); 
        
        people.add("John");
        people.add("Jane");
        people.add("Doe");
        
        System.out.println(people.get(0));
        // John
        
    }
}
В этом коде people.get(0) получает первый элемент — "John". Обратите внимание, что первый элемент имеет индекс 0, второй — индекс 1 и так далее.

Как изменить элементы в ArrayList

Вы можете изменить или модифицировать значение элемента в ArrayList с помощью метода set(). Метод set() принимает два параметра — индекс изменяемого элемента и новое значение, которое будет присвоено этому индексу. Перед вами пример:

import java.util.ArrayList;

public class ArrayListTut {
    public static void main(String[] args) {

        ArrayList<String> people = new ArrayList<>(); 
        
        people.add("John");
        people.add("Jane");
        people.add("Doe");
        
        people.set(1, "Jade");
        
        System.out.println(people);
        // [John, Jade, Doe]
        
    }
}
Здесь мы изменили второй элемент с "Jane" на "Jade", используя его индекс: people.set(1, "Jade").

Как удалить элементы в ArrayList

Вы можете удалить элемент, используя метод remove(). Этот метод принимает в качестве параметра индекс удаляемого элемента. Давайте взглянем на пример кода:

import java.util.ArrayList;

public class ArrayListTut {
    public static void main(String[] args) {

        ArrayList<String> people = new ArrayList<>(); 
        
        people.add("John");
        people.add("Jane");
        people.add("Doe");
        
        people.remove(2);
        
        System.out.println(people);
        // [John, Jane]
        
    }
}
Используя метод remove(), мы удалили третий элемент в коллекции с помощью индекса элемента: people.remove(2);.

Заключение

В этой статье мы говорили о структуре данных Java ArrayList. Она используется для хранения набора переменных и дает разработчику больше контроля над элементами в коллекции благодаря наличию динамического размера, который не фиксируется при объявлении, как массивы Java. Мы также узнали, как объявить и инициализировать объект ArrayList со значениями, и какие существуют методы добавления, доступа, изменения и удаления элементов в ArrayList.

Как создать неизменяемый класс в Java

Источник: Medium Благодаря этому руководству вы узнаете, что такое неизменяемость (неизменность) в Java и как создать неизменяемый класс в Java. Неизменяемость (Immutability) в Java — это состояние, в котором значение объектов нельзя изменить после их инициализации. В Java примитивные классы float, int, long, double, все устаревшие классы, классы-оболочки, классы String и другие являются неизменяемыми.
  • Неизменяемый класс хорошо применять для кэширования, поскольку вам не нужно беспокоиться об изменении значения.
  • Неизменяемый класс по своей сути потокобезопасен, поэтому вам не нужно беспокоиться о безопасности потоков в многопоточных средах.
Пример неизменяемости строк:

 String testImmutability = "String Not Immutable";
    testImmutability.concat("---");
    System.out.println(testImmutability);

// Это будет успешно объединено, так как будет создан новый объект String

    String concat = testImmutability.concat("---"); 
    System.out.println(concat);

// Вывод 

String Not Immutable
String Not Immutable---

Этапы создания собственного неизменяемого класса:
  1. Объявите класс как final, чтобы его нельзя было расширить.
  2. Сделайте все поля private, чтобы прямой доступ был запрещен.
  3. Не предоставляйте методы setter для переменных.
  4. Сделайте все изменяемые поля final, чтобы значение поля можно было назначить только один раз.
  5. Инициализируйте все поля с помощью метода конструктора, выполняющего глубокое копирование.
  6. Выполните клонирование объектов в методах getter, чтобы возвращать копию, а не реальную ссылку на объект.

final class ImmutableClassExample {
  private final Map<String, String> dataMap;
  private final String name;
  private final String id;

  // Делаем глубокую копию в конструкторе
  public ImmutableClassExample(String name, String id, Map<String, String> dataMap) {
    this.name = name;
    this.id = id;
    Map<String, String> tempMap = new HashMap<>();

    for (Map.Entry<String, String> entry : dataMap.entrySet()) {
      tempMap.put(entry.getKey(), entry.getValue());
    }

    this.dataMap = tempMap;
  }
// Делаем глубокую копию в геттере
  public Map<String, String> getDataMap() {
    Map<String, String> tempMap = new HashMap<>();
    for (Map.Entry<String, String> entry : dataMap.entrySet()) {
      tempMap.put(entry.getKey(), entry.getValue());
    }
    return tempMap;
  }

  public String getName() {
    return name;
  }

  public String getId() {
    return id;
  }

}

public class Test {
  public static void main(String args[]) {
    Map<String, String> map = new HashMap<>();
    map.put("1", "One");
    map.put("2", "Two");
    ImmutableClassExample s = new ImmutableClassExample("ABC", "101", map);
    System.out.println(s.getName());
    System.out.println(s.getId());
    System.out.println(s.getDataMap());

    map.put("3", "third");
    // Не изменится из-за глубокого копирования в конструкторе
    System.out.println(s.getDataMap());
    s.getDataMap().put("4", "fourth");
   // Раскомментирование следующего кода вызовет ошибку, так как мы пытаемся получить доступ к члену private
  //  s.id = "4";
  }
}

// Раскомментирование следующего кода вызовет ошибку, так как мы пытаемся наследовать класс final);   }   } */


/*
class CheckInheritance extends  ImmutableClassExample{

  public CheckInheritance(String name, String id, Map<String, String> dataMap) {
    super(name, id, dataMap);
  }
  }
 */
Вывод:
ABC 101 {1=One, 2=Two} {1=One, 2=Two}
Помните, что в коде не должно быть методов setter, чтобы не было возможности изменить данные.

Интересные факты

Метод создания неизменяемого класса в Java широко используется в версиях до Java 14. Проблема с приведенным выше решением заключается в том, что оно создает много шаблонного кода и допускает ошибки. В Java 14 появились записи (Records), которые можно использовать для создания неизменяемых объектов “только для чтения”. Записи представляют собой неизменяемую структуру данных, поэтому они более предпочтительны и должны использоваться вместо создания неизменяемых классов. Одним из важных аспектов записей является то, что поля final не могут быть перезаписаны с помощью отражения (reflection). Вот как выглядит приведенный ранее пример с использованием записей:

record ImmutableClassExample(String name, String id, Map<String, String> dataMap) {
}
Надеюсь, эта публикация вам поможет в вашей работе! Удачного кодирования!
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ