
James Tiberius Kirk ?
24.07.2016
19:51:30
а все
оно возвращает же Mountain

Мытко
24.07.2016
19:51:46
http://puu.sh/qd0mX/2fad84717f.png

James Tiberius Kirk ?
24.07.2016
19:51:58
думал стринг возвращает

Google

Gleb
24.07.2016
19:52:03

James Tiberius Kirk ?
24.07.2016
19:52:07
и че?
класс статический

Gleb
24.07.2016
19:52:16
аа

James Tiberius Kirk ?
24.07.2016
19:52:19
точнее поле
ты обращаешься к статическому полю, которое всегда есть, даже если экземпляр равен null

Nikita
24.07.2016
19:52:48
Ещё хотите?)

James Tiberius Kirk ?
24.07.2016
19:52:56
у меня был похожий вопрос на собеседовании в Ламоду

Gleb
24.07.2016
19:53:26

James Tiberius Kirk ?
24.07.2016
19:53:34
конечно
че ему не быть доступным? оно же паблик

Gleb
24.07.2016
19:54:09
ну, оно статичное, хз

Alex
24.07.2016
19:54:22
@DarkCasual , а если не сложно, флотовский нан torawintbytes распечатай?)

Google

Gleb
24.07.2016
19:54:28
как-то не вяжется статичное поле и экземпляр класса в моем понимании

Мытко
24.07.2016
19:54:57
я тебя огорчу

James Tiberius Kirk ?
24.07.2016
19:54:57
не знаю деталей как классы инициализируются, но обращение к статическому полю идет не к памяти конкретного объекта, а к описанию класса, что-то вроде того

Мытко
24.07.2016
19:54:58
http://puu.sh/qd0yz/1cfcef6629.png
http://puu.sh/qd0DP/0220b70c45.png

Nikita
24.07.2016
19:57:35
"Hel" + "lo" == "Hello"
Чому равно?

Мытко
24.07.2016
19:57:47
в общем
я тут дебагер запустил
http://puu.sh/qd0Lg/2573be58f2.png

James Tiberius Kirk ?
24.07.2016
19:58:27
не знаю деталей пула стрингов, но вроде как true

Мытко
24.07.2016
19:58:37
как видишь, вот при нане это условие выполняется
и там он как-то хардкордно result приравнивает к 0x7fc0...

Nikita
24.07.2016
20:00:40
"Hello" == "Hello" что Выдаст?

James Tiberius Kirk ?
24.07.2016
20:01:18
тоже тру


Nikita
24.07.2016
20:03:44
Таже тема, но сложнее:
//In File Other.java
package other;
public class Other { public static String hello = "Hello"; }
//In File Test.java
package testPackage;
import other.*;
class Test{
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((testPackage.Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " "); // runtime
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
Что получим?
Всё тру, кроме hello == "Hel"+lo
Итак, 6 малоизвестных фактов о строках в Java:
1. Строковые литералы в одном классе представляют собой ссылки на один и тот же объект.
2. Строковые литералы в разных классах, но в одном пакете представляют собой ссылки на один и тот же объект.
3. Строковые литералы в разных классах и разных пакетах всё равно представляют собой ссылки на один и тот же объект )).
4. Строки, получающиеся сложением констант, вычисляются во время компиляции и далее смотри пункт первый.
5. Строки, создаваемые во время выполнения НЕ ссылаются на один и тот же объект. (поэтому четвертый вывод — false)
6. Метод intern в любом случае возвращает объект из пула, вне зависимости от того, когда создается строка, на этапе компиляции или выполнения. (Поэтому последний вывод — true).
Более подробно эта тема описана в пункте 3.10.5 спецификации Java.


Мытко
24.07.2016
20:07:15
норм тема

Вжик
24.07.2016
20:08:07
Всё тру, кроме hello == "Hel"+lo
Итак, 6 малоизвестных фактов о строках в Java:
1. Строковые литералы в одном классе представляют собой ссылки на один и тот же объект.
2. Строковые литералы в разных классах, но в одном пакете представляют собой ссылки на один и тот же объект.
3. Строковые литералы в разных классах и разных пакетах всё равно представляют собой ссылки на один и тот же объект )).
4. Строки, получающиеся сложением констант, вычисляются во время компиляции и далее смотри пункт первый.
5. Строки, создаваемые во время выполнения НЕ ссылаются на один и тот же объект. (поэтому четвертый вывод — false)
6. Метод intern в любом случае возвращает объект из пула, вне зависимости от того, когда создается строка, на этапе компиляции или выполнения. (Поэтому последний вывод — true).
Более подробно эта тема описана в пункте 3.10.5 спецификации Java.
кинь ссылку, откуда это всё - упражнения и разъяснения

Nikita
24.07.2016
20:08:51
https://m.habrahabr.ru/post/111189/

