JavaRush /Blogue Java /Random-PT /Nível 29. Respostas às perguntas da entrevista sobre o tó...
DefNeo
Nível 36

Nível 29. Respostas às perguntas da entrevista sobre o tópico do nível

Publicado no grupo Random-PT
Nível 29. Respostas às perguntas da entrevista sobre o tema do nível - 1
  1. O que aconteceu autoboxing?

    Autoboxing é um mecanismo para inicializar implicitamente objetos de classes wrapper (Byte, Short, Character, Integer, Long, Float, Double) com os valores de seus tipos primitivos originais correspondentes (respectivamente, , , , , , , byte, short) char, intsem uso longexplícito do construtor de classe.floatdouble

    Autoboxing ocorre quando uma primitiva é atribuída diretamente a uma classe wrapper (usando o =operador " "), ou quando uma primitiva é passada para os parâmetros de um método (como uma "classe wrapper"). Tanto variáveis ​​de tipos primitivos quanto constantes de tempo de compilação (literais e final-primitivos) podem ser empacotadas automaticamente em “classes wrapper”. Neste caso, os literais devem estar sintaticamente corretos para inicializar uma variável do tipo primitivo original.

    A caixa automática de variáveis ​​​​de tipos primitivos requer uma correspondência exata do tipo da primitiva original - o tipo da “classe wrapper”. Por exemplo, tentar colocar automaticamente uma variável de tipo byteem Short, sem primeiro fazer uma conversão explícita, byte->shortcausará um erro de compilação.

    A caixa automática de constantes de tipo primitivo permite limites de correspondência mais amplos. Nesse caso, o compilador é capaz de realizar extensão/estreitamento implícito de tipos primitivos antecipadamente. A transformação ocorre em duas etapas:

    1. expansão implícita (estreitamento) do tipo primitivo original para o tipo primitivo correspondente à classe wrapper (para conversão int->Byte, primeiro o compilador restringe implicitamente intpara byte)

    2. empacotamento automático de um primitivo na “classe wrapper” apropriada (o compilador autopacks byte->Byte). no entanto, neste caso existem duas restrições adicionais:

      • a atribuição de um primitivo a um “wrapper” só pode ser feita usando o =operador “ ” (você não pode passar tal primitivo para parâmetros de método sem conversão explícita de tipo)

      • o tipo do operando esquerdo não deve ser anterior a Character, o tipo do operando direito não deve ser anterior a int, (extensão/constrição é permitida byte <-> short, byte <-> char, short <-> char
        e apenas estreitamento byte <- int, short <- int, char <- int, todas as outras opções requerem conversão de tipo explícita)

    Um recurso adicional de "classes wrapper" inteiras criadas por constantes de autoboxing no intervalo -128 +127 é que elas são armazenadas em cache pela JVM. Portanto, esses wrappers com os mesmos valores serão referências ao mesmo objeto.

  2. Por que é usado autoboxing?

    Vou citar a palestra:

    Como você se lembra, Java possui tipos herdados da classe Objecte tipos primitivos. Mas, como se viu, algo tão conveniente como coleções e genéricos só pode funcionar com tipos herdados de Object.

  3. Alternativas 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 значений работает кэширование?

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

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION