JavaRush /Blog Java /Random-ES /Nivel 29. Respuestas a las preguntas de la entrevista sob...
DefNeo
Nivel 36

Nivel 29. Respuestas a las preguntas de la entrevista sobre el tema del nivel.

Publicado en el grupo Random-ES
Nivel 29. Respuestas a las preguntas de la entrevista sobre el tema del nivel - 1
  1. Qué ha pasado autoboxing?

    Autoboxing es un mecanismo para inicializar implícitamente objetos de clases contenedoras (Byte, Short, Character, Integer, Long, Float, Double) con los valores de sus correspondientes tipos primitivos originales (respectivamente, , , , , , , byte, short) char, intsin uso longexplícito del constructor de clases.floatdouble

    El autoboxing ocurre cuando una primitiva se asigna directamente a una clase contenedora (usando el =operador " "), o cuando una primitiva se pasa a los parámetros de un método (como una "clase contenedora"). Tanto las variables de tipos primitivos como las constantes de tiempo de compilación (literales y final-primitivas) se pueden empaquetar automáticamente en "clases contenedoras". En este caso, los literales deben ser sintácticamente correctos para inicializar una variable del tipo primitivo original.

    El autoboxing de variables de tipos primitivos requiere una coincidencia exacta del tipo de la primitiva original: el tipo de la "clase contenedora". Por ejemplo, intentar autoencuadrar una variable de tipo byteen Short, sin realizar primero una conversión explícita, byte->shortprovocará un error de compilación.

    El autoboxing de constantes de tipo primitivo permite límites de coincidencia más amplios. En este caso, el compilador puede realizar una extensión/estrechamiento implícito de tipos primitivos por adelantado. La transformación se produce en dos etapas:

    1. expansión implícita (estrechamiento) del tipo primitivo original al tipo primitivo correspondiente a la clase contenedora (para la conversión int->Byte, primero el compilador se limita implícitamente inta byte)

    2. empaquetado automático de una primitiva en la “clase contenedora” apropiada (el compilador se empaqueta automáticamente byte->Byte). sin embargo, en este caso existen dos restricciones adicionales:

      • La asignación de una primitiva a un "contenedor" solo se puede realizar usando el =operador " " (no se puede pasar dicha primitiva a los parámetros del método sin una conversión de tipo explícita)

      • el tipo del operando izquierdo no debe ser anterior a Character, el tipo del operando derecho no debe ser anterior a , int(se permite la extensión/constricción byte <-> short, y solo el estrechamiento , , todas las demás opciones requieren una conversión de tipo explícita)byte <-> charshort <-> char
        byte <- intshort <- intchar <- int

    Una característica adicional de las "clases contenedoras" de números enteros creadas mediante constantes de autoboxing en el rango -128 +127 es que la JVM las almacena en caché. Por lo tanto, dichos contenedores con los mismos valores serán referencias a un objeto.

  2. ¿Por qué se utiliza autoboxing?

    Citaré la conferencia:

    Como recordarás, Java tiene tanto tipos heredados de la clase Objectcomo tipos primitivos. Pero resultó que algo tan conveniente como las colecciones y los genéricos solo puede funcionar con tipos heredados de Object.

  3. ¿ Alternativas autoboxing?

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

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

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

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

    Immutable, так Cómo примитивные un objetoы тоже immutable. Quéбы работать Cómo с Mutable типом есть класс MutableInteger, и.т.д.

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

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

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

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

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

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

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

    В Java есть два способа сравнивать un objetoы на es igualство, == и метод equals().

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

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

  8. Всегда ли создается новый un objeto при операции autoboxing?

    Это в лекциях есть:

    Когда мы присваиваем переменной типа Integer significado типа int, при этом вызывается метод Integer.valueOf: функция valueOf не всегда создает новый un objeto типа Integer. Она кэширует значения от -128 до 127.

    Если передаваемое significado выходит за эти пределы, то новый un objeto создается, а если нет, то нет.

    Если мы пишем new Integer(), то гарантированно создается новый un objeto. Если мы вызываем Integer.valueOf(), явно o при autoboxing, то этот метод может вернуть для нас Cómo новый un objeto, так и отдать un objeto из кэша, если переданное число лежит в диапазоне от -128 до 127.

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

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

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

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

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION