2016-01-26 2 views
0

Я недавно научился клонированию на Java. Существует глубокое клонирование и мелкое клонирование. Я блуждал, что делает ArrayList, когда объекты добавляются к нему. Это клон?Добавляем объекты к клону ArrayList?

Я провел несколько тестов с объектом String.

String s = new String("hello"); 
ArrayList<String> list = new ArrayList<String>(); 
list.add(s); 
s = s.replace('h','y'); 
System.out.prinln(list.get(0)); 

Он напечатал «привет». Так что это клон. Затем я вспомнил из личного опыта, когда добавляю объекты, которые я написал в массив, он не клонирует. Когда я меняю одно в массиве, оригинальные изменения тоже.

Я искал google, не уверен, потому что у меня не было навыков поиска, я не нашел ответа, который я искал. Затем я искал StackOverFlow, снова ничего не искал.

Так что же такое сделка с ArrayList? Прошу прощения, если этот вопрос повторяется, я действительно искал.

Некоторые люди не поняли вопрос: Имеет ли ArrayList клон? (что является основным вопросом, на который я смотрю). Если не так, почему String действительно клонируется?

+3

его клон это не распространяется. В этом случае вы просто замечаете, что 'String' является неизменным. – SomeJavaGuy

+1

Поскольку String неизменен! – Shriram

+1

Непрерывность строки. Следующее - хорошее чтение по теме: http://stackoverflow.com/questions/1552301/immutability-of-strings-in-java –

ответ

0

Вы можете убедиться, что манипулирование содержимым списка не клонируется, проверяя его identityHashCode. Он останется прежним.

+0

Я могу узнать, если какой-либо объект клонирован с этим? Будет ли он отличаться для каждого объекта? – ossobuko

+1

Да, например, попробуйте: System.err.println (System.identityHashCode (s) + "vs." + System.identityHashCode (s.replace ('h', 'y'))); –

+1

Чтобы быть ясным, разница в идентификатореHashCode указывает, что объекты являются разными экземплярами, это охватывает сценарий клонирования, а также String.replace при создании новой строки –

1

Вы можете изменять объекты внутри массива, и изменения останутся, если объект изменен. Строка ismutable и вы не можете ее изменить, каждый раз, когда вы производите какую-либо функцию/действие над String, он возвращает новый объект String с результатом.

ArrayList не клонирует объекты, его просто массив объектов, и если они изменяемы, вы можете их получить и изменить.

Если вам нужна изменяемая строка, которую вы можете использовать объект StringBuilder:

StringBuilder string = new StringBuilder("Hi!"); 
string.append(" - concat new String"); 
System.out.println(string.toString()); 
Смежные вопросы