вторник, 27 сентября 2016 г.

'a' > 'A'

int compareTo(T object)
Метод compareTo принадлежит интерфейсу Comparable<T>.
Обычно результат метода сравнивают с нулем. И считать возвращаемое значение совершенно не обязательно. Однако метод всегда возвращает определенное число. Как оно вычисляется? 
"hello, World".compareTo("Hello, World") = 32
Для класса String метод выполняет лексиграфическое сравнение. Он остановится в первом месте, где строки имеют различные буквы. В данном примере строки отличаются уже в первой позиции. 

Результат, возвращаемый методом, будет равен: 
Unicode значение слева - Unicode значение справа

Для этого хорошо бы знать английский алфавит, а также то, что Unicode значение любой буквы в нижнем регистре всегда на 32 больше, чем Unicode значение этой же буквы в верхнем регистре. То есть, 
'h' - 'H' = 'a' - 'A' = 32

суббота, 17 сентября 2016 г.

StringBuilder.ensureCapacity()

StringBuilder sb = new StringBuilder(); // 1
sb.ensureCapacity(100);                 // 2
sb.ensureCapacity(200);                 // 3
sb.ensureCapacity(300);                 // 4
System.out.println(sb.capacity());      // 5

Чему будет равно capacity после выполнения 4-ой строки кода?
Самый популярный ответ - 300. Неправильный!
Верный ответ - 406. Random, подумаете вы? :)

Согласно JLS метод имеет четкий алгоритм, который все объясняет.

Если передаваемое значение меньше текущего capacity, то оно будет пересчитано.
1) Новое capacity станет равным = текущее capacity * 2 + 2
2) Но если полученное значение меньше переданного аргумента, то текущее capacity станет равно переданному значению.

// 1
При создании пустого объекта capacity = 16.

// 2
Далее по алгоритму. Текущее capacity = 16, необходимо умножить его на два и прибавить 2.
16 * 2 + 2 = 34.
Теперь сравним полученное значение с переданным.
34 < 100
Значит, capacity = 100.

// 3
100 * 2 + 2 = 202.
202 больше, чем переданное значение. Значит, capacity станет равным 202.

// 4
202 * 2 + 2 = 406.
406 > 300
Вот почему в 5-ой строчке печатается 406.

Внимание, если передать отрицательное число, то capacity не пересчитывается.

пятница, 16 сентября 2016 г.

Из массива в список и наоборот

Вечер пятницы. А меня волнует вопрос, как преобразовать массив в список и назад. Это нормально.

Arrays.asList()
Collection.toArray()

Назовете ли вы эти методы сходу? Знаете, что один из них static, второй - object?

static List<T> list = Arrays.asList(T... array);
Метод вернет список фиксированного размера - это означает, что нельзя добавить новый элемент в список. Также список и массив будут "связаны" - изменения в одном отразятся на другом.


Object[] toArray();
Метод можно вызывать у любой коллекции. Вернет массив, содержащий все элементы текущей коллекции.


T[] toArray(T[] array);
Метод можно вызывать у любой коллекции. Вернет массив, содержащий все элементы текущей коллекции. Если array = null, то будет NullPointerException. Часто передают массив размера 0, например, new Integer[0]. Если передать массив, размер которого меньше, чем число элементов коллекции, то размер массива автоматически увеличится в runtime.

вторник, 22 марта 2016 г.

Чизкейк без выпечки

Чизкейк по этому рецепту без выпечки получается удивительно мягким, с нежной кремовой текстурой.

среда, 16 декабря 2015 г.

Украшаем дом к Новому году!



Абсолютно спонтанно возникло сильное желание украсить дом к Новому году. И сразу же я решила не терять ни минуты и начала искать способы, как это сделать красиво и в то же время доступно.

среда, 11 ноября 2015 г.

Sorrento Coast Hotel Giosue a Mare

Тирренское море Соррентийского побережья Италии - выбор этого лета!
Мы остановились в Hotel Giosue a Mare, который расположен на берегу моря. В лифту отеля была кнопка 'Mare' - нажимаешь и спускаешься сразу на пляж.

