| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Копирование ArrayList |
| Автор: Reptor 1.7.2008, 16:33 | ||||
| Проблема вот в чём: есть какойто список private
Если одному листу присваивать такой же лист т о при изменении одного меняется и 2-ой лист так как копируется не содержимое а просто ссылка на объект - это если я правильно понял. Так а как сделать что б создавался абсолютно новый лист. Делаю так и всеровно не выходит. Меняю старый, меняется и новый и наоборот
Как это побороть? |
| Автор: LSD 1.7.2008, 16:37 |
| clone() (но объекты в новом листе будут те же самые) |
| Автор: Reptor 1.7.2008, 16:53 |
this.list = ( ArrayList<X>)list.clone(); не помогло. Всеровно если менять объекты одного листа то в 2-ом они тоже меняются, ну и наоборот |
| Автор: cube 1.7.2008, 17:18 | ||
тогда ты должен у каждого объекта Х в ArrayList'e использовать clone() |
| Автор: Reptor 1.7.2008, 17:23 |
| так что выходит надо итератором проходить по листу и делать клоне каждого объекта а потом this.list.add( Object.clone() ) ?? мне кажется что такое копирование больших листов повешает всё приложение |
| Автор: Orange 1.7.2008, 18:13 |
| а Collections.copy(list1, list2) не подойдёт? (ну или делай свою реализацию cloneable) |
| Автор: Reptor 1.7.2008, 18:16 |
| Orange, не знаю подойдёт или нет... не пробовал.. я так понимаю это с common-collections.. надо посмотреть как там реализовано.. |
| Автор: Orange 1.7.2008, 18:21 | ||
И да, у Эккеля было по поводу глубокого клонирования достаточно подробно описанно |
| Автор: Reptor 1.7.2008, 18:26 | ||
| у меня при таком подходе ошибка
Exception occurred during event dispatching: java.lang.IndexOutOfBoundsException: Source does not fit in dest |
| Автор: ivg 1.7.2008, 19:10 | ||
А покажите как вы это делаете? |
| Автор: Platon 1.7.2008, 22:23 |
| На сколько могу судить по исходному коду Collections.copy тоже не подходит, он копирует только ссылки. |
| Автор: powerOn 1.7.2008, 23:15 |
это точно. |
| Автор: Kangaroo 2.7.2008, 00:14 | ||
Наверное, чтобы максимально оптимизировать следующий за этой проверкой код. |
| Автор: COVD 2.7.2008, 01:52 | ||||
конечно. Или вы это вручную должны сделать (если это реально нужно и время не ждет), или найдете готовый библиотечный класс, где то же самое уже реализовано. Но никакого чуда там не будет.
Есть программистская заповедь: "Не плодите сущности". Из которой следует, что вам лучше поискать другое решение. |
| Автор: LSD 2.7.2008, 10:05 |
| Нет ни одного готового класса который мог бы осуществлять глубокое клонирование, потому что у Object метод clone() не public. Так что или писать такое дело самому (с учетом того, что храниться в List) или сделать клонирование через сериализацию (объекты естественно должны быть сериализуемы). |
| Автор: Reptor 2.7.2008, 10:54 | ||
| ехххх, да незадачка. мне удивительно почему не помагает
вроде ж как через new.. |
| Автор: LSD 2.7.2008, 11:17 |
| new создает новый ArrayList и копирует туда ссылки на объекты из исходной коллекции. |
| Автор: Reptor 2.7.2008, 11:48 |
| попробую конечно через итераторы но думаю что ничего хорошего из этого не выйдет. LSD, а как это через сериализацию? Добавлено @ 11:55 ого так это ж ещё надо будет создавать каждый объект что в листе заново.... ведь если их просто переписать всеровно ссылки та останутся на старые... не это не реально, это все переменные объекта надо будет достать и заново записать в новый объект, мало того что объектов не мало в листе так ещё и у объекта много всего... |
| Автор: Platon 2.7.2008, 13:02 |
| Reptor, ну, а что сделать? Ты такие условия ставишь. Или смирись, или ищи как обойтись только ссылками на объекты. |
| Автор: Reptor 2.7.2008, 13:11 |
| Platon, ну а как обойтись ссылками... не как не выйдет так как они то должны быть независимы а так меняеш один меняется 2-ой... |
| Автор: LSD 2.7.2008, 13:54 | ||
Да практически как гланды удалять через ж
только учти, что это штука не быстрая и глубокое клонирование будет работать быстрее. |
| Автор: Reptor 2.7.2008, 14:05 | ||
я не совсем понимаю что имеется в виду под глубоким копированием? почему глубоким? |
| Автор: dorogoyIV 2.7.2008, 14:41 | ||
имеется ввиду: глубокое клонирование - копирование всего массива с такими же объектами, только новыми поверхностное клонирование - копирование всего массива с теми же ссылками (сам массив новый) |
| Автор: Reptor 2.7.2008, 15:38 |
| dorogoyIV, всё я понял.. всем огромное спасибо... надо будет попробовать сделать 2 варианта. |
| Автор: Reptor 3.7.2008, 11:01 | ||||||
LSD, смотри я немножко поменял то что ты прислал и у меня что то не вышло
и вот класс экземпляры которого в листе
и вот вывод list = [aaa] copy1 = [aaa] copy2 = [aaa] Changing... list = [aaabbbbddd, zzz] copy1 = [aaabbbbddd] copy2 = [aaahello] list = [dd@1632c2d, dd@d70d7a, dd@b5f53a, dd@1f6f0bf, dd@137c60d] copy1 = [dd@1632c2d, dd@d70d7a, dd@b5f53a, dd@1f6f0bf, dd@137c60d] copy2 = null почему то на ArrayList<dd> copy2_2 = (ArrayList<dd>) zz.serialClone(listDD); не сработало copy2 = null ? Может что то с классом не так? а так всё хорошо работает а с собственным классом не хочет. Добавлено @ 11:08 о понял надо ж
|
| Автор: Reptor 15.7.2008, 17:26 |
| у меня ещё такой вопрос по поводу сеарилизацыи если у меня в классе есть внутрений класс то что б он тоже сеарилизовался надо у него тоже указывать implements Serializable. Или у его родителя достаточно?? Просто в зависимости от того указываю я или нет то приложение как то по разному себя ведёт. |
| Автор: Platon 16.7.2008, 12:06 |
| Все классы должны быть сериализуемыми. |
| Автор: Reptor 16.7.2008, 12:54 |
| Platon, да я смотрю что если во внутренем классе не ставить implements Serializable то основной совсем не клонируется |