powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Обмен объектов (метод swap)
31 сообщений из 31, показаны все 2 страниц
Обмен объектов (метод swap)
    #37626224
amigaboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Захотелось потренироваться, попереписывать стандартные алгортимы в Java. Сразу же столкнулся с проблемой:

После отработки метода
Код: java
1.
2.
3.
4.
5.
public static void Swap(String s1, String s2) {
    String temp = s1;
    s1 = s2;
    s2 = temp;
}

входные параметры не меняются на своих местах. На англоязычных форумах пишут, что это из-за того, что объекты в Java передаются по ссылке.

1. Ссылка, как я понимаю, это аналог указателя в Си. Почему в данном случае не происходит обмен адресов между указателями?
2. Насколько безопасен такой код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private void swap(String a, String b) {
   try {
     Field value = String.class.get("value");
     value.setAccessible(true);    // this should be forbidden!!

     char[] temp = value.get(a);
     value.set(a, value.get(b));
     value.set(b, temp);           // Aaargh, please forgive me
   } catch(Exception e) {
     e.printStackTrace(e);
   }
 }
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626248
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626250
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amigaboy1. Ссылка, как я понимаю, это аналог указателя в Си.
P.S. И, кстати... Указатель - это указатель. А ссылка - это ссылка. Возьмите справочник по C/C++ и найдите отличия. Так... Чисто для общей прокачки... И передача параметров по адресу != передаче параметров по ссылке.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626337
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.Isbarov amigaboy , читайте до полного просветления .
Столько воды.. А даже не сказал, что параметры метода (фактически копии ссылок) хранятся в стеке.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626366
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amigaboyЗахотелось потренироваться, попереписывать стандартные алгортимы в Java. Сразу же столкнулся с проблемой:

После отработки метода
Код: java
1.
2.
3.
4.
5.
public static void Swap(String s1, String s2) {
    String temp = s1;
    s1 = s2;
    s2 = temp;
}


входные параметры не меняются на своих местах. На англоязычных форумах пишут, что это из-за того, что объекты в Java передаются по ссылке.

1. Ссылка, как я понимаю, это аналог указателя в Си. Почему в данном случае не происходит обмен адресов между указателями?
2. Насколько безопасен такой код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private void swap(String a, String b) {
   try {
     Field value = String.class.get("value");
     value.setAccessible(true);    // this should be forbidden!!

     char[] temp = value.get(a);
     value.set(a, value.get(b));
     value.set(b, temp);           // Aaargh, please forgive me
   } catch(Exception e) {
     e.printStackTrace(e);
   }
 }



ты сделал мой день.

1-й вариант конечно же не пашет, так как ссылки в джаве - это не ссылки в с++, а скорее указатели, которые разыминовываются неявно.

2-й я бы побоялся назвать безопасным, так как реализация класса стринг - может поменяться.
Да и вообще - строки по определению - неизменяемые, а ты нарушаешь это определение, что может привести к багам, как из-за жавовского оптимизатора, так и из-за программистов, которые уверены что строка изменится не может.


единственный вариант - создать класс "указатель на строку", и для него можно написать ф-ю swap.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626425
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesier , да ТС-у и этого будет предостаточно.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626632
Большой Синий Кит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN2-й я бы побоялся назвать безопасным, так как реализация класса стринг - может поменяться.
Да и вообще - строки по определению - неизменяемые, а ты нарушаешь это определение, что может привести к багам, как из-за жавовского оптимизатора, так и из-за программистов, которые уверены что строка изменится не может.


Да тут больше проблема в том, что ТС подменяет value, но совершенно забывает о offset и count.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626639
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большой Синий КитZyK_BotaN2-й я бы побоялся назвать безопасным, так как реализация класса стринг - может поменяться.
Да и вообще - строки по определению - неизменяемые, а ты нарушаешь это определение, что может привести к багам, как из-за жавовского оптимизатора, так и из-за программистов, которые уверены что строка изменится не может.


Да тут больше проблема в том, что ТС подменяет value, но совершенно забывает о offset и count.

не вглублялся в код, но изменять неизменяемый объект - это нонсенс ))
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626650
Большой Синий Кит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Код левый к тому же :)) String.class.get("value"); - это что такое? :)) Такого метода вообще в природе не существует.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626655
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большой Синий КитP.S. Код левый к тому же :)) String.class.get("value"); - это что такое? :)) Такого метода вообще в природе не существует.

я подумал - что интроспекция.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626657
Большой Синий Кит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN,

Да и поле ведь final!
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626665
Большой Синий Кит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN,

Я к тому, что автор жжет. Пишет что-то вообще левое. :))
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626669
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большой Синий КитZyK_BotaN,

Я к тому, что автор жжет. Пишет что-то вообще левое. :))
может тролль какой
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626670
Большой Синий Кит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильный ответ:
amigaboy 2. Насколько безопасен такой код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private void swap(String a, String b) {
   try {
     Field value = String.class.get("value");
     value.setAccessible(true);    // this should be forbidden!!

     char[] temp = value.get(a);
     value.set(a, value.get(b));
     value.set(b, temp);           // Aaargh, please forgive me
   } catch(Exception e) {
     e.printStackTrace(e);
   }
 }




Он СОВЕРШЕННО безопасен, потому что не компилируем.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626678
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большой Синий КитПравильный ответ:
amigaboy2. Насколько безопасен такой код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private void swap(String a, String b) {
   try {
     Field value = String.class.get("value");
     value.setAccessible(true);    // this should be forbidden!!

     char[] temp = value.get(a);
     value.set(a, value.get(b));
     value.set(b, temp);           // Aaargh, please forgive me
   } catch(Exception e) {
     e.printStackTrace(e);
   }
 }





Он СОВЕРШЕННО безопасен, потому что не компилируем.
записал у цитатник компьютерного юмора.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626727
Miha_S7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
amigaboy,

вот так работает

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
import java.lang.reflect.*;

public class Test {

    private void swap(String a, String b) {
        try {
            Field value = String.class.getDeclaredField("value");
            
            value.setAccessible(true);    // this should be forbidden!!

            char[] temp = (char[])value.get(a);
            value.set(a, value.get(b));
            value.set(b, temp);           // Aaargh, please forgive me
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
 
    public static void main(String[] args) {
        
        Test inst = new Test();
        
        String s1 = "aaa";
        String s2 = "bbb";
        
        System.out.println("s1 = " + s1);
        System.out.println("s2 = " + s2);
        
        inst.swap(s1,s2);
        
        System.out.println("s1 = " + s1);
        System.out.println("s2 = " + s2);
    }
}



но зачем болт забивать молотком? Мне кажется setAccessible() нужно использовать в крайних случаях, чтобы реализовать какие-нибудь замысловатые "доступы", типа friendly класс. А в остальном - это больше на хакерство какое-то смахивает, которое может привести к непредсказуемым последствиям. В этом плане, конечно, код нифига не безопасный.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626732
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miha_S7amigaboy,

вот так работает

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
import java.lang.reflect.*;

public class Test {

    private void swap(String a, String b) {
        try {
            Field value = String.class.getDeclaredField("value");
            
            value.setAccessible(true);    // this should be forbidden!!

            char[] temp = (char[])value.get(a);
            value.set(a, value.get(b));
            value.set(b, temp);           // Aaargh, please forgive me
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
 
    public static void main(String[] args) {
        
        Test inst = new Test();
        
        String s1 = "aaa";
        String s2 = "bbb";
        
        System.out.println("s1 = " + s1);
        System.out.println("s2 = " + s2);
        
        inst.swap(s1,s2);
        
        System.out.println("s1 = " + s1);
        System.out.println("s2 = " + s2);
    }
}




но зачем болт забивать молотком? Мне кажется setAccessible() нужно использовать в крайних случаях, чтобы реализовать какие-нибудь замысловатые "доступы", типа friendly класс. А в остальном - это больше на хакерство какое-то смахивает, которое может привести к непредсказуемым последствиям . В этом плане, конечно, код нифига не безопасный.

мягко сказано.
класс стринг - изначально считается неизменямым, что позваляет жвм делать оптимизации, плюс сами программисты уверены в корректности кода(например в когерентности кешей).

этот код не то что небезопасный, он опасный, я бы даже сказал - вредительский.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626984
amigaboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну взял я первый попавшийся на stackoverfow кусок кода, скопипастил. Чего прицепились? :)
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626993
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amigaboyНу взял я первый попавшийся на stackoverfow кусок кода, скопипастил. Чего прицепились? :)

не делай больше так.
если нужна ф-я swap для строк, то сделай класс-ссылку на строку.
class StringRef {
pulibc String s;
}
и работай с ним.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37626999
amigaboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNamigaboyНу взял я первый попавшийся на stackoverfow кусок кода, скопипастил. Чего прицепились? :)

не делай больше так.
если нужна ф-я swap для строк, то сделай класс-ссылку на строку.
class StringRef {
pulibc String s;
}
и работай с ним.А если я хочу для универсальности использовать generics? Скажем <E extends Comparable>
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37627002
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amigaboyZyK_BotaNпропущено...


не делай больше так.
если нужна ф-я swap для строк, то сделай класс-ссылку на строку.
class StringRef {
pulibc String s;
}
и работай с ним.А если я хочу для универсальности использовать generics? Скажем <E extends Comparable>
делай что хочешь, но изменять неизменяемый объект - это вредительство а не программирование.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37627003
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amigaboy,

ну и кто тебе дженерик реф мешает сделать?
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37627012
amigaboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNделай что хочешь, но изменять неизменяемый объект - это вредительство а не программирование.Значит баблсорт не для Джавы? :)
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37627017
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amigaboyZyK_BotaNделай что хочешь, но изменять неизменяемый объект - это вредительство а не программирование.Значит баблсорт не для Джавы? :)
че не для джавы. просто нах тебе ф-я swap?
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37627019
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNamigaboyпропущено...
Значит баблсорт не для Джавы? :)
че не для джавы. просто нах тебе ф-я swap?или сделай свап по другому.
вместо строк - передавай индексі массива, чем не решение?
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37627024
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amigaboy,

та и по бістродействию сравни.
что дешевле, копировть всю строку - как ті вздумал, или ссілку на нее?
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37627075
Большой Синий Кит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miha_S7amigaboy,

вот так работает
+

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
import java.lang.reflect.*;

public class Test {

    private void swap(String a, String b) {
        try {
            Field value = String.class.getDeclaredField("value");
            
            value.setAccessible(true);    // this should be forbidden!!

            char[] temp = (char[])value.get(a);
            value.set(a, value.get(b));
            value.set(b, temp);           // Aaargh, please forgive me
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
 
    public static void main(String[] args) {
        
        Test inst = new Test();
        
        String s1 = "aaa";
        String s2 = "bbb";
        
        System.out.println("s1 = " + s1);
        System.out.println("s2 = " + s2);
        
        inst.swap(s1,s2);
        
        System.out.println("s1 = " + s1);
        System.out.println("s2 = " + s2);
    }
}



но зачем болт забивать молотком? Мне кажется setAccessible() нужно использовать в крайних случаях, чтобы реализовать какие-нибудь замысловатые "доступы", типа friendly класс. А в остальном - это больше на хакерство какое-то смахивает, которое может привести к непредсказуемым последствиям. В этом плане, конечно, код нифига не безопасный.

Да не работает так нифига Я же говорю, вы забываете об offset и count

Попробуйте

Код: java
1.
2.
3.
4.
5.
6.
7.
Test inst = new Test();
        
        String s1 = "aaa";
        String s2 = "bbb bbb";
        
        System.out.println("s1 = " + s1);
        System.out.println("s2 = " + s2);



Вы работать с таким стрингом не сможете нормально.
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37627110
Miha_S7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большой Синий Кит,

ага, наглядная иллюстрация тех самых непредсказуемых последствий :-)
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37627935
amigaboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В продолжение темы.

Сортировка:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class BubbleSort<E extends Comparable> {
	private E[] objArray; 

	.........

	public void sort() {
		if (objArray.length > 0) {
			for (int i = 0; i < objArray.length; i++)
				for (int j = i; j < objArray.length - 1; j++) {
					E o1 = objArray[j];
					E o2 = objArray[j + 1];
					
					if (o1.compareTo(o2) > 0) {
						RefObject<E> r1 = new RefObject<E>(objArray[j]);
						RefObject<E> r2 = new RefObject<E>(objArray[j + 1]);
						RefObject<E> r3 = new RefObject<E>(objArray[j]);
						
						r1.setArgvalue(r2.getArgvalue());
						r2.setArgvalue(r3.getArgvalue());
					}
				}
		}
	}
}


RefObject:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public final class RefObject<T>
{
    public T argvalue;
    
    public RefObject(T refarg) {
        argvalue = refarg;
    }

	public T getArgvalue() {
		return argvalue;
	}

	public void setArgvalue(T argvalue) {
		this.argvalue = argvalue;
	}
}



Не сортирует.

Все не правильно?
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37627971
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amigaboyНе сортирует.

Все не правильно?
а че вы не последовали моему совету:

ZyK_BotaNZyK_BotaNпропущено...

че не для джавы. просто нах тебе ф-я swap?или сделай свап по другому.
вместо строк - передавай индексі массива, чем не решение?

у тебя там нет обмена строк между элементами массива, а есть бомен - между RefObject-и.
что бессмісленно.

вікиньте єти рефОбжекті, и реализуйте нормальній обмен:

t = objArray[j];
objArray[j] = objArray[j+1];
objArray[j+1] = t;
...
Рейтинг: 0 / 0
Обмен объектов (метод swap)
    #37628001
amigaboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN,

да, замечательно работает. Спасибо.

Надо выбивать из головы эту указательную Сишную дурь.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Обмен объектов (метод swap)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]