среда, 29 июля 2015 г.

SCJP

I / O
new File(parent, child)      
  • if  child = null  => NullPointerException
  • if  parent = null => new File(child)

Текущая папка С:\parent\child
File file = new File("../file.txt");
file.getPath()
   ..\file.txt     то, что передали в метод
file.getAbsolutePath()    C:\parent\child\..\file.txt       текущая папка+аргумент метода
file.getCanonicalPath()    C:\parent\file.txt  нормальный логический путь

Потоки
Thread.yield() - вызывает приостановку текущего потока, позволяя какому-то другому потоку начать выполнение. Yield переводится как уступить, выйти, передать выполнение.
threadObj.join() - текущий поток приостанавливается и ждет, пока threadObj не закончит выполнение. Выполнение текущего потока "присоединяется" к концу выполнения другого потока.

Основные методы класса Thread
  • public void run()
  • public void start()
  • public final void join() throws InterruptedException (3 overloaded methods)
  • public static void sleep(long millis) throws InterruptedException (2 overloaded methods)
  • public static void yield()
  • public static Thread currentThread()
3 статичных метода, 2 бросают проверяемые исключения!

Некоторые методы класса Object
  • public final void wait() throws InterruptedException (3 overloaded methods)
  • public final void notify()
  • public final void notifyAll()
Все методы не статические. Только 1 метод бросает проверяемое исключение!

Generics
List<? extends Number> - List<Integer>, List<Double> ...
List<? super Integer> - List<Integer>, List<Number>, List<Object>

List<? extends Number> - коллекция с extends доступна только для чтения! В такую коллекцию нельзя добавлять элементы, при попытке вызова метода add код даже не скомпилируется.
List<? super Number> - в коллекцию c super можно добавлять элементы.

         List<? extends Integer> list = new ArrayList<Integer>(); for (Integer element : list) { System.out.println(element); } Integer first = list.get(0);
Для коллекции с extends в цикле for используется тип коллекции. Метод get также вернет объект типа коллекции.
   
         List<? super Integer> list = new ArrayList<Integer>(); for (Object element : list) { System.out.println(element); } Object first = list.get(0);
Внимательно, так как для коллекции с super в цикле for используется не тип коллекции, а Object. Метод get также вернет Object.

Object set = new TreeSet<Integer>();
boolean flag = set instanceof NavigableSet<Integer>;   // неправильно. в instanseof нельзя использовать параметризированный тип. Generic type information does not exist at runtime - it is for compile-time safety only.
boolean flag = set instanceof NavigableSet<?>;            // верно! 

Class c = new ArrayList<Integer>().getClass();        // yes
Class c = ArrayList<Integer>.class;                           // no

Создание объектов с '?' иногда возможно!
new TreeMap<String, ? super Integer>();                                          // no
class Test1 extends ArrayList<? extends Number> {}                      // no
class Test1 extends ArrayList<Set<? extends Number>> {}            // YES !
new ArrayList<Set<?>>();                                                                 // YES !

class Test <T> {
T[] array = new T[7];                                      // no
T value = new T();                                          // no
List<T> list = new ArrayList<T>();               // yes
}

Различие List<?> и List<Object>
List<?> List<Object>
 список элементов любого типа,
 в таком списке нельзы вызывать add.
 абсолютно идентично List<? extends Object> 
 только список Object, 
в список можно добавлять 
Wildcard ? means "many possibilities". If you do NOT see the question mark, then it means the <type> in the brackets, and absolutely NOTHING ELSE.

public class MyClass<T>                                  // класс
public <T> void myMethod(T t)                       // метод
1) Класс не обязательно должен быть дженериком, чтобы в нем создать дженерик-метод.
2) Если класс объявлен как дженерик, то в объявлении метода можно опустить <T>.
Ссылки
https://nikojava.wordpress.com/2008/10/10/free-scjp-mock-exams/ - Хорошие тематические тесты. Понравились.