Ссылка на элемент ArrayList - PullRequest
3 голосов
/ 26 декабря 2011

Я пытаюсь получить ссылку на элемент ArrayList, но у меня ничего не получается.

ArrayList<String> test = new ArrayList<String>();

test.add("zero");
test.add("one");
test.add("two");

 String s1 = test.get(1);
 String s2 = test.get(1);

 System.out.println(test.get(1) +" " + s1 + " " + s2);

 s1 += " modificated";

 System.out.println(test.get(1) +" " + s1 + " " + s2);

Есть предложения?

Ответы [ 2 ]

5 голосов
/ 26 декабря 2011

Вы не можете сделать это в Java.Все, что вы делаете - это извлекаете значение из ArrayList.Это значение является ссылкой, но это ссылка в терминологии Java, которая не совсем такая же, как в C ++.

Это ссылочное значение копируется в s1, после чего оно полностью не зависит от значения вArrayList.Когда вы изменяете значение s1 для ссылки на новую строку в этой строке:

s1 += "modificated";

, которая вообще не меняет значение в ArrayList.

Сейчасесли бы вы использовали изменяемый тип, такой как StringBuilder, вы могли бы использовать:

StringBuilder builder = list.get(0);
builder.append("more text");
System.out.println(list.get(0)); // Would include "more text"

Здесь вы не измените значение в ArrayList - которое все еще простоссылка - но вы изменяете данные внутри объекта, на который ссылается значение.

2 голосов
/ 26 декабря 2011

Что вы, вероятно, ищете, это изменяемая строка, которая не поставляется с Java AFAIK, вам нужно будет создать класс-оболочку

class MutableString {
  private String value;
  public void setValue(String val){value = val;}
  public String getValue(){return value;}
  public String append(String val){value+=val;//Or use a StringBuilder}
}

Затем вы можете получить ArrayList из MutableString (вместо String) и хранить ссылки на определенные элементы списка (и иметь возможность их изменять).Конечно, вы не сможете использовать (или переопределить) операторы по умолчанию, потому что они работают только со String (поэтому нет + =).

Возможно, вы захотите просто использовать StringBuilder вместо String, но этоне то, для чего это сделано.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...