powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / по какой причине ArrayList.get() реализовано через кастинг вниз?
9 сообщений из 9, страница 1 из 1
по какой причине ArrayList.get() реализовано через кастинг вниз?
    #38151378
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кастинг вниз - относительно дорогая операция.

смотрим код ArrayList

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//тут хранятся элементы
private transient Object[] elementData;

@SuppressWarnings("unchecked")
E elementData(int index) {
    return (E) elementData[index];
}

public E get(int index) {
    rangeCheck(index);
    return elementData(index);
}



То есть каждый раз, когда мы делаем get() истандартная имплементация ArrayList делает приведение вниз.


А ведь можно было бы так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class ArrayList<T>{
private transient T[] elementData;

ArrayList(int size){
elementData = (T[])new Object[size];
}


public T get(int i){
return elementData[i];
}

}



подозреваю, что я что-то упускаю. Сравнение в производительности не проводил.
...
Рейтинг: 0 / 0
по какой причине ArrayList.get() реализовано через кастинг вниз?
    #38151390
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokподозреваю, что я что-то упускаю.
Верно. И имя ему - erasure.
...
Рейтинг: 0 / 0
по какой причине ArrayList.get() реализовано через кастинг вниз?
    #38151410
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

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

И если так - верно ли, что генерики будут работать медленее, изза этих постоянных неявных каситнгов?

То есть если у нас есть задача, в которой активно используются колекции, лучше генерики заменить своей либой, с конкретными типами?
...
Рейтинг: 0 / 0
по какой причине ArrayList.get() реализовано через кастинг вниз?
    #38151422
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokТо есть типы что там, что тут стираются, и поэтому в обоих случая кастинг вниз все равно неявно делается.

Да, там где вы с generic типа переходите на конкретый будет downcasting с дополнительными проверками на совместимость типов.

chabapokИ если так - верно ли, что генерики будут работать медленее, изза этих постоянных неявных каситнгов?

На сколько я знаю, да. Поэтому, если не ошибаюсь, в C# генерики работают без Erasure и там в рантайме генерится коллекция под конкретный тип.

chabapokТо есть если у нас есть задача, в которой активно используются колекции, лучше генерики заменить своей либой, с конкретными типами?
Экономия на спичках. Если больше совсем нечего оптимизировать, то да. Можно попробовать.
...
Рейтинг: 0 / 0
по какой причине ArrayList.get() реализовано через кастинг вниз?
    #38151919
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в смежном форуме спорят на тему
накладных расходов на instanceof. Есть
пораскинуть мозгами на тему.
...
Рейтинг: 0 / 0
по какой причине ArrayList.get() реализовано через кастинг вниз?
    #38152290
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, chabapok!

chabapokкастинг вниз - относительно дорогая операция.

Когда он есть.

chabapokсмотрим код ArrayList

Код: java
1.
2.
3.
4.
5.
6.
7.
//тут хранятся элементы
private transient Object[] elementData;

@SuppressWarnings("unchecked")
E elementData(int index) {
    return (E) elementData[index];
}




В .class не хранится чему равен тип E. Поэтому реального преобразования
тут нет. Соответственно нет ни контроля типов (можно запихнуть хоть
что), ни накладных расходов.

chabapok
Код: java
1.
2.
3.
4.
5.
6.
class ArrayList<T>{
private transient T[] elementData;

ArrayList(int size){
elementData = (T[])new Object[size];
}




Я думаю тут что-то связанное с минимизацией изменений при переходе от
1.4 и 1.5 - типа меньше кода меняли- меньше вероятность косяков :)

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
по какой причине ArrayList.get() реализовано через кастинг вниз?
    #38152510
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_SamaraВ .class не хранится чему равен тип E. Поэтому реального преобразования
тут нет.

Верно.

GKS_SamaraСоответственно нет ни контроля типов (можно запихнуть хоть
что), ни накладных расходов.

Не совсем так. Накладные расходы могут возникнуть на этапе использования коллекции. В "клиентском" коде.

GKS_SamaraЯ думаю тут что-то связанное с минимизацией изменений при переходе от
1.4 и 1.5 - типа меньше кода меняли- меньше вероятность косяков :)

Тоже верно. Только дело не в "косяках", а в обратной совместимости версий, которая у Java очень даже на высоте уже много лет.
...
Рейтинг: 0 / 0
по какой причине ArrayList.get() реализовано через кастинг вниз?
    #38152615
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, Blazkowicz!

> Не совсем так. Накладные расходы могут возникнуть на этапе использования
> коллекции. В "клиентском" коде.

Это как?
Код: sql
1.
2.
3.
  List<String> list ....
  ......
  String s = list.get(0);



И где проблемы?

> Тоже верно. Только дело не в "косяках", а в обратной совместимости
> версий, которая у Java очень даже на высоте уже много лет.

Не вижу разницы в обратной совместимости между E[]... и Object[]...

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
по какой причине ArrayList.get() реализовано через кастинг вниз?
    #38152633
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_Samara,

я думаю
Код: java
1.
String s = list.get(0);

при компиляции превратится в
Код: java
1.
String s = (String) list.get(0);
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / по какой причине ArrayList.get() реализовано через кастинг вниз?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]