вторник, 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.