Практические советы 2: Перенос массивов и списков

Java задняя часть

Это 10-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

Практический трюк каждый день:Преобразовать массив в список

Этот экзаменационный вопрос относительно распространен и относительно прост, может быть, о нем и нечего сказать?

Далее в этой статье будет рассказано о нескольких его позах реализации, всегда есть тот, который вам нравится.

I. Массив в список

1. Array.asList

Этот вопрос слишком прост, просто используйте его напрямуюArray.asListРазве это не конец, как

@Test
public void ary2list() {
    String[] ary = new String[]{ "1", "a"};
    List<String> list = Arrays.asList((ary);
    System.out.println(list);
}

Массив в список, так просто!!!

Это действительно так просто? ? ?

Посмотрите на следующий фрагмент кода

public void ary2list() {
    String[] ary = new String[]{ "1", "a"};
    List<String> list = Arrays.asList((ary);
    System.out.println(list);

    list.add("c");
    System.out.println(list);
}

бросает исключение напрямуюjava.lang.UnsupportedOperationException

Заинтересованные партнеры могут ознакомиться с реализацией исходного кода черезArrays.asListСозданный список, хотя также называетсяArrayList, но его полный путьjava.util.Arrays.ArrayList, не поддерживаетсяadd, removeДождитесь операции (поэтому в следующий раз, когда интервьюер спросит о точке знания ArrayList, вы можете спросить, какой ArrayList вы имеете в виду, братан, как вы думаете, это будет принудительно)

1.1 Очки знаний

  • пройти черезArrays.asListСозданный список не позволяет добавлять или удалять элементы, однако значение элементов в списке можно обновлять

2. new ArrayList

Хотя приведенный выше метод преобразования массива в список является самым простым, он не обязательно подходит, особенно когда мы можем работать с преобразованным списком, он может быть погребен в яме (а такая яма очень неясна и трудна для понимания). уровень кода. Откройте для себя)

Чтобы уменьшить вероятность отравления кода, вы также можете использовать следующий метод.new ArrayList<>(Arrays.asList(ary))

String[] ary = new String[]{ "1", "a"};
List<String> out = new ArrayList<>(Arrays.asList(ary));
out.add("hello");
System.out.println(out);

Список, созданный вышеописанным способом, — это то, с чем мы знакомы.ArrayListохватывать

2.1 Предупреждение о грозе

Глядя на приведенную выше ситуацию с использованием, легко придумать общий громкий момент.Например, в нашем приложении есть глобально общий список конфигураций.Чжан Сан должен взять конфигурацию с нечетным идентификатором, а Ли Си берет конфигурацию с четным идентификатором. , и все они делают

list.removeIf(s -> s.id % 2 == 0);

Затем, запустив его один раз, я обнаружил, что глобальный список был пуст.Это типичный случай, когда изоляция ресурсов не выполняется должным образом.Для этого сценария либо ограничьте пользователя и измените глобальные ресурсы напрямую, либо пользователь перенесет их в изолированная резервная копия

Модификация запрещена:

  • Используйте неизменяемые контейнеры, как упоминалось ранее.java.util.Arrays.ArrayList ()
  • использоватьCollections.unmodifiableListСоздайте
List<String> unModifyList = Collections.unmodifiableList(out);

Копия списка

new ArrayList<>(Arrays.asList(ary));

(Выше приведена реализация глубокого копирования, подробности можно посмотреть в реализации исходного кода jdk)

3. Collections.addAll

Третий способ — использовать класс инструментов контейнера, предоставляемый jdk.Collectionsреализовать

@Test
public void ary2listV3() {
    String[] ary = new String[]{ "1", "a"};
    // 创建列表,并指定长度,避免可能产生的扩容
    List<String> out = new ArrayList<>(ary.length);
    // 实现数组添加到列表中
    Collections.addAll(out, ary);

    // 因为列表为我们定义的ArrayList,因此可以对它进行增删改
    out.add("hello");
    System.out.println(out);
}

В принципе, более рекомендуется реализовать именно так, а почему? Посмотрите на реализацию исходного кода

public static <T> boolean addAll(Collection<? super T> c, T... elements) {
    boolean result = false;
    for (T element : elements)
        result |= c.add(element);
    return result;
}

Реализация этого кода очень знакома?Если бы мы написали его сами, он был бы почти таким.Он прост, интуитивно понятен, эффективен и совершенен.

II. Список в массив

В отличие от нескольких способов преобразования массива в список, намного проще преобразовать список в массив и вызвать его напрямую.List.toArray

List<String> list = Arrays.asList("a", "b", "c");
// 返回的是Object[] 数组
Object[] cell = list.toArray();

// 如果需要指定数组类型,可以传一个指定各类型的空的数组
// 也可以传一个与目标列表长度相等的数组,这样会将列表中的元素拷贝到这个数组中
String[] strCell = list.toArray(new String[]{});

III. Резюме

Тема сегодняшнего сообщения в блоге - взаимопреобразование массивов и списков.Хотя тема проста, есть много способов их реализации.Необходимо понимать существенную разницу между ними.Если вы не будете осторожны, вы можете майнить ямы, и самое простое место проваливается в яму.Часто труднее всего заметить и вылезти

Основные точки знаний резюмируются следующим образом.

Массив для списка:

  • Arrays.asList(xxx): создает неизменяемый список и не может удалять и добавлять элементы
  • new ArrayList<>(Arrays.asList(xxx): Это эквивалентно созданию списка со списком, который является формой глубокой копии. Полученный список поддерживает добавление и удаление
  • Рекомендуемое написаниеCollections.addAll()

список в массив

  • list.toArray: Если вам нужно указать тип массива, передайте параметр, чтобы указать

IV. Другое

1. серый блог:liuyueyi.github.io/hexblog

Серый личный блог, записывающий все посты блога по учебе и работе, приглашаю всех в гости

2. Заявление

Это не так хорошо, как письмо.Вышеупомянутое содержание чисто из семьи.Из-за ограниченных личных способностей неизбежно есть упущения и ошибки.Если вы найдете ошибки или у вас есть лучшие предложения, вы можете критиковать и исправлять их.