-
무슨 일이 일어났나요
autoboxing
?오토박싱은
byte
래퍼 클래스(Byte, Short, Character, Integer, Long, Float, Double)의 객체를 해당 원래 기본 유형(각각, , , , , , ,short
) 의 값으로 암시적으로 초기화하는 메커니즘 입니다char
. 클래스 생성자를 명시적으로 사용합니다 .int
long
float
double
오토박싱은 기본 요소가 래퍼 클래스에 직접 할당될 때("
=
" 연산자 사용) 또는 기본 요소가 메서드의 매개 변수(예: "래퍼 클래스")에 전달될 때 발생합니다. 기본 유형의 변수와 컴파일 시간 상수(리터럴 및final
-프리미티브) 모두 "래퍼 클래스"에 자동으로 묶일 수 있습니다. 이 경우 원래 기본 유형의 변수를 초기화하려면 리터럴의 구문이 정확해야 합니다.기본 유형의 변수를 자동 박싱하려면 원래 기본 유형, 즉 "래퍼 클래스" 유형과 정확히 일치해야 합니다. 예를 들어, 명시적인 캐스트를 먼저 수행하지 않고 유형 변수를
byte
에 자동 박싱하려고 하면 컴파일 오류가 발생합니다.Short
byte->short
기본 유형 상수의 자동 박싱을 사용하면 더 넓은 일치 경계가 가능합니다. 이 경우 컴파일러는 기본 유형의 암시적 확장/축소를 미리 수행할 수 있습니다. 변환은 두 단계로 발생합니다.
-
원래 기본 유형을 래퍼 클래스에 해당하는 기본 유형으로 암시적으로 확장(축소)합니다. (변환을 위해
int->Byte
먼저 컴파일러는 암시적int
으로 로 좁힙니다byte
.) -
프리미티브를 적절한 “래퍼 클래스”로 자동 패킹합니다(컴파일러는 autopacks
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