JavaRush /Java 博客 /Random-ZH /第 29 级。有关该级别主题的面试问题的答案
DefNeo
第 36 级

第 29 级。有关该级别主题的面试问题的答案

已在 Random-ZH 群组中发布
第 29 级。有关第 1 级主题的面试问题的答案
  1. 发生了什么事autoboxing

    自动装箱byte是一种用其对应的原始基本类型(分别为 、 、 、 、 、 、 、)的值隐式初始化包装类(Byte、Short、Character、Integer、Long、Float、Double)对象的机制shortcharint无需long显式float使用double类构造函数。

    当将原语直接分配给包装类(使用“ =”运算符)时,或者将原语传递到方法的参数(例如“包装类”)时,就会发生自动装箱。基元类型的变量和编译时常量(文字和final基元)都可以自动打包到“包装类”中。在这种情况下,文字必须在语法上正确才能初始化原始基本类型的变量。

    原始类型变量的自动装箱需要与原始原始类型(“包装类”的类型)完全匹配。例如,尝试将类型变量自动装箱byte到 中Short而不首先进行显式转换,byte->short将导致编译错误。

    原始类型常量的自动装箱允许更宽的匹配边界。在这种情况下,编译器能够提前执行基元类型的隐式扩展/缩小。转变发生在两个阶段:

    1. 将原始基元类型隐式扩展(缩小)为包装类对应的基元类型(对于转换int->Byte,首先编译器隐式缩小intbyte

    2. 将原语自动打包到适当的“包装类”(编译器自动打包byte->Byte)。但是,在这种情况下还有两个额外的限制:

      • 将原语分配给“包装器”只能使用“ =”运算符来完成(如果没有显式类型转换,则无法将这样的原语传递给方法参数)

      • 左操作数的类型不得早于Character,右操作数的类型不得早于int, (允许扩展/收缩byte <-> short, byte <-> char,short <-> char
        并且仅缩小byte <- int, short <- int, char <- 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