Google

Nikita
24.07.2016
20:09:02
Хехе, меня расскрыли

Вжик
24.07.2016
20:09:50

Victor
24.07.2016
20:12:22
Скомпилируется?
System.out.println("\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu2015")

Gleb
24.07.2016
20:13:21
нет

James Tiberius Kirk ?
24.07.2016
20:14:01
да

Gleb
24.07.2016
20:14:10
"pritln" не скомпилится точно

Victor
24.07.2016
20:14:11
А это?
char ch = '\uuuuuuuuuuuuuuuu2015';
System.out.println(ch);

James Tiberius Kirk ?
24.07.2016
20:14:20
очевидно что подвох не в этом

Victor
24.07.2016
20:14:32
Аха, точно

James Tiberius Kirk ?
24.07.2016
20:14:42
все скомпилилось
в чем суть?

Victor
24.07.2016
20:15:21
Зачем они так сделали?

Victor
24.07.2016
20:15:31
В Си одна только u разрешена
Тут - бесконечно

James Tiberius Kirk ?
24.07.2016
20:15:47
а какие проблемы могут возникнуть?

Andrey
24.07.2016
20:15:57

Victor
24.07.2016
20:16:28
Никаких, но как-то оно не очень выглядит.
Вроде в спеках написано, что это стандарт.
А в С, C# и остальных, не стандарт что ли?

Мытко
24.07.2016
20:20:39
http://puu.sh/qd2d0/e6a6e3c68d.png

Google

Мытко
24.07.2016
20:20:45
действительно

Victor
24.07.2016
20:22:00
Не знаю, где пригодится, но, как минимум, если писать джава лексер, то уж точно надо по спецификации делать.

guga
24.07.2016
20:23:46
Лол 300 сообщений обсуждали как писать equals. ?

Мытко
24.07.2016
20:24:38
мдемс
а я вместо спринга в чатике сидел
и вот эти задачки смотрел

guga
24.07.2016
20:26:25
Эх спринг, one love. Вместо него команда сказала что будем пилить все на finagle / Twitter-server и на скале. И пофигу что займет раза в три больше времени.

Admin
ERROR: S client not available

Мытко
24.07.2016
20:33:00
я вот это не понял, кстати
допустим есть у нас формула result = 31*x + y
нужно решить уравнение 31*x + y = 31*y + x
тогда ты получишь значения твоего объекта point когда случится коллизия
кстати

guga
24.07.2016
20:39:38
Это вы обсуждали hashcode?

Мытко
24.07.2016
20:39:43
ага
в общем, я посмотрел реализацию hashcode в классе Objects
http://puu.sh/qd3pN/f8d21d397b.png
http://puu.sh/qd3qk/e4fea83029.png
вот он тут норм выглядит, во всяком случае для интов

James Tiberius Kirk ?
24.07.2016
20:41:34

Google

guga
24.07.2016
20:41:38
Бросай не скины, а код.

Мытко
24.07.2016
20:41:50
как мне форматировать?

James Tiberius Kirk ?
24.07.2016
20:42:08
просто хотел найти зависимость x от y, когда возникнет коллизия

Мытко
24.07.2016
20:42:12
вот так
или как
public static int hash(Object... values) {
return Arrays.hashCode(values);
}
public static int hashCode(Object a[]) {
if (a == null)
return 0;
int result = 1;
for (Object element : a)
result = 31 * result + (element == null ? 0 : element.hashCode());
return result;
}

guga
24.07.2016
20:48:34
Да так. А теперь о хешкоде он юзается в хеш мапах и других структурах данных на основе хешей. Если у тебя плохая хеш-функция, много разных записей попадет в один бакет и твоя мапа резко просядет по производительности. Был даже баг с хешом стрингов в какой-то из джав. И все всплыло когда какой-то из веб серваком хранил атрибуты запроса в такой хешмапе и его довольно легко положили небольшим количеством реквестов.

Мытко
24.07.2016
20:50:42
ага
вообще
версия хашкода, что я скинул из класса arrays делает точно такой же хэш, что и сгенерила intellij, только в 31 раз больше
так что, это точно такой же алгоритм
я с какого-то перепугу решил что он лучше

Pavel ?
24.07.2016
20:59:39
А зачем так заморачиваться по поводу хешей то?

guga
24.07.2016
21:00:12
Где-то в классическом труде по cs бы описан именно такой способ расчета хеша, вот все его и юзают

Мытко
24.07.2016
21:00:41
жалко что я плохой математик
я понимаю почему используют простое число
но почему такое - хз

guga
24.07.2016
21:01:00
Ну главное не путать его с криптографическими хешами.

Andrey
25.07.2016
03:33:28
но почему такое - хз
Потому что 31 * i == (i << 5) - i. Из-за чего такое решение становится очень производительным.