Primitive types, autoboxing, caching

 
 
 
Сообщения:9474
Статья переехала на JavaTalks Articles
Изменен:18 дек 2012 09:26
 
 
Сообщения:74
Не могу понять этого
Quote:

то же самое будет и с любой другой оберткой, вызовется их valueOf(). И здесь важный нюанс, если вы заглянете в вышеприведенный метод, то окажется, что он не просто создает объект класса Integer, а смотрит является ли переданное в него число больше -127 или меньше какой-то верхней границы, если же число и взаправду входит в этот промежуток, то новый объект создаваться не будет! Это значит, что: Код:
1 Integer one = 1;
2 Integer copyOfOne = 1;
3 one.equals(copyOfOne) == true
4 one == copyOfOne == true!


Ссылки равны, это произошло, потому как метод valueOf() вернул тот же объект. Однако: Код:
1 Integer thousand = 1000;
2 Integer copyOfThousand = 1000;
3 thousand.equals(copyOfThousand) == tru


Почему происходит так? Ведь значения интеджера от
-2147483648 до 2147483647
и 1000 явно входит в этот промежуток
 
 
Сообщения:245
Выше было описано.
В первом случае объект один и тот же, потому что берётся из IntegerCache.
В IntegerCache помещаются только числа от -128 до 127 (а не -2147483648 до 2147483647). Верхнюю границу можно увеличить.
Из-за этих границ во втором случае объекты берутся не из IntegerCache и, следовательно, отличаются. Совпадает только их числовое представление.

 
 
Сообщения:2
Quote:
Итак, во-первых, в Java есть примитивы, такие как int, double, а есть их аналоги - Integer, Double. Созданы они скорей всего для работы с generics (Map<Integer, Double>), а возможно и просто, чтоб можно было использовать примитивы как объекты, но это не суть важно.


что это за ересь? какие еще аналоги? простой тип он и есть простой. Возможно создатель темы имел ввиду имена типов? =) "созданы скорее всего" - просто убило...
 
 
Сообщения:9474
Quote:
простой тип он и есть простой.
В первом случае - примитив, во-втором, - ссылочные типы; это совсем разные понятия. Если с Java начинаешь только ознакамливаться, то имеет смысл а) прочесть книги для начинающих, иже перечислены в нашем ЧаВо б) меньше задирать нос. Если же ты с Java давно и опыта достаточно, то мм.. по сути те же самые пункты.
Quote:
просто убило...
Что именно? Мне важно знать, у меня есть нерадивые соседи..
PS: ты не из Делфей к нам пришел случаем? :)
 
 
Сообщения:2
Староверъ:
Quote:
простой тип он и есть простой.
В первом случае - примитив, во-втором, - ссылочные объекты; это совсем разные понятия. Если с Java начинаешь только ознакамливаться, то имеет смысл а) прочесть книги для начинающих, иже перечислены в нашем ЧаВо б) меньше задирать нос. Если же ты с Java давно и опыта достаточно, то мм.. по сути те же самые пункты.
Quote:
просто убило...
Что именно? Мне важно знать, у меня есть нерадивые соседи..
PS: ты не из Делфей к нам пришел случаем? :)


Да, раньше на делфи работал. Насчет примитивов согласен. Просмотрел литературу - моя ошибка, извиняюсь)))
 
 
Сообщения:9474
Угу, так и думал, там, если не изменяет мне память, int и Integer - это одно и то же :)
 
 
Сообщения:4
Quote:
Также динамическую (не-константа) строку можно поместить в кеш с помощью интернирования (сейчас увидите откуда взялось такое слово):
Код:
1 String a = new String("a");
2 String b = "a";
3 String stringFromCache = a.intern();
4 a == stringFromCache == true


Наверное, в последней строке b == StringFromCache == true ?
 
 
Сообщения:9474
Да, спасибо, исправил.
 
 
Сообщения:6978
Староверъ:
Созданы они скорей всего для работы с generics (Map<Integer, Double>), а возможно и просто, чтоб можно было использовать примитивы как объекты, но это не суть важно.


Староверъ, при всем уважении к Вам - ну не пристало человеку Вашего уровня делать в обучающей статье заявления типа "скорее всего", когда их можно проверить.

У этих классов в javadoc указано since: 1.0

http://download.oracle.com/javase/6/docs/api/java/lang/Boolean.html
http://download.oracle.com/javase/6/docs/api/java/lang/Character.html
http://download.oracle.com/javase/6/docs/api/java/lang/Integer.html
http://download.oracle.com/javase/6/docs/api/java/lang/Long.html
http://download.oracle.com/javase/6/docs/api/java/lang/Float.html
http://download.oracle.com/javase/6/docs/api/java/lang/Double.html

У этих - 1.1

http://download.oracle.com/javase/6/docs/api/java/lang/Byte.html
http://download.oracle.com/javase/6/docs/api/java/lang/Short.html

А generics появились только в версии 5.0, о чем Вы тоже прекрасно знаете.

С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
 
 
Сообщения:38
Quote:
А generics появились только в версии 5.0, о чем Вы тоже прекрасно знаете.


То есть получается что эти "ссылочные типы" Integer, Double и т.д. созданы для другого...Поясните пожалуйста, для чего?
Просто чтобы создать набор методов для воздействия на объекты данных типов?
 
 
Сообщения:1539
anbee:
То есть получается что эти "ссылочные типы" Integer, Double и т.д. созданы для другого...Поясните пожалуйста, для чего?
Просто чтобы создать набор методов для воздействия на объекты данных типов?


Чтобы можно было хранить их в коллекциях и картах.

Чтобы получить правильный ответ, нужно задать правильный вопрос.
«Keep in mind You must always be a good ninja!»
 
 
Сообщения:9474
Quote:
Староверъ, при всем уважении к Вам - ну не пристало человеку Вашего уровня делать в обучающей статье заявления типа "скорее всего", когда их можно проверить.
Точного ответа я не знаю, а написать будто я точно знаю, это значит соврать, потому как люди будут верить наслово и не проверять. Да, из твоего поста теперь точно ясно, что не для того добавили они эти классы, чтоб с generics использовать, но и точные цели этих классов я до сих пор не знаю, а выдумывать свои причины не хочется, возможны ошибки в допущениях, и вообще не люблю фантазировать в таких темах. Мне нужны пруфлинки с детальным объяснением и, самое важное, с объяснением почему нельзя было обойтись без этих классов.
Да и в общем не вижу ничего страшного в незнании, я описал все, что смог найти и этим постарался принести пользу, а то, чего не нашел, пошло в разряд "скорей всего". Думаю это лучше, чем ничего. Если найду больше информации, обновлю статью.
 
 
Сообщения:7
Вот что говорится в туториалах:
There are three reasons that you might use a Number object rather than a primitive:
    As an argument of a method that expects an object (often used when manipulating collections of numbers). To use constants defined by the class, such as MIN_VALUE and MAX_VALUE, that provide the upper and lower bounds of the data type. To use class methods for converting values to and from other primitive types, for converting to and from strings, and for converting between number systems (decimal, octal, hexadecimal, binary).
 
 
Сообщения:45
подскажите, пожалуйста, какой наименьший тип достаточный для хранения числа (1/2)^(10^6), в примере ниже это переменная result

result = 1;
for(i=0; i<1000 000; i++){
     result /= 2;
}
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет