首先来看一道题:下面代码的输出结果是什么?
import java.util.HashMap;
import java.util.Map; public class HashMapTest {
public static void main(String[] args) {
Map<String, String> map=new HashMap<String, String>();
map.put(String.valueOf(System.currentTimeMillis())+"a", "1");
map.put(String.valueOf(System.currentTimeMillis())+"a", "2");
map.put(String.valueOf(System.currentTimeMillis())+"a", "3");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getValue());
}
}
}

A.  123 B.213 C.123顺序无法确定   D.以上答案都不对


我选的答案是C.123顺序无法确定,对程序的理解为:Map中的键是Set,值是Collection,map.entrySet()产生的类型是Set,因而能用foreach(),而Set顺序是随机的,因此输出的1、2、3的顺序不确定。

但是当我把程序在Eclipse上运行后,输出结果却是为:3。
结果亮瞎了我的双眼,原来是现在的计算机运行速度很快,因而极有可能System.currentTimeMillis()的值相等,而Set是不允许有重复的,这样就会覆盖它的值,因此在电脑上测试时只输出3。

=================================================
如果想达到期待的输出结果:123顺序无法确定的话。可以将System.currentTimeMillis()改为System.nanoTime()。
  1纳秒=1000 皮秒 
 
  1纳秒 =0.001  微秒
 
  1纳秒=0.000001 毫秒
 

  1纳秒=0.00000 0001


改后代码如下:
import java.util.HashMap;
import java.util.Map; public class HashMapTest {
public static void main(String[] args) {
Map<String, String> map=new HashMap<String, String>();
map.put(String.valueOf(System.nanoTime())+"a", "1");
map.put(String.valueOf(System.nanoTime())+"a", "2");
map.put(String.valueOf(System.nanoTime())+"a", "3");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getValue());
}
}
}

这样输出的结果就是123顺序无法确定了。有可能是213,231,123。。。


=================================================================
下面是中文官方文档上的解释:

currentTimeMillis

public static long currentTimeMillis()
返回以毫秒为单位的当前时间。注意,当返回值的时间单位是毫秒时,值的粒度取决于底层操作系统,并且粒度可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

请参阅 Date 类的描述,了解可能发生在“计算机时间”和协调世界时(UTC)之间的细微差异的讨论。

返回:
当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。

nanoTime

public static long nanoTime()
返回最准确的可用系统计时器的当前值,以毫微秒为单位。

此方法只能用于测量已过的时间,与系统或钟表时间的其他任何时间概念无关。返回值表示从某一固定但任意的时间算起的毫微秒数(或许从以后算起,所以该值可能为负)。此方法提供毫微秒的精度,但不是必要的毫微秒的准确度。它对于值的更改频率没有作出保证。在取值范围大于约 292 年(263 毫微秒)的连续调用的不同点在于:由于数字溢出,将无法准确计算已过的时间。

例如,测试某些代码执行的时间长度:

   long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;
返回:
系统计时器的当前值,以毫微秒为单位。

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

==================================================================================================


最新文章

  1. Mybatis使用generator自动生成映射配置文件信息
  2. juniper-cisco-HP上网设置
  3. 新手指导:教你如何查看识别hadoop是32位还是64位
  4. A Tour of Go Maps
  5. shell脚本应用(4)--常用命令
  6. hdu 3308
  7. zoj2112
  8. 搭建及修正Hadoop1.2.1 MapReduce Pipes C++开发环境
  9. &#39;customerService&#39; for bean class [com.cd.service.business.customer.impl.CustomerService]
  10. sql 指定范围 获取随机数
  11. 浅谈static其一之不死变量
  12. 【洛谷P2966】Cow Toll Paths
  13. Hangfire Net Core2
  14. Mysql 悲观锁
  15. JAVA_全局配置文件(配置网址,url等等)_第一种方式
  16. macbook 安装oracle RAC
  17. Android倒计时功能的实现
  18. jQuery Ajax 上传文件改进
  19. Linux中Postfix基于SSL收发邮件(九)
  20. 将php数据下载csv文件

热门文章

  1. Oracle并发控制、事务管理学习笔记
  2. 转:java中的事件监听是怎样实现随时监听的
  3. Java使用HttpURLConnection调用WebService(原始方法)
  4. git常用命令,制作缩写命令
  5. javascript中各种继承方式的优缺点
  6. css 让两个div重叠
  7. PS中把图片白色背景变成透明的方法
  8. Shell脚本之:数组
  9. 重读金典------高质量C编程指南(林锐)-------第三章 命名规则
  10. Spring使用Cache、整合Ehcache(转)