JavaRush /Java Blog /Random-JA /レベル 29. レベルのトピックに関するインタビューの質問への回答
DefNeo
レベル 36

レベル 29. レベルのトピックに関するインタビューの質問への回答

Random-JA グループに公開済み
レベル 29. レベル - 1 のトピックに関するインタビューの質問への回答
  1. どうしたのautoboxing

    オートボクシングはbyte、ラッパー クラス (Byte、Short、Character、Integer、Long、Float、Double) のオブジェクトを、対応する元のプリミティブ型 (それぞれ、、、、、、、、、、、 )shortの値で暗黙的に初期化するメカニズムですchar。クラス コンストラクターの明示的な使用。intlongfloatdouble

    オートボックス化は、プリミティブがラッパー クラスに直接割り当てられるとき (" =" 演算子を使用)、またはプリミティブがメソッドのパラメーター (「ラッパー クラス」など) に渡されるときに発生します。プリミティブ型の変数とコンパイル時定数 (リテラルとfinal-プリミティブ) の両方を「ラッパー クラス」に自動パックできます。この場合、元のプリミティブ型の変数を初期化するには、リテラルが構文的に正しい必要があります。

    プリミティブ型の変数のオートボックス化には、元のプリミティブの型、つまり「ラッパー クラス」の型が完全に一致する必要があります。たとえば、最初に明示的なキャストを行わずに型変数byteを にオートボックス化しようとすると、コンパイル エラーが発生します。Shortbyte->short

    プリミティブ型定数のオートボックス化により、より広い一致境界が可能になります。この場合、コンパイラはプリミティブ型の暗黙的な拡張/絞り込みを事前に実行できます。変換は 2 つの段階で行われます。

    1. 元のプリミティブ型をラッパー クラスに対応するプリミティブ型に暗黙的に拡張 (絞り込み) (変換の場合int->Byte、コンパイラは最初に暗黙的intに に絞り込みますbyte)

    2. プリミティブを適切な「ラッパー クラス」に自動パッキングします (コンパイラー autopacks byte->Byte)。ただし、この場合、追加の制限が 2 つあります。

      • 「ラッパー」へのプリミティブの代入は、「=」演算子を使用してのみ行うことができます (明示的な型キャストを行わないと、このようなプリミティブをメソッド パラメーターに渡すことはできません)。

      • 左側のオペランドの型は よりも古いものであってはならずCharacter、右側のオペランドの型は よりも古いものであってはなりませんint(拡張/縮小は 、 、縮小のみが許可されますbyte <-> shortbyte <-> charshort <-> char
        byte <- intすべてshort <- intchar <- intオプションには明示的な型キャストが必要です)。

    -128 +127 の範囲のオートボクシング定数によって作成される整数「ラッパー クラス」の追加機能は、それらが JVM によってキャッシュされることです。したがって、同じ値を持つそのようなラッパーは 1 つのオブジェクトへの参照になります。

  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