-
Qué ha pasado
autoboxing
?Autoboxing es un mecanismo para inicializar implícitamente objetos de clases contenedoras (Byte, Short, Character, Integer, Long, Float, Double) con los valores de sus correspondientes tipos primitivos originales (respectivamente, , , , , , ,
byte
,short
)char
,int
sin usolong
explícito del constructor de clases.float
double
El autoboxing ocurre cuando una primitiva se asigna directamente a una clase contenedora (usando el
=
operador " "), o cuando una primitiva se pasa a los parámetros de un método (como una "clase contenedora"). Tanto las variables de tipos primitivos como las constantes de tiempo de compilación (literales yfinal
-primitivas) se pueden empaquetar automáticamente en "clases contenedoras". En este caso, los literales deben ser sintácticamente correctos para inicializar una variable del tipo primitivo original.El autoboxing de variables de tipos primitivos requiere una coincidencia exacta del tipo de la primitiva original: el tipo de la "clase contenedora". Por ejemplo, intentar autoencuadrar una variable de tipo
byte
enShort
, sin realizar primero una conversión explícita,byte->short
provocará un error de compilación.El autoboxing de constantes de tipo primitivo permite límites de coincidencia más amplios. En este caso, el compilador puede realizar una extensión/estrechamiento implícito de tipos primitivos por adelantado. La transformación se produce en dos etapas:
-
expansión implícita (estrechamiento) del tipo primitivo original al tipo primitivo correspondiente a la clase contenedora (para la conversión
int->Byte
, primero el compilador se limita implícitamenteint
abyte
) -
empaquetado automático de una primitiva en la “clase contenedora” apropiada (el compilador se empaqueta automáticamente
byte->Byte
). sin embargo, en este caso existen dos restricciones adicionales: -
La asignación de una primitiva a un "contenedor" solo se puede realizar usando el
=
operador " " (no se puede pasar dicha primitiva a los parámetros del método sin una conversión de tipo explícita) -
el tipo del operando izquierdo no debe ser anterior a
Character
, el tipo del operando derecho no debe ser anterior a ,int
(se permite la extensión/constricciónbyte <-> short
, y solo el estrechamiento , , todas las demás opciones requieren una conversión de tipo explícita)byte <-> char
short <-> char
byte <- int
short <- int
char <- int
Una característica adicional de las "clases contenedoras" de números enteros creadas mediante constantes de autoboxing en el rango -128 +127 es que la JVM las almacena en caché. Por lo tanto, dichos contenedores con los mismos valores serán referencias a un objeto.
-
-
¿Por qué se utiliza
autoboxing
?Citaré la conferencia:
Como recordarás, Java tiene tanto tipos heredados de la clase
Object
como tipos primitivos. Pero resultó que algo tan conveniente como las colecciones y los genéricos solo puede funcionar con tipos heredados deObject
. -
¿ Alternativas
autoboxing
?Не нашел ответа, но запостил на StackOverFlow.
Исходя из этой дискуссии, получается, что альтернатива
autoboxing
`у это использование примитивных типов, так Cómo использовниеautoboxing
`a снижает производительность. Вывод: использоватьautoboxing
только там где это необходимо.Написана статья про
Autoboxing
: Autoboxing: Traps and Advantages -
Типы-обертки для примитивных типов
mutable
oimmutable
?Immutable
, так Cómo примитивные un objetoы тожеimmutable
. Quéбы работать Cómo сMutable
типом есть классMutableInteger
, и.т.д. -
Как примитивные типы приводятся к непримитивным аналогам?
На этот и последующий вопросы хорошо отвечает вот эта статья: Автоупаковка и распаковка в Java
Это заключение из нее: автоупаковка является механизмом для скрытого преобразования примитивных типов данных в соответствующие классы-оболочки (un objetoы). Компилятор использует метод
valueOf()
чтобы преобразовать примитивные типы в un objetoы, а методыIntValue()
,doubleValue()
и т.д., чтобы получить примитивные типы из un objetoа (то есть обратное преобразование). Автоупаковка преобразует логический типboolean
вBoolean
,byte
вByte
,char
вCharacter
,float
вFloat
,int
вInteger
,long
вLong
,short
вShort
. Распаковка происходит в обратном направлении. -
Как непримитивные типы приводятся к примитивным?
Выше ответил.
-
Как сравниваются примитивные и непримитивные типы?
В лекции это подробно рассматривается, но я нашел так скажем тоже самое, но другими словами.
В Java есть два способа сравнивать un objetoы на es igualство,
==
и методequals()
.==
используется для примитивных типов. Для un objetoов «==
» это исключительно сравнение ссылок. Для остальных случаев нужно использовать методequals()
. Кроме того методhashCode()
служит (в теории) для той же цели. Хорошим тоном считается, если вы переопределoequals()
иhashCode()
. После инициализации неких un objetoов a и b должно выполняться правило:Если выражение
a.equals(b)
вернет true, тоa.hashCode()
должен быть es igualb.hashCode()
. -
Всегда ли создается новый un objeto при операции
autoboxing
?Это в лекциях есть:
Когда мы присваиваем переменной типа Integer significado типа
int
, при этом вызывается методInteger.valueOf
: функцияvalueOf
не всегда создает новый un objeto типа Integer. Она кэширует значения от -128 до 127.Если передаваемое significado выходит за эти пределы, то новый un objeto создается, а если нет, то нет.
Если мы пишем
new Integer()
, то гарантированно создается новый un objeto. Если мы вызываемInteger.valueOf()
, явно o приautoboxing
, то этот метод может вернуть для нас Cómo новый un objeto, так и отдать un objeto из кэша, если переданное число лежит в диапазоне от -128 до 127. -
Как работает кэширование при операции
autoboxing
?Ответил в вопросе выше, на всякий случай создал вопрос на StackOverFlow, но там отвечают тоже самое
-
Для Cómoих типов и/o значений работает кэширование?
В восьмом вопросе. Если у кого – то есть соображения на тему трех последних вопросов, то напишите в комментариях.
DefNeo
Nivel 36
GO TO FULL VERSION