在JDK1.5就多了一种for循环的遍历写法,现在应该没有人用JDK1.4了吧?我见那些2005年出的JAVA书,谭浩强系列的JAVA书都是使用JDK1.5了,当然JDK1.7已经使用的,据说JDK1.7是兼容JDK1.2~JDK1.7,现在的JAVA编程都是基于JDK1.5的。然而由于考试不要求或者其它什么原因,它并不受程序猿的青睐,而在平常实践用,旧式的循环中用多了,老程序猿依旧作为开发主力的情况,也就没有人敢于尝试这种新型的数组遍历方法了,其实这种方法在遍历HashMap的时候尤其有用,能够写少很多代码,思路也清晰。有点类似php中的foreach的方法。
一、JDK1.5之后的新型数组遍历方法是什么?
我们拿一道最简单的题目来做例子,定义一个数组,求里面元素之和、求里面的最大(小)值。
这个学过Java的人必须会,是必修课,一般这样写:
public class Arrtest { public static void main(String[] args) { int[] arr = { 1, 12, 32, 13, 23, 24, 21, 4, 214, 21, 5, 12 }; int arrtotal = 0; int max = arr[0]; for (int i = 0; i < arr.length; i++) { int element = arr[i]; arrtotal += element; if (max < element) { max = element; } } } }
实验结果如下:
但其实使用JDK1.5之后的新型数组遍历方法完全可以这样写:
public class Arrtest { public static void main(String[] args) { int[] arr = { 1, 12, 32, 13, 23, 24, 21, 4, 214, 21, 5, 12 }; int arrtotal = 0; int max = arr[0]; for (int element : arr) { arrtotal += element; if (max < element) { max = element; } } System.out.printf(Arrays.toString(arr)); System.out.print("\n数组中所有元素之和为:" + arrtotal + "\n"); System.out.println("数组中的最大值为:" + max); } }
实验结果与上面一样,
其中关键的变化在于for循环里面的条件,它的意思是把arr中的第i的元素定义为element,其中i是0到arr.length,自动自增
这样可以避免了i变量的定义,然后又写一个i的自增,其实for循环是while循环的改进,当年常常在while循环外面定义一个i,再于while里面自增,for则一个括号则OK,现在这种新型的for循环的出现的,让这个i也隐藏掉了。这在一些诸如现在求最大值、求数组内各个元素之和等i不用重要情况下很有用,但是并不是说这种新型for循环就能够取代for了,毕竟一旦i变得重要起来,例如:求出数组中最大值的位置,冒泡排序要操作第i个元素的前后元素等,这种foreach循环就完蛋了。
同时,请看我上面的代码,foreach在遍历输出整个数组,并不好用,毕竟每个元素之后的" "或者","无法消去,例如,利用foreach输出数组中的元素,永远是1, 12, 32, 13, 23, 24, 21, 4, 214, 21, 5, 12,或者1 12 32 13 23 24 21 4 214 21 5 12 ,最后一个元素始终存在一个,或者空格,输出很不好看,还不如用我在《【Java】Arrays中之于int数组的方法,Integer数组与int数组》(点击打开链接)提出的方法,用System.out.print(Arrays.toString(arr));输出一个数组实在。
二、如何遍历HashMap?
输出一个HashMap还好,直接就可以用System.out.println(HashMap);进行输出,但是,要你对HashMap中每一个key并且把每一个key所对应的元素进行处理,这就头大了。封装方法用多了,让你处理里面的深入的东西,就呵呵了,现在框架什么的盛行,都这样。
其实完全可以利用这个foreach来遍历HashMap,方法如下:
import java.util.*; public class HashmapTraversal { public static void main(String[] args) { HashMap<String, String> string_map = new HashMap<String, String>(); string_map.put("key1", "value1"); string_map.put("key2", "value3"); string_map.put("key121", "value3211"); string_map.put("key31", "value12"); string_map.put("key41", "value10"); for (String key : string_map.keySet()) { System.out.println("KEY:" + key + "对应的值为:" + string_map.get(key)); } } }
先定义一个HashMap,在里面放入5个元素,再用string_map.keySet()取出这个string_map的Key集合,对这个string_map的Key集合进行foreach遍历,设key是string_map的Key集合里面的第i个元素,再利用get方法拿出里面的集就可以了。实验结果如下:
至于那些HashMap<String, ArrayList<Integer,String>>怎么办?这本来就不是一个好的存储要处理数据的方法,我在《【Java】Java中的Collections类——Java中升级版的数据结构》(点击打开链接)里面提过,这方法本来就是错误的,既然你要存储一个三元组,为何不定义个类,例如:
class Tuple{ public String key; public int integer; public String string; }
然后在定义一个存放这个多元组Tuple类的动态数组ArrayList呢,非要把整个HashMap弄得复杂起来?
例如:
ArrayList<Tuple> tuple_arraylist=new ArrayList<Tuple>();
C语言姑且会定义结构体,然后来到Java中就死扣HashMap,这实在是不明智!