JavaRush /وبلاگ جاوا /Random-FA /کلاس ArrayList در جاوا

کلاس ArrayList در جاوا

در گروه منتشر شد
سلام! در سخنرانی های قبلی، ما به طور مفصل چنین ساختار داده ای را به عنوان یک آرایه بررسی کردیم و نمونه های رایج کار با آنها را بررسی کردیم. اما این ساختار داده دارای معایبی است. پاسخ آنها در جاوا ظاهر ArrayList بود. به بیان ساده تر، ArrayList در جاوا یک آرایه "ارتقای" با بسیاری از ویژگی های جدید است.Class ArrayList - 1

آرایه‌های جاوا چه تفاوتی با آرایه‌های معمولی دارد؟

به طور کلی، آرایه ها بسیار راحت هستند و همانطور که قبلاً متوجه شده اید، می توانید کارهای زیادی را با آنها انجام دهید :) با این حال، آرایه ها معایبی نیز دارند.
  • اندازه محدود شما باید از قبل در مرحله ایجاد یک آرایه بدانید که چند سلول باید داشته باشد. اگر مقدار مورد نیاز را دست کم بگیرید، فضای کافی وجود نخواهد داشت. اگر آن را بیش از حد تخمین بزنید، آرایه نیمه خالی می ماند و این خیلی بد نیست. پس از همه، معلوم می شود که شما همچنین حافظه بیشتری را نسبت به آنچه لازم است به آن اختصاص خواهید داد.
  • یک آرایه هیچ روشی برای افزودن عناصر ندارد. شما همیشه باید به صراحت شاخص سلولی را که می خواهید عنصر را در آن اضافه کنید مشخص کنید. اگر به طور تصادفی یک سلول اشغال شده را با مقدار دلخواه مشخص کنید، بازنویسی می شود.
  • هیچ روشی برای حذف یک عنصر وجود ندارد. مقدار را فقط می توان "صفر" کرد.
public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Hippopotamus");
       cats[2] = new Cat("Philip Markovich");

       cats[1] = null;



       System.out.println(Arrays.toString(cats));
   }

   @Override
   public String toString() {
       return "Cat{" +
               "name='" + name + '\'' +
               '}';
   }
}
نتیجه:

[Cat{name='Томас'}, null, Cat{name='Фorпп Маркович'}]
تمام این کاستی ها را می توان با استفاده از ArrayList برطرف کرد. بسیار ساده ایجاد شده است:
ArrayList<Cat> cats = new ArrayList<Cat>();
اکنون لیستی برای ذخیره اشیاء ایجاد کرده ایم Cat. توجه کنید:ما اندازه ArrayList را مشخص نمی کنیم زیرا به طور خودکار قابل گسترش است. چه طور ممکنه؟ به آسانی. تعجب خواهید کرد، اما ArrayList بر اساس یک آرایه معمولی است :) بله، داخل آن آرایه ای وجود دارد که عناصر ما در آن ذخیره می شوند. اما ArrayList مکانیسم خاصی برای کار با آن دارد:
  • هنگامی که این آرایه داخلی پر است، ArrayList یک آرایه جدید در درون خود ایجاد می کند. اندازه آن = (اندازه آرایه قدیمی * 1.5) +1.
  • تمام داده ها از آرایه قدیمی به آرایه جدید کپی می شوند
  • آرایه قدیمی توسط زباله جمع کن حذف می شود.
به لطف این مکانیسم، یک ArrayList (در مقابل یک آرایه) روشی را برای افزودن یک عنصر جدید پیاده سازی می کند. این یک روش است add().
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<Cat>();
   cats.add(new Cat("Hippopotamus"));
}
عنصر جدید به انتهای لیست اضافه می شود. اکنون خطر سرریز وجود ندارد، بنابراین این مکانیسم کاملاً ایمن است. به هر حال، ArrayList نه تنها می تواند یک شی را با شاخص جستجو کند، بلکه برعکس - می تواند با ارجاع به شی، فهرست یک شی را در ArrayList پیدا کند! برای انجام این کار، متد را پیاده سازی می کند indexOf(): پیوندی به شی مورد نظر به آن ارسال می کنیم و indexOf()ایندکس خود را به ما برمی گرداند:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   int thomasIndex = cats.indexOf(thomas);
   System.out.println(thomasIndex);
}
نتیجه:

0
درست است، شی thomasدر واقع در سلول ذخیره می شود 0. آرایه ها نه تنها دارای معایبی هستند، بلکه مزایای بی شک نیز دارند. یکی از آنها جستجوی یک عنصر بر اساس شاخص است. از آنجایی که ما به یک شاخص، یعنی به یک آدرس خاص در حافظه اشاره می کنیم، چنین جستجوی آرایه ای بسیار سریع است. ArrayList در جاوا نیز می تواند این کار را انجام دهد! برای این کار یک متد را پیاده سازی می کند get():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   Cat secondCat = cats.get(1);

   System.out.println(secondCat);
}
نتیجه:

