Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / java трюки. / 25 сообщений из 111, страница 1 из 5
21.02.2014, 00:04
    #38568207
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
Предлагаю в это теме выкладывать примеры не очевидного(очевидного не для всех) выполнения кода. желательно очень простые.Надеюсь это расширит наш кругозор.

начну с себя:

вопрос 1 : В каком случае Math.abs вернет отрицательное число?

ответ :Math.abs(Integer.MIN_VALUE) вернет отрицательно число так как положительный(строго >0) и отрицательный(<0) диапазон не симметричен - отрицательных чисел на 1 больше. Когда берется модуль от минимального Integer, то получается положительное число на 1 больше, чем максимальный Integer, а это переполнение и собственно это и есть искомое число.


вопрос 2 : Есть код:
Код: java
1.
2.
int in=2;
long lon=5;


аналогичны ли такие выражения?:

Код: java
1.
 in =in+lon;


Код: java
1.
 in+ =lon;


ответ:
1 -очевидна ошибка компиляции - не стоит заострять внимания.
2- аналогично:
Код: java
1.
in = (int)(in+lon);


поэтому всё хорошо.


Интересно, что предложите вы.
...
Рейтинг: 0 / 0
21.02.2014, 11:54
    #38568602
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
Больше понравилось про try/catch/finally


Ответьте подряд на 3 вопрос:
Что вернет:

