Enumeration در مقابل Iterator
ساختارهای داده زیادی وجود دارد که به عنوان مجموعه در جاوا عمل می کنند، مانند بردارها، جداول هش و کلاس هایی که چارچوب مجموعه های جاوا را پیاده سازی می کنند (مانند HashMap، HashSet، ArrayList، TreeSet، TreeMap، LinkedList، LinkedHashMap و LinkedHashSet). راه های متعددی برای تکرار از طریق عناصر تکی اشیاء در جاوا وجود دارد. جاوا دو رابط برای سهولت این کار فراهم می کند. Enumeration و Iterator دو رابطی هستند که در بسته java.util یافت می شوند که عملکردی را برای شمارش از طریق دنباله ها یا اشیاء با مجموعه ای از آیتم ها ارائه می دهند. Enumerator در JDK 1 معرفی شد.0 و Iterator که در JDK 1.2 معرفی شدند عملاً عملکرد Enumerator (در چارچوب مجموعه ها) را تکرار می کنند.
Enumeration چیست؟
Enumeration یک رابط عمومی در جاوا است که در JDK 1.0 معرفی شده است که توانایی شمارش از طریق دنباله ای از عناصر را فراهم می کند. در بسته java.util یافت می شود. هنگامی که رابط Enumeration توسط یک شی پیاده سازی می شود، آن شی می تواند دنباله ای از عناصر را ایجاد کند. رابط شمارش دو روش دارد. متد ()hasMoreElements آزمایش میکند که آیا این شمارش شامل عناصر بیشتری است و nextElement() عنصر بعدی را در دنباله برمیگرداند (اگر حداقل یک مورد دیگر وجود داشته باشد). به عبارت دیگر، با فراخوانی متوالی () nextElement، برنامه نویس می تواند به عناصر مجزا در سری دسترسی داشته باشد. به عنوان مثال، برای چاپ تمام عناصر در Vector v1 با استفاده از Enumerator، می توان از قطعه کد زیر استفاده کرد.
Enumeration e=v1.elements();
While(e.hasMoreLements()){
System.out.println(e.nextElement());
}
Enumerator همچنین می تواند برای تعریف جریان ورودی به اشیاء SequenceInputStream استفاده شود.
Iterator چیست؟
Iterator یک رابط عمومی در بسته Java.util است که امکان تکرار از طریق عناصر اشیاء مجموعهای را که چارچوب مجموعهها را پیادهسازی میکنند (مانند ArrayList، LinkedList و غیره) میدهد. این در JDK 1.2 معرفی شد و جایگزین Enumerator در چارچوب Java Collections شد. Iterator سه روش دارد. متد hasNext() تست می کند که آیا عناصر باقی مانده در مجموعه وجود دارد یا خیر و متد next() عنصر بعدی را در سری برمی گرداند. از متد remove() می توان برای حذف عنصر فعلی از مجموعه زیرین استفاده کرد. به عنوان مثال، برای چاپ تمام عناصر در Vector v1 با استفاده از Iterator، می توان از قطعه کد زیر استفاده کرد.
Iterator i=v1.elements();
While(i.hasNext()){
System.out.println(e.next());
}
تفاوت بین Enumeration و Iterator چیست؟
اگرچه Enumeration و Iterator دو رابطی هستند که در بسته java.util یافت می شوند، که امکان تکرار/شمارش را از طریق عناصر یک سری می دهند، اما تفاوت های خود را دارند. در واقع Iterator که بعد از Enumeration معرفی شد جایگزین Enumeration در چارچوب Java Collections می شود. برخلاف Enumeration، Iterator ایمن است. این بدان معناست که هنگام استفاده از Iterator، تغییرات همزمان (در مجموعه زیربنایی) مجاز نیستند. این در محیط های چند رشته ای که همیشه خطر تغییرات همزمان وجود دارد بسیار مفید است. در صورت تغییر همزمان، شی Iterator یک ConcurrentModificationException را ایجاد می کند. Iterator در مقایسه با Enumerator نام متدهای کوتاه تری دارد. علاوه بر این، تکرار کننده دارای عملکرد اضافی حذف عناصر در طول تکرار است (که با استفاده از Enumerator امکان پذیر نیست).بنابراین، اگر نیاز به حذف عناصر از مجموعه وجود دارد، Iterator تنها گزینه ای است که می توان در نظر گرفت.