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 ★★★
()

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

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

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