【Java】用JDK1.5之后的新型数组遍历方法遍历HashMap、HashMap不应该存储多元组

在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,这实在是不明智!

时间: 2024-10-05 05:08:00

【Java】用JDK1.5之后的新型数组遍历方法遍历HashMap、HashMap不应该存储多元组的相关文章

【Java】Arrays中之于int数组的方法,Integer数组与int数组

在java.util.*中,Arrays似乎很有用的样子,似乎用里面的方法就可以避免使用for循环要自己写对数组的查找.初始化.排序等方法了. 一.先说说Arrays中对整形数组真的有用的方法 1.首先是Arrays.toString() 一般,直接用System.out.println()打印数组,比如这样: int array[] = { 8, 7, 100, 88, 6, 4, 5, 33, 10 }; System.out.println(array); 出来的结果是一堆乱码: [Lja

Java基础知识强化105:打印数组的方法总结

1. 使用for循环打印数组. 2. 使用Arrays工具类,将数组转化为有序的List打印出来. 3. 使用Arrays工具类,使用Arrays.toString()输出数组内容. 上面三种方法打印数组的示例代码如下: package com.himi.printarray; import java.util.Arrays; public class AnormalArray { public static void main(String[] args) { /** * 使用for循环打印数

【Java】JDK1.5以后新型的泛型参数传递方法Object...args

Object...args是JDK1.5以后新型的参数传递,已经越来越普及了.它在一些未知参数变量的多少或者一个方法需要应对不同数目变量又不想重写方法的情况很有用.因为它不像以前那样需要定义数组,甚至定义ArrayList的动态数组再配合方法的重写来完成变量的传递.极大地提高了程序的复用性.可能这段话有点抽象,还是举一个简单易懂的例子去说明吧! 我要达到如下的效果,当一个方法收到5个整形变量int的时候,输出这5个整形变量,并求和,如果这个方法收到11个整形变量int的时候,同样做这件事.如果仅

【Java】输入与输出与JDK1.5之后的新型字符串StringBuilder

输入与输出在Java里面相当基础,在Java各大书籍里面讲了又讲,但上面的概念往往讲得非常复杂,Java的老师强调学生必须透彻地弄得每一个类.每一个方法的意义,实际上,我们仅仅关注的是如何达到一个简单的输入输出效果.在网络上一个小小的Java输入输出包罗万象,主要是在JDK1.5推出了新型的Scanner输入,而以往的BufferedReader同样可以完成输入操作,也许多有经验的老手把自己使用惯的一套放上网络,根本不告诉别人怎么修改.下面举例子,彻底地说明白Java的输入输出,包括控制台,包括

黑马程序员——java高新---JDK1.5新特性和反射

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.JDK1.5新特性 ——>静态导入 import和import static之间的区别: 1.import是导入一个类或某个包中所有的类. 2.import static是导入一个类中的某个静态成员或所有的静态成员. 注意: 1.当导入的两个类中有同名成员时,需要在成员前加上相应的类名. 2.当类名重名时,需要指定具体的包名. 3.方法重名时,需要指定具体所属的对象或者类. 代码示例: 1

Java中的数组和方法

3.1 数组的定义和使用 数组(Array)是用来存储一组相同数据类型数据的集合.数组中的每个数据称为一个元素(element),数组可以分为一维数组,二维数组和多维数组.我们 主要讲解一维数组和二维数组. 3.1.1一维数组的声明数组变量 Java中的数组必须先声明然后再使用,Java中声明数组的方式如下: datatype[] arrayRefVar; 或者 datatype arrayRefVar[]; 例如: double[] array; 或者 double array[]; 说明:我

JAVA学习记录(一)——Number\Character\String\数组\Date\Calendar\GregorianCalendar

jdk环境配置 Java Number类 装箱拆箱 Number类的成员方法 Java Character类 简介 Character 方法 Java String类 创建字符串 字符串长度length 连接字符串 创建格式化字符串 String 方法 Java StringBuffer和StringBuilder类 StringBuffer 方法 Java 数组 声明数组变量 创建数组 遍历数组 for foreach Arrays 类 Java日期时间 Date 构造函数 日期方法 获取当前

java 数组的 toString 方法和 equals 方法以及 java.lang.Object 对象的 toString 方法和 equals 方法

1 public class Test { 2 public static void main(String[] args) { 3 int[] a = {1, 2, 4, 6}; 4 int[] b = a; 5 int[] c = {1, 2, 4, 6}; 6 7 //下面这个方法打印的是a数组的引用地址 8 System.out.println(a.toString()); 9 //下面这个方法比较的是两个数组的引用是否相等 10 System.out.println("a.equals

Android Studio解决问题:Process &#39;command &#39;/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java&#39;&#39; finished with non-zero exit value 2

最近在结合百度地图.百度定位.高德导航时,遇到异常: Error:Execution failed for task ':app:dexWebDebug'. > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/