-
发生了什么事
autoboxing
?自动装箱
byte
是一种用其对应的原始基本类型(分别为 、 、 、 、 、 、 、)的值隐式初始化包装类(Byte、Short、Character、Integer、Long、Float、Double)对象的机制short
,char
而int
无需long
显式float
使用double
类构造函数。当将原语直接分配给包装类(使用“
=
”运算符)时,或者将原语传递到方法的参数(例如“包装类”)时,就会发生自动装箱。基元类型的变量和编译时常量(文字和final
基元)都可以自动打包到“包装类”中。在这种情况下,文字必须在语法上正确才能初始化原始基本类型的变量。原始类型变量的自动装箱需要与原始原始类型(“包装类”的类型)完全匹配。例如,尝试将类型变量自动装箱
byte
到 中Short
而不首先进行显式转换,byte->short
将导致编译错误。原始类型常量的自动装箱允许更宽的匹配边界。在这种情况下,编译器能够提前执行基元类型的隐式扩展/缩小。转变发生在两个阶段:
-
将原始基元类型隐式扩展(缩小)为包装类对应的基元类型(对于转换
int->Byte
,首先编译器隐式缩小int
为byte
) -
将原语自动打包到适当的“包装类”(编译器自动打包
byte->Byte
)。但是,在这种情况下还有两个额外的限制: -
将原语分配给“包装器”只能使用“
=
”运算符来完成(如果没有显式类型转换,则无法将这样的原语传递给方法参数) -
左操作数的类型不得早于
Character
,右操作数的类型不得早于int
, (允许扩展/收缩byte <-> short
,byte <-> char
,short <-> char
并且仅缩小byte <- int
,short <- int
,char <- int
,所有其他选项都需要显式类型转换)
由 -128 +127 范围内的自动装箱常量创建的整数“包装类”的另一个功能是它们由 JVM 缓存。因此,此类具有相同值的包装器将是对一个对象的引用。
-
-
为什么使用它
autoboxing
?我引用一下演讲内容:
正如您所记得的,Java 既有从类继承的类型
Object
,也有原始类型。但是,事实证明,像集合和泛型这样方便的东西只能与继承自 的类型一起使用Object
。 -
备择方案
autoboxing
?Не нашел ответа, но запостил на StackOverFlow.
Исходя из этой дискуссии, получается, что альтернатива
autoboxing
`у это использование примитивных типов, так How использовниеautoboxing
`a снижает производительность. Вывод: использоватьautoboxing
только там где это необходимо.Написана статья про
Autoboxing
: Autoboxing: Traps and Advantages -
Типы-обертки для примитивных типов
mutable
orimmutable
?Immutable
, так How примитивные an objectы тожеimmutable
. Whatбы работать How сMutable
типом есть классMutableInteger
, и.т.д. -
Как примитивные типы приводятся к непримитивным аналогам?
На этот и последующий вопросы хорошо отвечает вот эта статья: Автоупаковка и распаковка в Java
Это заключение из нее: автоупаковка является механизмом для скрытого преобразования примитивных типов данных в соответствующие классы-оболочки (an objectы). Компилятор использует метод
valueOf()
чтобы преобразовать примитивные типы в an objectы, а методыIntValue()
,doubleValue()
и т.д., чтобы получить примитивные типы из an object (то есть обратное преобразование). Автоупаковка преобразует логический типboolean
вBoolean
,byte
вByte
,char
вCharacter
,float
вFloat
,int
вInteger
,long
вLong
,short
вShort
. Распаковка происходит в обратном направлении. -
Как непримитивные типы приводятся к примитивным?
Выше ответил.
-
Как сравниваются примитивные и непримитивные типы?
В лекции это подробно рассматривается, но я нашел так скажем тоже самое, но другими словами.
В Java есть два способа сравнивать an objectы на equalsство,
==
и методequals()
.==
используется для примитивных типов. Для an objectов «==
» это исключительно сравнение ссылок. Для остальных случаев нужно использовать методequals()
. Кроме того методhashCode()
служит (в теории) для той же цели. Хорошим тоном считается, если вы переопределorequals()
иhashCode()
. После инициализации неких an objectов a и b должно выполняться правило:Если выражение
a.equals(b)
вернет true, тоa.hashCode()
должен быть equalsb.hashCode()
. -
Всегда ли создается новый an object при операции
autoboxing
?Это в лекциях есть:
Когда мы присваиваем переменной типа Integer meaning типа
int
, при этом вызывается методInteger.valueOf
: функцияvalueOf
не всегда создает новый an object типа Integer. Она кэширует значения от -128 до 127.Если передаваемое meaning выходит за эти пределы, то новый an object создается, а если нет, то нет.
Если мы пишем
new Integer()
, то гарантированно создается новый an object. Если мы вызываемInteger.valueOf()
, явно or приautoboxing
, то этот метод может вернуть для нас How новый an object, так и отдать an object из кэша, если переданное число лежит в диапазоне от -128 до 127. -
Как работает кэширование при операции
autoboxing
?Ответил в вопросе выше, на всякий случай создал вопрос на StackOverFlow, но там отвечают тоже самое
-
Для Howих типов и/or значений работает кэширование?
В восьмом вопросе. Если у кого – то есть соображения на тему трех последних вопросов, то напишите в комментариях.
DefNeo
第 36 级
GO TO FULL VERSION