Java中foreach用法及常用集合操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YHC2113/article/details/17467787

foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。 
foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。 
foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。 foreach的语句格式:for(元素类型t 元素变量x : 遍历对象obj){     引用了x的java语句;} 下面通过几个例子简单例子看看foreach是如何简化编程的。

1.首先增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的,

但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。
2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。
3.而对于LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用增强for循环,也就是iterator。

我这里用的是Junit的进行的测试。


package com.test;

import java.util.ArrayList;

/**
 * 增强for循环
 * 
 */
public class EnhanceDemo {
	/**
	 * 操作数组
	 */
	@Test
	public void testEnhance1() {
		int[] i = { 1, 2, 3, 4 };
		for (int num : i) {
			System.out.println("testEnhance1--> num: " + num);
		}
	}

	/**
	 * 操作List集合
	 */
	@Test
	public void testEnhance2() {
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		for (int n : list) {
			int num = n;
			System.out.println("testEnhance2--> num: " + num);

		}
	}

	/**
	 * 传统方式
	 */
	@Test
	public void testMap() {
		Map<String,String> map = new HashMap<String,String>();
		// Map map = new LinkedHashMap(); // LinkedMap是有序的
		map.put("1", "aaaa");
		map.put("2", "bbbb");
		map.put("3", "cccc");
		map.put("4", "dddd");
		// 拿到keySet,保存所有的key,通过key获取到value
		Set<String> set = map.keySet();
		Iterator<String> iterator = set.iterator();
		while (iterator.hasNext()) {
			String key = (String) iterator.next();
			String value = (String) map.get(key);
			System.out.println(key + " = " + value);
		}

		// foreach
		/*for (Object key : set) {
			String value = map.get(key);
			System.out.println(key + " === " + value);
		}*/

	}

	/**
	 * 传统方式2
	 */
	@Test
	public void testMap2() {
		Map<String,String> map = new HashMap<String,String>();
		// Map map = new LinkedHashMap(); // LinkedMap是有序的
		map.put("1", "aaaa");
		map.put("2", "bbbb");
		map.put("3", "cccc");
		map.put("4", "dddd");
		// 拿到entrySet它单个的键值对存放
		Set<Entry<String, String>> set = map.entrySet();
		Iterator<Entry<String, String>> iterator = set.iterator();
		while (iterator.hasNext()) {
			Entry<String, String> entry = iterator.next();
			System.out.println(entry.getKey() + " == " + entry.getValue());
		}
		// foreach
		/*for (Entry<String, String> obj : set) {
			Entry<String, String> entry = obj;
			entry.getKey();
			System.out.println(entry.getKey() + "=== === " + entry.getValue());
		}*/
		 
	}

	/**
	 * 增强for循环需要注意的几个地方: 
	 *  1,它值适合迭代数据(取数据),而不适合修改数据,并不会修改集合的内容(大小etc)
	 *  2,需要修改集合的内容,则需要用传统的方式。
	 */
	@Test
	public void foreachTest() {
		int[] i = { 1, 2, 3, 4 };
		for (int j : i) {
			j = 10;
			System.out.println("foreach方式:" + i[1]);
		}

		for (int j = 0; j < i.length; j++) {
			System.out.print(i[j]);
			i[j] = 10;
			System.out.println(" ,传统方式修改:" + i[j]);
		}

		List<String> list = new ArrayList<String>();
		list.add("1");
		for (Object object : list) {
			object = "100";
			System.out.println(list.get(0));
		}
	}
}

上面遍历Map通过了两种方法:keySet()和entrySet()。

总结

1,foreach语句是for语句特殊情况下的增强版本,简化了编程,提高了代码的可读性和安全性(如:数组下标越界问题)。

2,相对老的for语句来说是个很好的补充。提倡能用foreach的地方就不要再用for了,提高了编程便捷性。

3,在用到对集合或者数组索引的情况下,foreach显得力不从心,这个时候是用传统的for语句的搞定。

4,foreach一般结合泛型使用。



展开阅读全文

没有更多推荐了,返回首页