Rumah > Java > javaTutorial > teks badan

[Kod Bandingkan] ArrayList lwn Collections.singletonList

WBOY
Lepaskan: 2024-08-06 13:20:50
asal
410 orang telah melayarinya

[Code Compare] ArrayList vs Collections.singletonList

Saya memulakan urutan baharu untuk membandingkan cara berbeza untuk mengekodkan fungsi yang sama. Dalam siaran ini, saya akan membandingkan dua kaedah biasa untuk membuat senarai ringkas dengan hanya satu elemen. Secara khususnya, saya akan memeriksa pembina pelaksanaan Senarai yang paling biasa digunakan dan Collections.singletonList, Kaedah Kilang yang mudah untuk mencipta senarai tidak berubah yang mengandungi satu elemen.

Senarai Tatasusunan

Setiap kali anda memulakan ArrayList tanpa menyatakan kapasiti awalnya, ia bermula dengan tatasusunan kosong. Apabila anda menambah elemen pertama, ArrayList mengubah saiz menggunakan algoritma yang agak rumit yang melibatkan penyalinan tatasusunan. Mari kita lihat struktur ArrayList:

  private static final int DEFAULT_CAPACITY = 10;
  private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

  public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  }

  public boolean add(E e) {
    modCount++;
    add(e, elementData, size);
    return true;
  }

  private void add(E e, Object[] elementData, int s) {
    if (s == elementData.length)
        elementData = grow();
    elementData[s] = e;
    size = s + 1;
  }

  private Object[] grow() {
      return grow(size + 1);
  }

  private Object[] grow(int minCapacity) {
    return elementData = Arrays.copyOf(elementData,
                                      newCapacity(minCapacity));
  }

  private int newCapacity(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity <= 0) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return minCapacity;
    }
    return (newCapacity - MAX_ARRAY_SIZE <= 0)
        ? newCapacity
        : hugeCapacity(minCapacity);
  }
Salin selepas log masuk

Berikut ialah perkara yang berlaku langkah demi langkah:

  1. Elemen tatasusunan kosong awal dibuat.
  2. Apabila anda menambah elemen pertama, saiz semasa (iaitu sifar) dibandingkan dengan panjang tatasusunan.
  3. Memandangkan ia mendapati saiznya adalah sifar, tatasusunan perlu berkembang untuk menampung elemen baharu.
  4. Kaedah pembesaran dipanggil, yang mengira kapasiti baharu.
  5. Kapasiti baharu pada mulanya dinaikkan separuh daripada kapasiti lama, yang membolehkan kami dengan 0 + 0/2 = 0.
  6. Memandangkan newCapacity tidak mencukupi untuk menampung elemen, ia diteruskan.
  7. Memandangkan elemenData ialah tatasusunan kosong awal yang sama, ia akhirnya mengembalikan maksimum antara saiz yang diperlukan (1) dan DEFAULT_CAPACTIY (10), menghasilkan tatasusunan saiz 10.

Proses mengubah saiz ini agak rumit apabila anda hanya memerlukan senarai ringkas yang sentiasa mengandungi satu elemen.

Maksudnya, mari bercakap tentang alternatif kami!

Koleksi::singletonList

Tandatangan kaedah:

statik awam Senaraikan singletonList(T o)

Penerangan

Kaedah ini mengembalikan senarai tidak berubah yang mengandungi hanya objek yang ditentukan. Diperkenalkan dalam Java 1.3, singletonList mempunyai beberapa kelebihan:

  1. Pelaksanaan sebaris: Anda boleh memulakannya dengan elemen yang diingini dalam satu baris.
  2. Ketidakbolehubah: Mari kita lihat pelaksanaannya:

    private static class SingletonList<E> extends AbstractList<E>
        implements RandomAccess, Serializable {
    
      private final E element;
    
      SingletonList(E obj) {
        element = obj;
      }
      ...
    }
    
    Salin selepas log masuk

    Senarai Abstrak, yang diwarisi SingletonList, mentakrifkan semua kaedah boleh ubah seperti ini:

      public boolean add(E e) {
        add(size(), e);
        return true;
      }
    
      public void add(int index, E element) {
        throw new UnsupportedOperationException();
      }
    
      public E remove(int index) {
        throw new UnsupportedOperationException();
      }
    
      public E set(int index, E element) {
          throw new UnsupportedOperationException();
      }
    
    Salin selepas log masuk

    Ini memastikan bahawa adalah mustahil untuk melaungkan saiz senarai atau kandungan elemen tunggalnya.

    Ketidakbolehubahan ialah ciri yang sangat berfaedah. Walaupun saya tidak akan membincangkannya di sini, pembangun yang berminat boleh mengetahui lebih lanjut daripada artikel ini.

  3. Peruntukan Memori: Kelas SingletonList mengandungi hanya satu medan mudah untuk menampung elemen tunggal, tidak seperti ArrayList, yang menggunakan tatasusunan yang, menggunakan pembina ringkas ArrayList ringkas, akan meninggalkan kita dengan tatasusunan dengan saiz 10 selepas penambahan elemen.

  4. Penggunaan CPU: Pembina SingletonList menerima elemen tunggal sebagai parameter, tidak memerlukan saiz semula, salinan tatasusunan atau manipulasi. Ini jauh lebih cekap berbanding kaedah tambah ArrayList.

Kesimpulan

Dalam siaran ini, kami membandingkan dua cara untuk membuat senarai ringkas dengan satu elemen: menggunakan kaedah ArrayListconstructor dan Collection.singletonList. Walaupun ArrayList ialah struktur data yang fleksibel dan biasa digunakan, ia disertakan dengan beberapa overhed yang tidak perlu, terutamanya dari segi peruntukan memori dan penggunaan CPU semasa menambah elemen. Overhed ini termasuk mengubah saiz dan menyalin tatasusunan, yang boleh menjadi berlebihan untuk senarai yang bertujuan untuk memegang hanya satu elemen. Walau bagaimanapun, jika anda perlu menukar elemen ini, ArrayList ialah penyelesaian yang sesuai.

Sebaliknya, Collection.singletonList menawarkan alternatif yang lebih cekap untuk mencipta senarai elemen tunggal. Kaedah ini bukan sahaja lebih ringkas dan lebih mudah digunakan tetapi juga memastikan kebolehubahan, yang boleh menjadi kelebihan ketara dalam banyak senario. Ia mempunyai jejak memori yang minimum dan hampir tidak memerlukan sumber CPU berbanding ArrayList.

Ringkasnya, untuk senarai ringkas dan tidak berubah yang mengandungi hanya satu elemen, Collection.singletonList ialah pilihan terbaik kerana kecekapan, kesederhanaan dan kebolehubahannya. Walau bagaimanapun, jika anda perlu mengubah suai elemen dalam senarai, ArrayList boleh menjadi pilihan yang lebih sesuai.

Pada catatan seterusnya saya akan membandingkan alternatif lain untuk senarai elemen tunggal: Senarai kaedah kilang. Jumpa anda nanti!

Atas ialah kandungan terperinci [Kod Bandingkan] ArrayList lwn Collections.singletonList. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan