LINUX.ORG.RU

Как в java устроен arraylist?

 


0

1

ArrayList позволяет хранить неограниченное количество элементов разного типа - как он устроен?

Здесь исходник

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/...

Не могу никак въехать.



Последнее исправление: misanthropy (всего исправлений: 1)
377    public boolean More ...add(E e) {
378         ensureCapacity(size + 1);  // Increments modCount!!
379         elementData[size++] = e;
380         return true;
381     }



при добавлении элемента добавляем памяти

178     public void ensureCapacity(int minCapacity) {
179         modCount++;
180         int oldCapacity = elementData.length;
181         if (minCapacity > oldCapacity) {
182             Object oldData[] = elementData;
183             int newCapacity = (oldCapacity * 3)/2 + 1;
184             if (newCapacity < minCapacity)
185                 newCapacity = minCapacity;
186             // minCapacity is usually close to size, so this is a win:
187             elementData = Arrays.copyOf(elementData, newCapacity);
188         }
189     }


что именно не ясно?

takino ★★★★★
()
Ответ на: комментарий от takino
elementData = Arrays.copyOf(elementData, newCapacity);

мой код, не работает

import java.util.Arrays;

public class CustomArrayList <T> implements CustomList <T> {
    int iterator = 0;
    int capacity = 0;
    int capacityincreaseStep = 10;

    public Object [] content;

    public boolean add(T t) {
        if(iterator < capacity) {
            iterator++;
            content[iterator] = t;
        }
        else {
            content = Arrays.copyOf(content, content.length + capacityincreaseStep);
        }

        return true;
    }

    @Override public String toString() {
        return Arrays.toString(content);
    }

    T next;
    T previous;

    public CustomArrayList(int initialCapacity) {
        if (initialCapacity < 0) {
            throw new IllegalArgumentException("Illegal Capacity: "
                                               + initialCapacity);
        }
        this.capacity = initialCapacity;

        content = new Object[initialCapacity];
    }
}

misanthropy
() автор топика
    public boolean add(T t) {
        if(iterator < capacity) {
            iterator++;
            content[iterator] = t;
        }
        else {
            content = new Object[content.length + capacityincreaseStep];
            content = Arrays.copyOf(content, content.length + capacityincreaseStep);
        }

        return true;
    }

И так не работает.

misanthropy
() автор топика
Ответ на: комментарий от misanthropy
 else {
            content = Arrays.copyOf(content, content.length + capacityincreaseStep);
        }



расширяешь массив, но не добавляешь туда данные.

takino ★★★★★
()

и так тоже не работает

        else {
            Object tempArray[] = new Object[content.length + capacityincreaseStep];
            tempArray = Arrays.copyOf(content, content.length + capacityincreaseStep);
            content = tempArray;
        }

misanthropy
() автор топика
Ответ на: комментарий от takino
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
	at CustomArrayList.add(CustomArrayList.java:17)
	at Runner.main(Runner.java:9)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
public class Runner {
    public static void main(String...args) {
        System.out.println("Runner has been started.");
        CustomArrayList list = new CustomArrayList(10);
        for(int i = 0; i < 12; i++) {
            list.add("test0");
        }
        System.out.println(list.toString());
    }
}
misanthropy
() автор топика
Ответ на: комментарий от misanthropy

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

if(iterator < capacity) {
            iterator++;
            content[iterator] = t;
        }

если итератор меньше макс. длины массива, то увеличиваем итератор и засовываем в массив данные на увеличенный итератор.

пример: длина массива 10, макс. индекс 9. текущий индекс 9, увеличиваем 9 на единицу, получаем 10 -> arrayoutofbounds.

takino ★★★★★
()
Последнее исправление: takino (всего исправлений: 1)

Вполне себе ограниченное. Если не изменяет память - максимальное число элементов соответствует INT_MAX.

А так ArrayList это самый обычный список на массивах.

TheKnight ★★★
()
Ответ на: комментарий от takino

Благодарю за подсказки, всё получилось.

misanthropy
() автор топика

ArrayList позволяет хранить неограниченное количество элементов

ArrayList внутри содержит единственный array, поэтому он не может хранить больше, чем Integer.MAX_VALUE элементов.
Вот LinkedList может (но обрати внимание, что метод .size() возвращает int, следовательно, не может вернуть больше, чем Integer.MAX_VALUE)

kovrik ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.