Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Передача параметра по ссылке и по значению |
Автор: ChessMaster 13.8.2007, 10:13 | ||
Запутался с тем, как передать значение по сслыке, а как по значению.
Дело в том, что monkey != cageMonkey.get(0); То есть вклетки сидит мартышка с другой температурой. |
Автор: LSD 13.8.2007, 12:34 |
Объекты всегда передаются по ссылке, а примитивные типы по значению. |
Автор: agR 13.8.2007, 12:58 | ||
LSD, и
Как по мне, то те же грабли, тока в профиль. Читал книгу, так там акцент как раз и делался, что в java передается по значению... и утверждение "по ссылке" - ошибочно. Кому верить? ![]() |
Автор: LSD 13.8.2007, 13:28 |
Для объектов передается копия ссылки на этот объект. И мы можем в теле метода изменить переданную копию ссылки, присвоив ей другой объект. |
Автор: ChessMaster 13.8.2007, 14:48 | ||
LSD, а можно пример того как присаивать ссылку другому объекту, чтобы знать как передать по значению. Спасибо ![]() |
Автор: fixxer 13.8.2007, 15:45 |
Боюсь, LSD ввел в небольшое заблуждение. Изменение (переприсваивание) ссылки возымеет действие только в пределах метода. Ключевая фраза "передается копия ссылки на этот объект". |
Автор: LSD 13.8.2007, 16:05 | ||
|
Автор: fixxer 13.8.2007, 19:00 | ||
Да, безусловно, только пример не отражает фразу
|
Автор: nornad 14.8.2007, 05:27 | ||
А как же это:
![]() |
Автор: fixxer 14.8.2007, 10:15 |
Да, сорри. Не заметил. Ну тогда будут выведены разные значения внутри и вне метода. Наверно LSD это и хотел продемонстрировать. ![]() |
Автор: chief39 14.8.2007, 13:05 | ||
Нифига се профиль!!! ![]()
Если надо сугубо по значению - тогда clone() объекта и передача клона в качестве параметра. |
Автор: LSD 15.8.2007, 15:02 | ||||
Ага ![]() Передать по значению нельзя, но можно это дело эмулировать клоном для изменяемых объектов, а для неизменяемых просто передавать как есть. |
Автор: Fedrus 24.1.2008, 11:15 | ||
Как раз сегодня получил ошибку забыв про "передачу объектов по ссылке". Я передал как new Object(myObject). В поисках более правильного решения погуглил и нашел интересную статью http://www.javable.com/columns/robinson/letters/01/ в ней как раз доказывается что в java
Потом залез на форум и нашел эту тему и окончательно запутался(LSD привык верить) и сегодня сильно не выспался чтоб полностью понять статью может посмотрите и всетаки дадите определенный ответ. |
Автор: LSD 24.1.2008, 12:56 |
По сути тут утверждается одно и то же. Для примитивных типов в стеке создаётся копия этой переменной. Для объекта - создаётся копия ссылки на этот объект. Как это назвать, передачей копии ссылки, или передачей по значению, при условии что для объектных переменных значением является ссылка, вопрос вторичный. Просто классическая передача объекта по значению, подразумевает что создаётся копия этого объекта и именно она и передаётся. Поэтому я предпочитаю говорить, что передаётся копия ссылки. |
Автор: Мурлыкатам_ 10.11.2008, 18:20 |
Простите, что я продолжаю тему, я честно гуглил и честно смотрел статьи на форуме, но так и не понял как передать по ссылке к примеру массив целых чисел. Задача: отсортировать массив случайных чисел от 0 до 5000, записанных в файл размером 1 мб, т.е. в файле 1 мб этих чисел. Решение (сразу сделал под .net): решаю задачу через алгоритм быстрой сортировки (QuickSort: http://ru.wikipedia.org/wiki/Quicksort#Java.2FC.23), получается быстро, но не достаточно. Передаю массив через ref, и о чудо, все сортируется меньше чем за секунду... Проблема: задача была поставлена для java, реализую все на java и сталкиваюсь с невозможностью передать массив по ссылке, в результате сортировка 100кб массива - 53 секунды. Очевидно проблема в постоянной передачи массива по значению. Верно ли я понял, что для решения этой задачи мне нужно просто массив завернуть в класс, сделать экземпляр этого класса и вместо массива передавать экземпляр класса для увеличения производительности? Если нет, то подскажите плз что-нить, потому что уже - ![]() |
Автор: powerOn 10.11.2008, 19:44 |
вообще-то, массивы в java всегда передаются по ссылке... ![]() |
Автор: Мурлыкатам_ 10.11.2008, 19:54 |
Хммм... завтра выкину код. ![]() ![]() |
Автор: Дрон 10.11.2008, 21:10 | ||
Ровно как и в .NET Поэтому сказанное ниже очень странно:
Так что ждём код ![]() |
Автор: SoulKeeper 11.11.2008, 10:50 |
По алгоритму с Википедии вываливается StackOverflowError на 100кб массиве. P.S. 100кб массив (1024 * 1024 / 4) элементов? |
Автор: LSD 11.11.2008, 13:14 | ||||
Как тебе это удалось?
|
Автор: Мурлыкатам_ 11.11.2008, 13:39 | ||
Точно ![]() Все таки хромала реализация ![]() Я еще чуток поковыряюсь сам, а если не получиться, то напишу, стыдно немного кривоватый код показывать ![]() Хотя словом, "немного" я наверное себе зальстил ![]() Реализация уважаемого LSD, работает просто выше всяких похвал. Спасибо! |
Автор: SoulKeeper 11.11.2008, 13:49 | ||||
Хмм... таки не вываливается. Может что-то умудрился поломать пока копипейстил ![]() EDIT:
тут если 8 поменять на 32, то вывалиться ;) |
Автор: LSD 11.11.2008, 14:37 |
Дык вываливается с OutOfMemoryError, а не StackOverflowError. Что вполне законно, т.к. массив занимает 128 мегабайт памяти, а по умолчанию JVM берет себе 32 мегабайта. Надо просто запустить с ключём -Xmx140m и все заработает. OutOfMemoryError это простая нехватка памяти, решается ключами запуска. А вот StackOverflowError уже более серьезная проблема, как правило это бесконечная или слишком "глубокая" рекурсия. |
Автор: SoulKeeper 11.11.2008, 16:33 | ||||
Отличить нехватку памяти от переполнения стэка я еше могу. |
Автор: LSD 11.11.2008, 17:25 | ||
Вот в чем проблема. Надо доработать метод partition(). |
Автор: SoulKeeper 11.11.2008, 17:29 |
Честно говоря я вообще не понимаю зачем использовать данный велосипед. Arrays.sort() работает и быстрее и вылеты оверфловы за ним не замечались ;) |
Автор: LSD 11.11.2008, 17:39 |
Ну я считаю, что знать базовые алгоритмы полезно и нужно. Тем более что Arrays.sort() сам использует quicksort, хотя там конечно реализация более грамотная с защитой от подобных проблем. |
Автор: SoulKeeper 11.11.2008, 17:47 |
Что-то не верится что на этом форуме наберется десяток программистов которые смогут написать по памяти хоть пару из http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8 Одно дело знать что они существуют, другое - их писать. |
Автор: LSD 11.11.2008, 17:59 |
Пузырек и сортировку слиянием думаю напишут многие ![]() А вообще это все оффтопик. |
Автор: Мурлыкатам_ 11.11.2008, 18:06 | ||
Я думаю каждый программист использует сортировку в своей жизни ![]() Поэтому зная алгоритм и его реализацию, лучше один раз написать сортировку самому и понять, как она работает, чем использовать кота в мешке =))) или каждый раз искать алгоритм в инете.
Мне тоже не вериться, потому что их число будет значительно больше ![]() Да и в любом случае понимание алгоритма лучше, чем бездумное использование готового! |
Автор: kashka 17.4.2009, 13:02 | ||
Теперь мне по крайней мере понятно почему у меня не работает след. (транспонирование двухмерногоа массива)
Так как передаётся не сама ссылка а её копия, хм...Так это что же получается нет никакой другой возможности кроме как return добавлять? |
Автор: kashka 17.4.2009, 14:30 | ||
Что то я торможу, второй массив мне и не нужен вовсе:
Но работает это конечно только для nxn массивов. |
Автор: goodday1941 17.4.2009, 17:55 | ||||||
как насчет варианта с враппером?
.. ну и метод транспонирования будет получать на вход объект класса ArrayWrapper
|
Автор: math64 17.4.2009, 20:52 | ||
Если лень создавать враппер, сойдёт и массив из одного элемента:
|