1-)
List<String> strings=new ArrayList<String>();
for(String s:strings){
strings.remove(s);
}
Foreach döngüsü kullanırken dikkat edilmesi gereken hususlardan birisi liste üzerinde değişiklik yapılmasına izin verilmemesidir. Yukarıdaki örnekteki gibi silme ve ekleme işlemlerinde uyarı alırsınız. Tabi bu runtime da olur. Compile uyarısı değildir. Bu tür durumlarda eski yönteme dönmeniz gerekir.
for(Iterator iter=strings.iterator();iter.hasNext();){
}
yada geçici bir liste tutmanız gerekir.
List<String> tempList=new ArrayList<String>();
for(String s:strings)
{
if(s.equals("Ali")){
tempList.add(s);}
}
strings.removeAll(tempList);
İkinci yöntem daha garantilidir.
2-)foreach döngüsünde dikkat edilmesi gereken diğer bir husus ise primitive type larda autoboxing , String ise immutable durumundan dolayı oluşan farklı bir memory location gösterme durumudur. Örneğin
for(String s:strings){
// örneğin her elemana "01" yazısını eklemek istiyoruz.
s=s+"01";
}
bunu işlemi yaptığınızda olması beklenen şey bütün elemanlara "01" eklenmesidir. Fakat strings immutable olduğundan dolayı bunu yazdığımızda artık s nesnesi farklı bir nesneyi gösterir bu yüzden yaptığımız değişiklik liste üzerinde etki etmez. Bunu çözmek için yine eski yöntemi kullanacağız.
for(int i=0;i<strings.size();i++){
strings.set(i,strings.get()+"01");
}
int,double,float gibi primitive typelarda da aynı durum farklı bir nedenle meydana gelir. foreach döngüsü sadece nesneler üzerinde çalışır. Bu yüzden int gibi primitive typelar autoboxing ile Integer nesnesine çevirilir. İşte bu durum olay array üzerinde değişiklik yapmak gerektiğinde bize foreach döngüsünde sorun çıkartır.
int[] ints=new int[20];
for(Integer i:ints){
i+=20;
}
Yukarıdaki kodda listedeki bütün elemanlarının değerlerinin 20 artması beklenir fakat biz toplama işlemini yaptığımızda autoboxing yöntemi tekrar çalışır ve artık i nesnesi bize array in bir elemanını göster bu yüzden liste üzerinde bir değişiklik oluşmaz. Bunu da çözmenin yolu yine eski yönteme dönmektir.
for(int i=0;i<ints.length;i++){
ints[i]+=20;
}
Hiç yorum yok:
Yorum Gönder