Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> массив элементов типа ArrayList<Point>, Как создать? 
V
    Опции темы
Mirkes
Дата 10.3.2012, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



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

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

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


--------------------
Mirkes
PM MAIL   Вверх
Stolzen
Дата 10.3.2012, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Используйте 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>();



--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
dorogoyIV
Дата 10.3.2012, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



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

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

PM MAIL   Вверх
dorogoyIV
Дата 10.3.2012, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



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

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


PM MAIL   Вверх
jk1
Дата 10.3.2012, 10:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

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


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

Цитата

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


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


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
dorogoyIV
Дата 10.3.2012, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



jk1, вот тут я немного в ступоре...  smile 

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

заметь слово "известной"
тогда зачем ArrayList ?!!!
PM MAIL   Вверх
dorogoyIV
Дата 10.3.2012, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



Цитата(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];
    }


PM MAIL   Вверх
jk1
Дата 10.3.2012, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

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


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

Цитата

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


Синхронизация конечно сегодня дешевая, но чтобы синхронизированный код был заметно быстрее несинхронизированного - в это верится с трудом. Да и бенчмарки показывают примерное равенство по скорости, разве что итератор у вектора заметно медленнее.

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


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
dorogoyIV
Дата 10.3.2012, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



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

Добавлено через 5 минут и 49 секунд
jk1, ты сам прекрасно знаешь - всегда вектор будет быстрее чем аррэйлист!
хватит мне уже тут мозг долбить...  smile 
PM MAIL   Вверх
Stolzen
Дата 10.3.2012, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



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

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

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

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

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

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


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Mirkes
Дата 10.3.2012, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Цитата(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>>, все работает.

Это сообщение отредактировал(а) Mirkes - 10.3.2012, 17:32


--------------------
Mirkes
PM MAIL   Вверх
Shaggie
Дата 10.3.2012, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: 4
Всего: 72



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

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

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


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0657 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.