Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
elementData = (E[]) new Object[10];
public class Holder {
private T[] array;
public Holder() {
//noinspection unchecked
this.array = (T[]) new Object[1];
}
public void set(T element) {
array[0] = element;
}
public T get() {
return array[0];
}
public static void main(String[] args) {
Holder holder = new Holder();
holder.set("Hi");
System.out.println(holder.get());
}
}
вполне себе работает и выдает что нужноString[] d = (String[]) new Object[1];
--> java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
Соответственно, либо приведение каждый раз при создании массива, либо каждый раз при обращении. По-моему первый путь экономнееКакое ещё приведение? Ни в первом ни во втором случае нет никакого приведения. И вообще никакого приведения не бывает с дженериками. В реальности array останется массивом Object и в том числе в байткоде. Вы как-то превратно понимаете что такое java-дженерики.
class A<T extends Number>:
(T[]) new Object[1];
--> java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Number;
«Используй ArrayList везде, где невозможно обойтись массивом»По-моему, это не совсем верно. Поправьте, если ошибаюсь, но часто бывают ситуации, когда предпочтительней к примеру LinkedList.
У LinkedList есть преимущество по скорости при наполнении элементами.В большинстве типичных ситуаций это неверно. Тесты показывают, что LinkedList действительно эффективен становится только когда вам нужны операции вставки в середину/удаления из середины (что вполне ожидаемо). Если же вам это не нужно, то лучше использовать ArrayList. Даже если в конкретной ситауции они будет не лучше LL, то будет отставать совсем незначительно.
Добавить еще и мотивацию, вроде: «Используй ArrayList везде, где невозможно обойтись массивом», вообще бы цены не было.
Note also that the hierarchy consists of two distinct trees — a Map is not a true Collection.
Если места в массиве не достаточно, новая емкость рассчитывается по формуле (oldCapacity * 3) / 2 + 1Где вы это взяли? В методе grow() вот что написано:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
Структуры данных в картинках. ArrayList