Это 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. Заявление
Это не так хорошо, как письмо.Вышеупомянутое содержание чисто из семьи.Из-за ограниченных личных способностей неизбежно есть упущения и ошибки.Если вы найдете ошибки или у вас есть лучшие предложения, вы можете критиковать и исправлять их.
- Адрес вейбо:Блог Маленького Серого
- QQ: серо-серый / 3302797840
- Публичный аккаунт WeChat:серый блог