JavaRush /Java Blog /Random-KO /레벨 29. 레벨 주제에 대한 인터뷰 질문에 대한 답변
DefNeo
레벨 36

레벨 29. 레벨 주제에 대한 인터뷰 질문에 대한 답변

Random-KO 그룹에 게시되었습니다
레벨 29. 레벨-1 주제에 관한 인터뷰 질문에 대한 답변
  1. 무슨 일이 일어났나요 autoboxing?

    오토박싱은byte 래퍼 클래스(Byte, Short, Character, Integer, Long, Float, Double)의 객체를 해당 원래 기본 유형(각각, , , , , , , short) 의 값으로 암시적으로 초기화하는 메커니즘 입니다 char. 클래스 생성자를 명시적으로 사용합니다 .intlongfloatdouble

    오토박싱은 기본 요소가 래퍼 클래스에 직접 할당될 때(" =" 연산자 사용) 또는 기본 요소가 메서드의 매개 변수(예: "래퍼 클래스")에 전달될 때 발생합니다. 기본 유형의 변수와 컴파일 시간 상수(리터럴 및 final-프리미티브) 모두 "래퍼 클래스"에 자동으로 묶일 수 있습니다. 이 경우 원래 기본 유형의 변수를 초기화하려면 리터럴의 구문이 정확해야 합니다.

    기본 유형의 변수를 자동 박싱하려면 원래 기본 유형, 즉 "래퍼 클래스" 유형과 정확히 일치해야 합니다. 예를 들어, 명시적인 캐스트를 먼저 수행하지 않고 유형 변수를 byte에 자동 박싱하려고 하면 컴파일 오류가 발생합니다.Shortbyte->short

    기본 유형 상수의 자동 박싱을 사용하면 더 넓은 일치 경계가 가능합니다. 이 경우 컴파일러는 기본 유형의 암시적 확장/축소를 미리 수행할 수 있습니다. 변환은 두 단계로 발생합니다.

    1. 원래 기본 유형을 래퍼 클래스에 해당하는 기본 유형으로 암시적으로 확장(축소)합니다. (변환을 위해 int->Byte먼저 컴파일러는 암시적 int으로 로 좁힙니다 byte.)

    2. 프리미티브를 적절한 “래퍼 클래스”로 자동 패킹합니다(컴파일러는 autopacks byte->Byte). 그러나 이 경우 두 가지 추가 제한 사항이 있습니다.

      • "래퍼"에 기본 요소를 할당하는 것은 " =" 연산자를 통해서만 수행할 수 있습니다. (명시적인 유형 캐스팅 없이는 이러한 기본 요소를 메서드 매개 변수에 전달할 수 없습니다.)

      • 왼쪽 피연산자의 유형은 보다 오래되어서는 안 되며 , Character오른쪽 피연산자의 유형은 보다 오래되어서는 안 됩니다 int. (확장/수축은 허용되며 byte <-> short, , 축소만 허용됩니다 . 다른 모든 옵션에는 명시적인 유형 캐스팅이 필요합니다.)byte <-> charshort <-> char
        byte <- intshort <- intchar <- int

    -128 +127 범위의 상수를 자동박싱하여 생성된 정수 "래퍼 클래스"의 추가 기능은 JVM에 의해 캐시된다는 것입니다. 따라서 동일한 값을 가진 래퍼는 하나의 개체에 대한 참조가 됩니다.

  2. 왜 사용됩니까 autoboxing?

    강의 내용을 인용하겠습니다.

    기억하는 것처럼 Java에는 클래스 Object와 기본 유형에서 상속된 유형이 모두 있습니다. 그러나 결과적으로 컬렉션 및 제네릭과 같은 편리한 기능은 Object.

  3. Альтернативы autoboxing?

    Не нашел ответа, но запостил на StackOverFlow.

    Исходя из этой дискуссии, получается, что альтернатива autoboxing`у это использование примитивных типов, так How использовние autoboxing`a снижает производительность. Вывод: использовать autoboxing только там где это необходимо.

    Написана статья про Autoboxing: Autoboxing: Traps and Advantages

  4. Типы-обертки для примитивных типов mutable or immutable?

    Immutable, так How примитивные an objectы тоже immutable. Whatбы работать How с Mutable типом есть класс MutableInteger, и.т.д.

  5. Как примитивные типы приводятся к непримитивным аналогам?

    На этот и последующий вопросы хорошо отвечает вот эта статья: Автоупаковка и распаковка в Java

    Это заключение из нее: автоупаковка является механизмом для скрытого преобразования примитивных типов данных в соответствующие классы-оболочки (an objectы). Компилятор использует метод valueOf() чтобы преобразовать примитивные типы в an objectы, а методы IntValue(), doubleValue() и т.д., чтобы получить примитивные типы из an object (то есть обратное преобразование). Автоупаковка преобразует логический тип boolean в Boolean, byte в Byte, char в Character, float в Float, int в Integer, long в Long, short в Short. Распаковка происходит в обратном направлении.

  6. Как непримитивные типы приводятся к примитивным?

    Выше ответил.

  7. Как сравниваются примитивные и непримитивные типы?

    В лекции это подробно рассматривается, но я нашел так скажем тоже самое, но другими словами.

    В Java есть два способа сравнивать an objectы на equalsство, == и метод equals().

    == используется для примитивных типов. Для an objectов «==» это исключительно сравнение ссылок. Для остальных случаев нужно использовать метод equals(). Кроме того метод hashCode() служит (в теории) для той же цели. Хорошим тоном считается, если вы переопределor equals() и hashCode(). После инициализации неких an objectов a и b должно выполняться правило:

    Если выражение a.equals(b) вернет true, то a.hashCode() должен быть equals b.hashCode().

  8. Всегда ли создается новый 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.

  9. Как работает кэширование при операции autoboxing?

    Ответил в вопросе выше, на всякий случай создал вопрос на StackOverFlow, но там отвечают тоже самое

  10. Для Howих типов и/or значений работает кэширование?

    В восьмом вопросе. Если у кого – то есть соображения на тему трех последних вопросов, то напишите в комментариях.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION