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

начну с себя:

вопрос 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
java трюки.
    #38568602
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Больше понравилось про 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
java трюки.
    #38568649
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверин,

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

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

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

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

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

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

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

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

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

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

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

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

А чего там писать?
Код: sql
1.
2.
3.
4.
5.
class Elem {
  private int value;
  private Elem next;
...
}
...
Рейтинг: 0 / 0
java трюки.
    #38569617
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin, что за Value? Шаблон давай.
...
Рейтинг: 0 / 0
java трюки.
    #38569780
Фотография 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 !
...
Рейтинг: 0 / 0
java трюки.
    #38569784
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
java трюки.
    #38569785
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Tominredwhite90пропущено...


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

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



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

Доведи дело до конца.
...
Рейтинг: 0 / 0
java трюки.
    #38569806
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
java трюки.
    #38569812
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Операция ? это и есть функция внутри которой стоит 'if'. Перепиши код без ее использования.
...
Рейтинг: 0 / 0
java трюки.
    #38569855
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,
надо чтобы
Код: java
1.
in+lon



вываливал exception. Или мы вообще о разном?
...
Рейтинг: 0 / 0
java трюки.
    #38569920
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
java трюки.
    #38569921
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
java трюки.
    #38569992
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

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

ссылка на SO реально крутая - надо будет изучить поподробнее ее.
...
Рейтинг: 0 / 0
java трюки.
    #38570007
drsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
java трюки.
    #38570013
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Он будет держать ссылку, пока он сам доступен. Так что все ок.

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


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