#java #string #list
#java #строка #Список
Вопрос:
Я знаю, что Java имеет идиоматическое поведение в отношении манипулирования строками. Поскольку строки неизменяемы, мы не можем изменить содержимое. Поэтому мы не можем написать:
String s="test;"
s.toUpperCase();
Нам нужно присвоить результат s.toUpperCase() новой переменной, например:
String s1="test";
String s2=s1.toUpperCase;
s1.toUpperCase
это не строка s1
, которая была изменена на верхний регистр. Это новая строка со своим собственным местоположением в памяти.
Итак s1
, и s2
ссылаются на две заполненные разные ячейки памяти с двумя копиями литературы «test» и «TEST».
Но если мы не хотим использовать новую переменную для назначения новой строки, мы можем сделать это:
String s="test";
s=s.toUpperCase();
Вопрос:
Можем ли мы сделать то же самое со списком? Переменная s представляет ячейку памяти, которая имеет значение «test». Итак, в s=s.toUpperCase();
мы s
указываем на новый адрес созданной строки s.toUpperCase()
. Если в List<String> list
list.get(0)
точке (like s
) указано местоположение строки, почему мы не можем сделать то же s
самое, что и like: list.get(0)=list.get(0).toUpperCase()
или любым другим способом, например, как работают массивы:
String[] array={"test1","test2"};
array[0]=array[0].toUpperCase();
Комментарии:
1.
list.get(0)
возвращает значение, поэтому вы ничего не можете ему присвоить. Конечно, вы можете использоватьlist.set(0, list.get(0).toUpperCase())
etc.2. Из-за инкапсуляции. list.get(idx) был разработан для возврата значения с определенным индексом. Вы не можете заставить его делать то, что вы хотите.
Ответ №1:
list.get(0)=list.get(0).toUpperCase()
запрещено грамматикой и семантикой Java.
Грубо говоря (подробности более сложны, см. 15.26.1. Простой оператор присваивания = для получения более подробной информации), левая часть присваивания должна быть переменной (или полем). Но list.get(0)
это не так, это значение, поэтому вам нужно использовать какой-то метод, который позволит вам изменить значение соответствующего элемента списка:
list.set(0, list.get(0).toUpperCase())
Комментарии:
1. Я понимаю… таким образом, нет способа работать со строковым списком, как строка массива: String[] array={«test1″,»test2»}; array[0]=array[0].Прописной ();
2. и что такое «значение»? Возвращаемая вещь не является строкой? Строка — это объект, а не абстрактная вещь, такая как «значение».
3. 3 — это значение, как вы думаете, его можно изменить? Сделайте разницу между значением и полем, в котором оно хранится…
4. 3 — это удобный вариант обмана, потому что он примитивный, а не объект.