JavaRush /Java Blog /Random-TW /第 29 級。有關該級別主題的面試問題的答案
DefNeo
等級 36

第 29 級。有關該級別主題的面試問題的答案

在 Random-TW 群組發布
第 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