【Java】for(int i = 0; i < hoge.size(); i++)を卒業しよう!〜For文、拡張For文、Iterator〜


For文童貞を卒業しよう!
“学生時代プログラミングちょっとかじっていました!”って人でも
意外と知らないのが拡張For文とIteratorだったりします。

この間まで社内向けにJavaの勉強会を
主催したりしていたのですが継承と同じぐらい
いやそれ以上に大切な基礎の部分であり

意外と知られていない拡張For文とIteratorを今日は紹介したいと思います。


サンプル
コードはごたごた日本語で書くよりも
サンプルを載せた方が余程早いのでサンプルコードを。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ForBun {
	public static void main(String[] args) {
		List<Integer> numList = createNumList();
		/* For文 */
		for (int i = 0; i < numList.size(); i++) {
			System.out.println("For文" + numList.get(i));
		}
		/* 拡張For文 */
		for (int num : numList) {
			System.out.println("拡張For文" + num);
		}
		/* Iterator */
		Iterator<Integer> iterator = numList.iterator();
		while(iterator.hasNext()){
			System.out.println("iterator"+iterator.next());
		}
	}

	private static List<Integer> createNumList() {
		ArrayList<Integer> numList = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			numList.add(i + 1);
		}
		return numList;
	}
}

それぞれ以下の実行結果が得られます。

For文1
For文2
For文3
For文4
For文5
For文6
For文7
For文8
For文9
For文10
拡張For文1
拡張For文2
拡張For文3
拡張For文4
拡張For文5
拡張For文6
拡張For文7
拡張For文8
拡張For文9
拡張For文10
iterator1
iterator2
iterator3
iterator4
iterator5
iterator6
iterator7
iterator8
iterator9
iterator10

想定通りすぎてビックリですね!


注意点
ただし下記のコードを実行すると
java.util.ConcurrentModificationExceptionが出てしまいます!

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ForBun {
	public static void main(String[] args) {
		List<Integer> numList = createNumList();
		/* For文 */
		for (int i = 0; i < numList.size(); i++) {
			if(numList.contains(2)){
				numList.remove(2);
			}
			System.out.println("For文" + numList.get(i));
		}
		/* 拡張For文 */
		for (int num : numList) {
			if(numList.contains(2)){
				numList.remove(2);
			}
			System.out.println("拡張For文" + num);
		}
		/* Iterator */
		Iterator<Integer> iterator = numList.iterator();
		while(iterator.hasNext()){
			if(numList.contains(2)){
				numList.remove(2);
			}
			System.out.println("iterator"+iterator.next());
		}
	}

	private static List<Integer> createNumList() {
		ArrayList<Integer> numList = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			numList.add(i + 1);
		}
		return numList;
	}
}

これは実行中にListの要素に手を加えているからですね!
なのでこう言う事をしたい時はIteratorや拡張For文は使わずに
大人しく for(int i = …ry と書くようにしましょう!

意外とはまりがちです!


最後まで読んでいただきありがとうございます。もしこの記事を気に入って頂けたようであればシェアをお願い致します。非常に励みになります。


コメントを残す