Cat{name='Бегемот'}
همچنین، می توانید به راحتی متوجه شوید که آیا یک ArrayList حاوی یک شی خاص است یا خیر. این کار با استفاده از روش زیر انجام می شود contains():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   cats.remove(pushok);
   System.out.println(cats.contains(pushok));
}
این روش بررسی می کند که آیا عنصر در آرایه داخلی ArrayList موجود است یا خیر، و نتیجه را به شکل boolean- trueیا - برمی گرداند false. نتیجه:

false
و نکته مهم دیگر در مورد درج. ArrayList به شما این امکان را می دهد که داده ها را نه تنها در انتهای آرایه، بلکه در هر سلولی با شاخص وارد کنید. برای این کار دو روش دارد:
  • add(int index, Cat element)
  • set(int index, Cat element)
به هر دو، فهرست سلولی را که می‌خواهید در آن وارد کنید و پیوندی به خود شی ارسال می‌کنید. تفاوت این است که چسباندن set()مقدار قدیمی ذخیره شده در سلول را بازنویسی می کند. و با وارد کردن از طریق add()ابتدا همه عناصر از شروع [index]به انتهای آرایه جابجا می شوند و شی مورد نیاز شما به سلول خالی حاصل اضافه می شود. در اینجا یک مثال است:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.set(0, philipp);//Now we have a list of 2 cats. We add the 3rd via set:

   System.out.println(cats.toString());
}
نتیجه:

[[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Бегемот'}]
set()ما یک لیست از 2 گربه داشتیم، یک گربه دیگر را از طریق روش وارد سلول کردیم 0. در نتیجه، مقدار قدیمی ذخیره شده در این سلول با یک مقدار جدید جایگزین شد.
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.add(0, philipp);//Now we have a list of 2 cats. Add the 3rd via add

   System.out.println(cats.toString());
}
اما add()کار متفاوتی داشت. او تمام عناصر را به سمت راست منتقل کرد و سپس مقدار جدید را در سلول نوشت 0. نتیجه:

[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Томас'}, Cat{name='Бегемот'}]
برای پاک کردن کامل لیست از روش زیر استفاده کنید clear():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   cats.clear();

   System.out.println(cats.toString());
}
نتیجه:

[]
تمامی مطالب از لیست حذف شده است. ضمناً توجه داشته باشید: برخلاف آرایه ها، در ArrayList متد toString() رد شده و بلافاصله لیست را با فرمت رشته نمایش می دهد. در مورد آرایه ها باید از کلاس Arrays برای این کار استفاده می کردیم. و از آنجایی که آرایه ها را به خاطر آوردیم: در جاوا می توانید به راحتی بین یک آرایه و یک ArrayList "سوئیچ" کنید، یعنی یکی را به دیگری تبدیل کنید. کلاس Arrays یک متد برای این کار دارد، Arrays.asList(). با کمک آن، محتویات آرایه را به عنوان یک لیست دریافت می کنیم و آن را به سازنده ArrayList خود ارسال می کنیم:
public static void main(String[] args) {

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   Cat[] catsArray = {thomas, behemoth, philipp, pushok};

   ArrayList<Cat> catsList = new ArrayList<>(Arrays.asList(catsArray));
   System.out.println(catsList);
}
نتیجه:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}]
می توانید برعکس این کار را انجام دهید - یک آرایه از یک شی ArrayList دریافت کنید. برای این کار از متد toArray() استفاده کنید:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   Cat[] catsArray = cats.toArray(new Cat[0]);

   System.out.println(Arrays.toString(catsArray));
}
لطفا توجه داشته باشید: ما یک آرایه خالی را به متد ()toArray ارسال کردیم. این یک اشتباه نیست. در داخل کلاس ArrayList این متد به گونه ای پیاده سازی می شود که عبور از یک آرایه خالی باعث افزایش کارایی آن می شود. در حال حاضر، فقط این را برای آینده به خاطر بسپارید (اما می توانید اندازه خاصی را نیز انتقال دهید، کار خواهد کرد). صحبت از اندازه. اندازه فعلی لیست را می توان با استفاده از روش پیدا کرد size():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   System.out.println(cats.size());
}
درک این نکته مهم است که برخلاف lengthخاصیت آرایه، متد ArrayList.size() دقیقاً تعداد عناصر را برمی‌گرداند، نه ظرفیت اولیه را، زیرا هنگام ایجاد ArrayList آن را مشخص نمی‌کنیم. به هر حال، به طور کلی می توان آن را نشان داد. ArrayList یک سازنده مربوطه دارد. اما رفتار آن از نظر افزودن عناصر جدید تغییر نخواهد کرد:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>(2);//create an ArrayList with an initial capacity of 2


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   System.out.println(cats.size());
}
خروجی کنسول:

4
ما یک لیست با 2 عنصر ایجاد کردیم، اما زمانی که به آن نیاز داشتیم، به راحتی گسترش یافت. نکته دیگر این است که اگر در ابتدا یک لیست بسیار کوچک ایجاد کنیم، باید عملیات توسعه را بیشتر انجام دهد و این مقدار مشخصی از منابع را مصرف می کند. در این سخنرانی، ما به سختی به روند حذف عناصر از ArrayList پرداختیم. البته این به خاطر فراموشی نیست. این موضوع به یک سخنرانی جداگانه تقسیم شده است که می توانید در ادامه مطلب بخوانید :)
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION