Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Обмен объектов (метод swap) / 25 сообщений из 31, страница 1 из 2
22.01.2012, 23:47:08
    #37626224
amigaboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
Захотелось потренироваться, попереписывать стандартные алгортимы в 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
23.01.2012, 00:20:01
    #37626248
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
...
Рейтинг: 0 / 0
23.01.2012, 00:24:43
    #37626250
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
amigaboy1. Ссылка, как я понимаю, это аналог указателя в Си.
P.S. И, кстати... Указатель - это указатель. А ссылка - это ссылка. Возьмите справочник по C/C++ и найдите отличия. Так... Чисто для общей прокачки... И передача параметров по адресу != передаче параметров по ссылке.
...
Рейтинг: 0 / 0
23.01.2012, 07:39:09
    #37626337
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
Ruslan.Isbarov amigaboy , читайте до полного просветления .
Столько воды.. А даже не сказал, что параметры метода (фактически копии ссылок) хранятся в стеке.
...
Рейтинг: 0 / 0
23.01.2012, 08:54:15
    #37626366
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
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
23.01.2012, 10:03:12
    #37626425
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
mesier , да ТС-у и этого будет предостаточно.
...
Рейтинг: 0 / 0
23.01.2012, 12:19:40
    #37626632
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
ZyK_BotaN2-й я бы побоялся назвать безопасным, так как реализация класса стринг - может поменяться.
Да и вообще - строки по определению - неизменяемые, а ты нарушаешь это определение, что может привести к багам, как из-за жавовского оптимизатора, так и из-за программистов, которые уверены что строка изменится не может.


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


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

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

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

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

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

Я к тому, что автор жжет. Пишет что-то вообще левое. :))
может тролль какой
...
Рейтинг: 0 / 0
23.01.2012, 12:28:06
    #37626670
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
Правильный ответ:
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
23.01.2012, 12:32:01
    #37626678
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
Большой Синий КитПравильный ответ:
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
23.01.2012, 12:53:08
    #37626727
Miha_S7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
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
23.01.2012, 12:55:51
    #37626732
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
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
23.01.2012, 14:36:07
    #37626984
amigaboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
Ну взял я первый попавшийся на stackoverfow кусок кода, скопипастил. Чего прицепились? :)
...
Рейтинг: 0 / 0
23.01.2012, 14:40:14
    #37626993
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
amigaboyНу взял я первый попавшийся на stackoverfow кусок кода, скопипастил. Чего прицепились? :)

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

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


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

ну и кто тебе дженерик реф мешает сделать?
...
Рейтинг: 0 / 0
23.01.2012, 14:45:09
    #37627012
amigaboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
ZyK_BotaNделай что хочешь, но изменять неизменяемый объект - это вредительство а не программирование.Значит баблсорт не для Джавы? :)
...
Рейтинг: 0 / 0
23.01.2012, 14:46:41
    #37627017
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
amigaboyZyK_BotaNделай что хочешь, но изменять неизменяемый объект - это вредительство а не программирование.Значит баблсорт не для Джавы? :)
че не для джавы. просто нах тебе ф-я swap?
...
Рейтинг: 0 / 0
23.01.2012, 14:47:13
    #37627019
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен объектов (метод swap)
ZyK_BotaNamigaboyпропущено...
Значит баблсорт не для Джавы? :)
че не для джавы. просто нах тебе ф-я swap?или сделай свап по другому.
вместо строк - передавай индексі массива, чем не решение?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Обмен объектов (метод swap) / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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