Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > массив элементов типа ArrayList<Point>


Автор: Mirkes 10.3.2012, 06:56
Пытаюсь создать массив известной длины, каждый элемент которого ArrayList<Point>.
При описании все нормально, а вот при попытке инициализировать 
Код

        ArrayList<Point> tempReact[];
       ...
        tempReact = new ArrayList<Point>[5];

получаю ошибку "Error(68,21):  generic array creation"
Честно говоря пытался ставить круглые скобки в разные места - не помогает. Потом понял, что и не должно помогать.
Как создать такой массив?

Автор: Stolzen 10.3.2012, 08:54
Используйте List, а не массив.
Почему лучше делать так, и почему создание массива-генерика приводит к ошибке, можно почитать у J. Bloch в Effective Java 2nd edition, item 25.

Цитата
Because of these fundamental differences, arrays and generics do not mix well. For example, it is illegal to create an array of a generic type, a parameterized type, or a type parameter. None of these array creation expressions are legal: new List<E>[], new List<String>[], new E[]. All will result in generic array creation errors at compile time.
Why is it illegal to create a generic array? Because it isn’t typesafe. If it were legal, casts generated by the compiler in an otherwise correct program could fail at runtime with a ClassCastException. This would violate the fundamental guarantee provided by the generic type system. 


Если просто невыносимо хочется создать такой массив, делайте это так:
Код

@SuppressWarnings("unchecked")
ArrayList<String>[] a = new ArrayList[10];
a[0] = new ArrayList<String>();

Автор: dorogoyIV 10.3.2012, 10:17
Цитата(Stolzen @  10.3.2012,  08:54 Найти цитируемый пост)
Используйте List, а не массив

не согласен!
низкоуровневые массивы эффективнее высокоуровневых коллекций.

Автор: dorogoyIV 10.3.2012, 10:34
для топикстартера:
т.к. коллекция динамическая, лучше использовать Vector - он быстрее, и он синхронизирован
Код

 Vector <Point> v = new Vector <Point> ();
 ...
 v.add(new Point(10, 10));
 ...


Автор: jk1 10.3.2012, 10:43
Цитата

низкоуровневые массивы эффективнее высокоуровневых коллекций.


При условии что руки у программиста достаточно прямые.

Цитата

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


Можно пруфлинк?

Автор: dorogoyIV 10.3.2012, 10:47
jk1, вот тут я немного в ступоре...  smile 

Цитата(Mirkes @  10.3.2012,  06:56 Найти цитируемый пост)
Пытаюсь создать массив известной длины

заметь слово "известной"
тогда зачем ArrayList ?!!!

Автор: dorogoyIV 10.3.2012, 11:23
Цитата(jk1 @  10.3.2012,  10:43 Найти цитируемый пост)
Можно пруфлинк?

насчет скорости щас лень разбираться, но я помню, что, вектор всегда был быстрее...
а насчет синхронизации вот исходники:

Vector:
Код

    public synchronized E get(int index) {
    if (index >= elementCount)
        throw new ArrayIndexOutOfBoundsException(index);
    return (E)elementData[index];
    }


ArrayList:
Код

    public E get(int index) {
    RangeCheck(index);
    return (E) elementData[index];
    }


Автор: jk1 10.3.2012, 13:45
Цитата

а насчет синхронизации вот исходники:


Здесь Вы конечно правы.

Цитата

насчет скорости щас лень разбираться, но я помню, что, вектор всегда был быстрее...


Синхронизация конечно сегодня дешевая, но чтобы синхронизированный код был заметно быстрее несинхронизированного - в это верится с трудом. Да и http://www.javacodegeeks.com/2010/08/java-best-practices-vector-arraylist.html показывают примерное равенство по скорости, разве что итератор у вектора заметно медленнее.

Я уже не говорю о том, что преждевременная оптимизация по скорости - вообще зло.

Автор: dorogoyIV 10.3.2012, 14:26
jk1, если взять все в совокупности, в итоге выиграет все равно вектор.
а ты молодец!
если бы не ты, я бы не полез в исходники...
спасибо тебе!!!...

Добавлено через 5 минут и 49 секунд
jk1, ты сам прекрасно знаешь - всегда вектор будет быстрее чем аррэйлист!
хватит мне уже тут мозг долбить...  smile 

Автор: Stolzen 10.3.2012, 14:47
Цитата(dorogoyIV @  10.3.2012,  11:47 Найти цитируемый пост)
заметь слово "известной"
тогда зачем ArrayList ?!!! 

Хотя бы потому, что add использовать удобнее, чем вручную возиться с индексами.

Цитата(dorogoyIV @  10.3.2012,  15:26 Найти цитируемый пост)
jk1, ты сам прекрасно знаешь - всегда вектор будет быстрее чем аррэйлист!

Прошу прощения, что вмешиваюсь, но я вот не знаю.

Цитата(dorogoyIV @  10.3.2012,  15:26 Найти цитируемый пост)
в итоге выиграет все равно вектор.

А что, его кто-то еще использует? 

Автор: Mirkes 10.3.2012, 17:30
Цитата(dorogoyIV @  10.3.2012,  10:47 Найти цитируемый пост)
заметь слово "известной"тогда зачем ArrayList ?!!! 

Вообще-то я создавал массив известной длинны, состоящий из массивов неизвестной заранее длины.
Цитата(jk1 @  10.3.2012,  10:43 Найти цитируемый пост)
Цитата

низкоуровневые массивы эффективнее высокоуровневых коллекций.При условии что руки у программиста достаточно прямые
.

Достаточно прямые. Более того, после формирования всех ArrayList'ов я потом трансформирую все в массивы.

Цитата(Stolzen @  10.3.2012,  08:54 Найти цитируемый пост)
Используйте List, а не массив.Почему лучше делать так, и почему создание массива-генерика приводит к ошибке, можно почитать у J. Bloch в Effective Java 2nd edition, item 25.

Спасибо большое, теперь понял почему была ошибка. Пришлось использовать ArrayList<ArrayList<Point>>, все работает.

Автор: Shaggie 10.3.2012, 18:12
Цитата(dorogoyIV @  10.3.2012,  15:26 Найти цитируемый пост)
всегда вектор будет быстрее чем аррэйлист

Ох ничего себе, а мужики-то не знают. Оказывается, синхронизированный код быстрее того, который написан без заморачивания на корректную работу в многопоточной среде.

Вот только в реальности вектором в современной джаве никто не пользуется. Отдельная сущность не нужна, ArrayList быстрее, а в случае многопоточной работы его можно обернуть в synchronized или воспользоваться специальным примитивом под задачу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)