JavaRush /Blog Java /Random-PL /Poziom 29. Odpowiedzi na pytania podczas rozmowy kwalifik...
DefNeo
Poziom 36

Poziom 29. Odpowiedzi na pytania podczas rozmowy kwalifikacyjnej na temat poziomu

Opublikowano w grupie Random-PL
Poziom 29. Odpowiedzi na pytania z rozmowy kwalifikacyjnej na temat poziomu - 1
  1. Co się stało autoboxing?

    Autoboxing to mechanizm niejawnej inicjalizacji obiektów klas opakowań (Byte, Short, Character, Integer, Long, Float, Double) wartościami odpowiadających im oryginalnych typów pierwotnych (odpowiednio , , , , , , byte, short) char, intbez longjawne floatużycie doublekonstruktora klasy.

    Autoboxing ma miejsce, gdy element podstawowy jest bezpośrednio przypisany do klasy opakowania (za pomocą =operatora „ ”) lub gdy element podstawowy jest przekazywany do parametrów metody (takich jak „klasa opakowania”). Zarówno zmienne typów pierwotnych, jak i stałe czasu kompilacji (literały i final-prymitywy) mogą być automatycznie pakowane w „klasy opakowujące”. W tym przypadku literały muszą być poprawne składniowo, aby zainicjować zmienną pierwotnego typu pierwotnego.

    Autoboxing zmiennych typów pierwotnych wymaga dokładnego dopasowania typu pierwotnego prymitywu - typu „klasy opakowania”. Na przykład próba automatycznego włączenia zmiennej typu bytedo Shortbez uprzedniego jawnego rzutowania byte->shortspowoduje błąd kompilacji.

    Automatyczne pakowanie stałych typu pierwotnego pozwala na szersze dopasowanie. W takim przypadku kompilator jest w stanie z wyprzedzeniem wykonać niejawne rozszerzanie/zawężanie typów pierwotnych. Transformacja przebiega w dwóch etapach:

    1. niejawne rozwinięcie (zawężenie) oryginalnego typu pierwotnego do typu pierwotnego odpowiadającego klasie opakowania (w celu konwersji int->Bytenajpierw kompilator domyślnie zawęża się intdo byte)

    2. automatyczne pakowanie prymitywu do odpowiedniej „klasy opakowania” (kompilator autopakuje byte->Byte). jednak w tym przypadku istnieją dwa dodatkowe ograniczenia:

      • przypisanie prymitywu do „opakowania” można wykonać tylko za pomocą =operatora „ ” (nie można przekazać takiego prymitywu do parametrów metody bez jawnego rzutowania typu)

      • typ lewego operandu nie może być starszy niż Character, typ prawego operandu nie może być starszy niż int, (dozwolone jest rozszerzanie/zawężanie byte <-> short, byte <-> char, short <-> char
        i tylko zawężanie byte <- int, short <- int, char <- int, wszystkie inne opcje wymagają jawnego rzutowania typu)

    Dodatkową cechą całkowitych „klas opakowań” utworzonych przez stałe autoboxingu z zakresu -128 +127 jest to, że są one buforowane przez maszynę JVM. Dlatego takie wrappery o tych samych wartościach będą referencjami do jednego obiektu.

  2. Dlaczego jest używany autoboxing?

    Zacytuję wykład:

    Jak pamiętasz, w Javie oba typy są dziedziczone z klasy Objecti typów pierwotnych. Ale, jak się okazało, tak wygodna rzecz, jak kolekcje i typy generyczne, może działać tylko z typami odziedziczonymi z Object.

  3. Альтернативы autoboxing?

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

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

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

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

    Immutable, так Jak примитивные obiektы тоже immutable. Coбы работать Jak с Mutable типом есть класс MutableInteger, и.т.д.

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

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

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

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

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

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

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

    В Java есть два способа сравнивать obiektы на równa sięство, == и метод equals().

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

    Если выражение a.equals(b) вернет true, то a.hashCode() должен быть równa się b.hashCode().

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

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

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

    Если передаваемое oznaczający выходит за эти пределы, то новый obiekt создается, а если нет, то нет.

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

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

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

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

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

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