Soru Java.util.Arrays içinde neden bir ArrayList beyanı var?


JDK 1.7'de bir ArrayList tarafından kullanılan beyan asList.

Neden yeni bir şey yaptılar? private static class ve kullanma java.util.ArrayList:

@SafeVarargs
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

/**
 * @serial include
 */
private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable
{
    private static final long serialVersionUID = -2764017481108945198L;
    private final E[] a;

    ArrayList(E[] array) {
        if (array==null)
            throw new NullPointerException();
        a = array;
    }

    public int size() {
        return a.length;
    }

    public Object[] toArray() {
        return a.clone();
    }

    public <T> T[] toArray(T[] a) {
        int size = size();
        if (a.length < size)
            return Arrays.copyOf(this.a, size,
                                 (Class<? extends T[]>) a.getClass());
        System.arraycopy(this.a, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

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

    public E set(int index, E element) {
        E oldValue = a[index];
        a[index] = element;
        return oldValue;
    }

    public int indexOf(Object o) {
        if (o==null) {
            for (int i=0; i<a.length; i++)
                if (a[i]==null)
                    return i;
        } else {
            for (int i=0; i<a.length; i++)
                if (o.equals(a[i]))
                    return i;
        }
        return -1;
    }

    public boolean contains(Object o) {
        return indexOf(o) != -1;
    }
}

21
2017-11-05 14:02


Menşei




Cevaplar:


Çünkü List tarafından döndürülen Arrays.asList() olduğu tarafından desteklenen verilen dizi. Bu diziyi sarar; diziye yapılan değişiklikler List ve tersi.

Ayrıca, bunun sonucunda, List döndü burada sabit bir boyut var. Yani, bu bir olamaz ArrayList Çünkü ArrayList büyüyebilir veya küçülebilir.


25
2017-11-05 14:06





Çünkü varsayılan ArrayList hayır ArrayList(E[] array) Yapıcı.


4
2017-11-05 14:04



ancak asıl ArrayList içine dahil edilebildiğinde neden yinelenen bir sınıf oluştururuz? - epoch
Ve Arrays.asList() ile aynı davranışı olmayan sabit boyutlu bir dizi döndürür java.util.ArrayList vardır. Ayrıca bu iç uygulama çağrılabilirlerdi SomeInternalListImpl yerine. - Mark Rotteveel
@MarkRotteveel: İsimlendirmeleri gerektiğini düşünüyordum ArrayReferenceList Altta yatan diziye bir başvuru olduğu için. Liste, kaynak dizinin etrafındaki sarıcıdır. Listedeki değişiklikler diziyi etkiler ve bunun tersi de geçerlidir. - Mr. Polywhirl


Çünkü O (n) olan dizide bulunan elemanlardan bir ArrayList oluşturmak yerine, O (1) olan sağlanan dizinin etrafında bir List sargısı sağlıyorlar.

Bu sana sorun mu veriyor? Öyleyse, muhtemelen, Listeyi kullanmanız gerektiğinde değişkenlerinizi ArrayList olarak bildirdiğinizden kaynaklanır.


3
2017-11-05 14:07





asList(T... a) Belirtilen dizi tarafından desteklenen bir sabit boyutlu liste döndürmek için yöntemleri, seri hale getirilebilir ve uygulamalı olarak bildirilir RandomAccess

java.util.ArrayList Bu tanım için uygun değildir (sabit boyut), başka bir tür java.util.List kullanılmalıdır.


2
2017-11-05 14:14





ArrayList kullanırsanız, endeks tabanlı olduğundan, verileri Tablodan hızlı şekilde alın, Hızlı geri dönüşen verileri istediğimiz yerde Arraylist kullanabiliriz ....

Ancak, dizinin yeniden düzenlenmesi daha karmaşık olduğundan ArrayList, kayıt silme sırasında daha hızlı değildir.

Daha fazla kaydı silmek istediğimiz yerde, LinkedList'i kullanabiliriz.

ArrayList Bildirisi

java.util.List

ArrayList arrayList = new ArrayList ();


-1
2017-11-05 14:37



Bu, eldeki soruyla ilgili değil ... - Mr. Polywhirl