2011-12-26 4 views
2

Я пытаюсь получить ссылку на элемент ArrayList, но я терпит неудачу.Ссылка на элемент массива 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); 

Любые предложения?

+0

ссылка на Java как указатель на C. Если вы измените значение ссылки, вы просто укажете на другое место. –

ответ

5

Вы не можете сделать это на 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 - который до сих пор просто ссылка - но вы 'изменение данных в объекте, на которое ссылается значение.

+0

Спасибо! Я понимаю! –

2

То, что вы, вероятно, ищет является изменяемым String, который не приходит с 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 (поэтому no + =).

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

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

+0

Вы правы. Решение что-то вроде этого :) –

+0

Спасибо! пожалуйста, проголосуйте или отметьте его как правильный ответ :) – Slash