Java core:
1. What is the difference between Integer and int? В чем разница между Integer и int?
Integer – это объектный тип, int – это примитивный тип.
Integer – это объектная оболочка над int.
В целом понятно, что Integer надо использовать только тогда, когда без него не обойтись. Один из таких примеров — это параметризованные типы (generics), к примеру, стандартные коллекции. Но и тут надо быть аккуратным, чтобы использовать память разумно.
Недостаток примитивных типов — это отсутствие методов у них, этот недостаток решается объектными оболочками над примитивными типами.
Ссылки:
Хабр
тыц
2. What is boxing and unboxing? Что такое упаковка и распаковка?
Создание объекта-оболочки из переменной примитивного типа называется упаковкой (boxing), а получение значения примитивного типа из объекта-оболочки — распаковкой. Объектам-оболочкам можно присваивать значения примитивных типов, а переменным примитивных типов — значения переменных-оболочек, при этом при необходимости автоматически создаются объекты-оболочки с соответствующими значениями (автоупаковка) или наоборот, примитивные значения извлекаются из оболочек (автораспаковка):
1 2 3 4 |
int a = 5; Integer b = 10; a = b; // OK, атораспаковка b = a * 123; // OK, автоупаковка |
3. Can the class have both methods: void foo(Integer a); void foo(int a);? Может ли класс иметь оба метода: void foo (Integer a); void foo (int a) ;?
Да может. Такой метод будет перегружаться.
1 2 3 4 5 6 7 8 9 10 11 |
public class Main { public static void foo(int i){ System.out.print(i);} public static void foo(Integer i){ System.out.print(i);} public static void main(String[] args) { Main.foo(5); //int Main.foo(new Integer(6)); //Integer } } |
4. What is mutable and immutable class? Provide examples (String, Integer – immutable, StringBuilder – mutable). Что такое изменяемый и неизменяемый класс? Укажите примеры (String, Integer — immutable (неизменяемый), StringBuilder — mutable (изменяемый)?
Immutable объект — это объект, состояние которого после создания невозможно изменить. В случае Java это значит что все поля экземпляра у класс отмечены как final и являются примитивами или тоже immutable типами.
1 2 3 4 5 6 7 8 9 10 11 |
public class ImmutablePoint { private final int x; private final int y; private final String description; public ImmutablePoint(int x, int y, String description) { this.x = x; this.y = y; this.description = description; } } |
После создания экземпляра ImmutablePoint его модификация невозможна.
Простейший пример immutable класса из JDK это String. Любые методы, которые вы вызовите на строке (например description.toLowerCase()) вернут новую строку, а не модифицируют исходную.
Пример mutable класс из JDK — Date. Например myDate.setHours(x) модифицирует сам экземпляр myDate!
В случае многопоточного программирования преимущества immutable классов очевидны: после создания объекты можно передавать другим потокам и они всегда будут в актуальном состоянии. Т.е. вам не надо проверять не устарело ли состояние вашего экземпляра и не модифицировал ли его другой поток пока вы с ним работаете. Например, у вас есть метод bill(Date endDate), в нём вы наивно проверяете соответствие endDate каким-то предварительным условиям и начинаете с ней работать. В этот момент другой поток может изменить endDate, например установит её глубоко в прошлое. Последствия могут быть самыми удивительными.
5. What are StringBuilder and StringBuffer used for? Для чего используются StringBuilder и StringBuffer?
Класс String является immutable — Вы не можете модифицировать объект String, но можете заменить его созданием нового экземпляра. Создание нового экземпляра обходится дороговато:
1 2 3 4 5 6 7 |
//Inefficient version using immutable String String output = "Some text"; int count = 100; for(int i =0; i<count; i++) { output += i; } return output; |
Кусок кода, в примере выше создаст 99 новых объектов String, 98 из которых будут тут же откинуты. Создание новых объектов неэффективно.
StringBuffer/StringBuilder
Класс StringBuffer является mutable — использовать StringBuffer или StringBuilder следует тогда, когда вы хотите модифицировать содержимое. StringBuilder был добавлен в пятой джаве и он во всем идентичен классу StringBuffer, за исключением того, что он не синхронизирован, что делает его значительно шустрее. Но цена скорости — небезопасное поведение в мультипоточной среде.
1 2 3 4 5 6 7 8 |
//More efficient version using mutable StringBuffer // set an initial size of 110 StringBuffer output = new StringBuffer(110); output.append("Some text"); for(int i =0; i<count; i++) { output.append(i); } return output.toString(); |
Вышеуказанный код создает только два новых объекта, StringBuffer и строковую константу, которая возвращается. StringBuffer расширяется по мере надобности, что, в свою очередь дороговато, так что лучше инициализировать StringBuffer корректным значением размера.