Код: java
1.
2.
3.
4.
5.
try {
  return "foo";
} finally {
  return "bar";
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
while(true) {
  try {
    return "foo";
  } finally {
    break;
  }
}
return "bar";



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
while(true) {
  try {
    return "foo";
  } finally {
    break;
  }
}
return "bar";



Спойлер:

1:
Результат будет «bar», потому что оператор finally будет подставлен перед оператором return, а значит return из finally-блока будет вызван первым, а return из try-блока вообще не будет вызван.


2:
Результат будет «foo», потому что значение для оператора return будет положено в стек до того, как будет вызван оператор finally, после которого оно будет восстановлено и возвращено. (Мой пример это не показывает, но это именно то, что вы увидите, если посмотрите байт-код.) Таким образом, изменение значения «value» в блоке finally не имеет ни какого значения для оператора return.


3:
Результат будет «bar». Это было удивлением даже для меня, однако все логично, если вы знаете, что оператор break всего лишь GOTO в байт-коде. Т.е. когда finally-блок подставляется как часть внутреннего оператора return, оператор GOTO вызывается раньше, чем инструкция RETURN, что приводит к выходу из цикла. (То же самое для оператора continue внутри finally-блока.)


http://habrahabr.ru/post/212759/
...
Рейтинг: 0 / 0
21.02.2014, 12:28
    #38568649
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
Озверин,

2 и 3 кусок кода - одинаковый.
...
Рейтинг: 0 / 0
21.02.2014, 12:32
    #38568655
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
questionerОзверин,

2 и 3 кусок кода - одинаковый.
Код: java
1.
2.
3.
4.
5.
6.
String value = "foo";
try {
  return value;
} finally {
  value = "bar";
}
...
Рейтинг: 0 / 0
21.02.2014, 13:18
    #38568728
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
Код-майдфак (++i + ++i ) мы обсуждать не будем?
...
Рейтинг: 0 / 0
21.02.2014, 13:21
    #38568735
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
maytonКод-майдфак (++i + ++i ) мы обсуждать не будем?

почему бы и нет? часто спрашивают
...
Рейтинг: 0 / 0
21.02.2014, 13:57
    #38568791
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
maytonКод-майдфак (++i + ++i ) мы обсуждать не будем?

зачем? кто то эту муру в жизни использует именно таким образом? уволить
...
Рейтинг: 0 / 0
21.02.2014, 14:39
    #38568848
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
ОзверинmaytonКод-майдфак (++i + ++i ) мы обсуждать не будем?

зачем? кто то эту муру в жизни использует именно таким образом? уволить

Именно. А кто спрашивает- тот не понимает сути разработки и собеседования. Лучший ответ- "так писать нельзя".

PS: хорошо помогала задача "вставить элемент в упорядоченный однонаправленный список без всяких JDK-классов". Вот тут шевеление извилин видно. Единственный кандидат, быстро набросавший код, потом очень хорошо работал...
...
Рейтинг: 0 / 0
21.02.2014, 16:50
    #38569011
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
Alexey Tomin
PS: хорошо помогала задача "вставить элемент в упорядоченный однонаправленный список без всяких JDK-классов". Вот тут шевеление извилин видно. Единственный кандидат, быстро набросавший код, потом очень хорошо работал...

и список тоже самописный?
...
Рейтинг: 0 / 0
21.02.2014, 22:03
    #38569195
Valery Shiskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
redwhite90,

Я бы не сказал, что ответ на вопрос абсолютно правилен. Метод abs вернет Integer.MIN_VALUE согласно спецификации метода abs. А причины такой реализации известны только разработчикам.Почему метод не выбрасывает исключения ? Чем руководствовались разработчики ? Вот это действительно интересно.
...
Рейтинг: 0 / 0
22.02.2014, 12:36
    #38569370
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
Valery Shiskinredwhite90,

Я бы не сказал, что ответ на вопрос абсолютно правилен. Метод abs вернет Integer.MIN_VALUE согласно спецификации метода abs. А причины такой реализации известны только разработчикам.Почему метод не выбрасывает исключения ? Чем руководствовались разработчики ? Вот это действительно интересно.

спецификация действительно не врёт. Это очевидно. Но спека иногда очевидна, а иногда - нет. Вот я и хочу, чтобы здесь собирались вещи, которые кого-то когда-то удивили. не беда, что для кого-то это будет очевидно.
...
Рейтинг: 0 / 0
22.02.2014, 21:23
    #38569602
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
redwhite90Alexey TominPS: хорошо помогала задача "вставить элемент в упорядоченный однонаправленный список без всяких JDK-классов". Вот тут шевеление извилин видно. Единственный кандидат, быстро набросавший код, потом очень хорошо работал...

и список тоже самописный?

А чего там писать?
Код: sql
1.
2.
3.
4.
5.
class Elem {
  private int value;
  private Elem next;
...
}
...
Рейтинг: 0 / 0
22.02.2014, 21:52
    #38569617
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
Alexey Tomin, что за Value? Шаблон давай.
...
Рейтинг: 0 / 0
23.02.2014, 13:07
    #38569780
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
Эксклюзивный трюк!

Код: 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.
import static java.lang.System.out;
import static java.lang.Integer.parseInt;

public class A                                                                                                                                         
{                                                                                                                                                      
    private static boolean isInteger( String v )                                                                                                       
    {                                                                                                                                                  
        try                                                                                                                                            
        {                                                                                                                                              
            parseInt( v );                                                                                                                             
            return true;                                                                                                                               
        }                                                                                                                                              
        catch( NumberFormatException e )                                                                                                               
        {                                                                                                                                              
            return false;                                                                                                                              
        }                                                                                                                                              
    }                                                                                                                                                  
                                                                                                                                                       
    public static void main (String [] args)                                                                                                           
    {                                                                                                                                                  
        int i = 0;                                                                                                                                     
        for( String a : args )                                                                                                                         
        {                                                                                                                                              
            out.printf( "%d = %s\n", i, isInteger(a) ? a : "Not an integer");                                                                          
            ++i;                                                                                                                                       
        }                                                                                                                                              
    }                                                                                                                                                  
}



Позволяет обойтись без оператора if !
...
Рейтинг: 0 / 0
23.02.2014, 13:26
    #38569784
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
MasterZivЭксклюзивный трюк!

Код: 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.
import static java.lang.System.out;
import static java.lang.Integer.parseInt;

public class A                                                                                                                                         
{                                                                                                                                                      
    private static boolean isInteger( String v )                                                                                                       
    {                                                                                                                                                  
        try                                                                                                                                            
        {                                                                                                                                              
            parseInt( v );                                                                                                                             
            return true;                                                                                                                               
        }                                                                                                                                              
        catch( NumberFormatException e )                                                                                                               
        {                                                                                                                                              
            return false;                                                                                                                              
        }                                                                                                                                              
    }                                                                                                                                                  
                                                                                                                                                       
    public static void main (String [] args)                                                                                                           
    {                                                                                                                                                  
        int i = 0;                                                                                                                                     
        for( String a : args )                                                                                                                         
        {                                                                                                                                              
            out.printf( "%d = %s\n", i, isInteger(a) ? a : "Not an integer");                                                                          
            ++i;                                                                                                                                       
        }                                                                                                                                              
    }                                                                                                                                                  
}



Позволяет обойтись без оператора if !

в книге от head first по паттернам видел что-то подобное) Там говорится, что это способ на любителя)
...
Рейтинг: 0 / 0
23.02.2014, 13:27
    #38569785
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
Alexey Tominredwhite90пропущено...


и список тоже самописный?

А чего там писать?
Код: sql
1.
2.
3.
4.
5.
class Elem {
  private int value;
  private Elem next;
...
}



хотел бы я у вас пособеседоваться)
...
Рейтинг: 0 / 0
23.02.2014, 13:40
    #38569790
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
redwhite90, ты использовал тернарную операцию.

Доведи дело до конца.
...
Рейтинг: 0 / 0
23.02.2014, 14:43
    #38569806
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
maytonredwhite90, ты использовал тернарную операцию.

Доведи дело до конца.
не понял.

Код: java
1.
2.
3.
4.
int in =1;
long lon =2;
in=(in>lon)?(in+lon):(in-lon);//так нельзя
in+=(in>lon)?(in+lon):(in-lon);//так можно
...
Рейтинг: 0 / 0
23.02.2014, 14:57
    #38569812
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
Операция ? это и есть функция внутри которой стоит 'if'. Перепиши код без ее использования.
...
Рейтинг: 0 / 0
23.02.2014, 16:24
    #38569855
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
mayton,
надо чтобы
Код: java
1.
in+lon



вываливал exception. Или мы вообще о разном?
...
Рейтинг: 0 / 0
23.02.2014, 20:13
    #38569920
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
redwhite90,

Инициализация внутри определения анонимного класса (компактный вариант):
Код: java
1.
2.
3.
4.
5.
List<String> myList = new ArrayList<String>() {{
	add("One");
	add("Two");
	add("Three");
}};

На самом деле инициализация происходит внутри конструктора анонимного класса (полный вариант):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
List<String> myList = new ArrayList<String>() {
	
	private static final long serialVersionUID = 1L; // по просьбе eclipse

	{ // Конструктор анонимного класса 
		add("One");
		add("Two");
		add("Three");
	}
};

Название "финта" - Double Brace Initialization
...
Рейтинг: 0 / 0
23.02.2014, 20:14
    #38569921
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
...
Рейтинг: 0 / 0
24.02.2014, 00:18
    #38569992
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
Usman,

авторНа самом деле инициализация происходит внутри конструктора анонимного класса (полный вариант):
я думал всё таки в блоке инициализации, который выполняется после конструктора базового класса, но до конструктора анонимного класса.

ссылка на SO реально крутая - надо будет изучить поподробнее ее.
...
Рейтинг: 0 / 0
24.02.2014, 01:45
    #38570007
drsm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
Usmanredwhite90,

Инициализация внутри определения анонимного класса (компактный вариант):
Код: java
1.
2.
3.
4.
5.
List<String> myList = new ArrayList<String>() {{
	add("One");
	add("Two");
	add("Three");
}};

Название "финта" - Double Brace Initialization

есть мнение, что так можно словить конкретный bad luck, тк получившийся объект анонимного класса,
дежит ссылку на внешний объект в котором создан.
...
Рейтинг: 0 / 0
24.02.2014, 02:54
    #38570013
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java трюки.
Он будет держать ссылку, пока он сам доступен. Так что все ок.

обычно внутрение классы без внешнего все равно не используются.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / java трюки. / 25 сообщений из 111, страница 1 из 5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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