我的Java开发学习之旅------>System.nanoTime与System.currentTimeMillis的区别

首先来看一道题:下面代码的输出结果是什么?

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

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

时间: 2024-12-26 10:44:52

我的Java开发学习之旅------>System.nanoTime与System.currentTimeMillis的区别的相关文章

我的Java开发学习之旅------&gt;Java使用ObjectOutputStream和ObjectInputStream序列号对象相关问题解决方法

今天用ObjectOutputStream和ObjectInputStream进行对象序列化话操作的时候,报了java.io.EOFException异常. 异常代码如下: java.io.EOFException at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2554) at java.io.ObjectInputStream.readObject0(ObjectInputSt

我的Java开发学习之旅------&gt;Java String对象作为参数传递的问题解惑

又是一道面试题,来测试你的Java基础是否牢固. 题目:以下代码的运行结果是? public class TestValue { public static void test(String str) { str="World"; //代码3 } public static void main(String[] args) { String string = "Hello"; //代码1 test(string); //代码2 System.out.println(

我的Java开发学习之旅------&gt;使用循环递归算法把数组里数据数组合全部列出

面试题如下:把一个数组里的数组合全部列出,比如1和2列出来为1,2,12,21. (面试题出自<Java程序员面试宝典>) 代码如下: import java.util.Arrays; import java.util.LinkedList; import java.util.List; /** * 把一个数组里的数组集合全部列出,比如1和2列出来为1,2,12,21 */ public class ListAll { public static void main(String[] args

我的Java开发学习之旅------&gt;解惑Java进行三目运算时的自动类型转换

今天看到两个面试题,居然都做错了.通过这两个面试题,也加深对三目运算是的自动类型转换的理解. 题目1.以下代码输出结果是(). public class Test { public static void main(String[] args) { int a=5; System.out.println("value is :"+((a<5)?10.9:9)); } } A.编译错误     B.10.9           C.9           D.以上答案都不对 我不假

我的Java开发学习之旅------&gt;Java NIO 报java.nio.charset.MalformedInputException: Input length = 1异常

今天在使用Java NIO的Channel和Buffer进行文件操作时候,报了java.nio.charset.MalformedInputException: Input length = 1异常,具体如下: java.nio.charset.MalformedInputException: Input length = 1 at java.nio.charset.CoderResult.throwException(CoderResult.java:260) at java.nio.char

我的Java开发学习之旅------&gt;求字符串中出现次数最多的字符串以及出现的次数

金山公司面试题:一个字符串中可能包含a~z中的多个字符,如有重复,如String data="aavzcadfdsfsdhshgWasdfasdf",求出现次数最多的那个字母及次数,如有多个重复的则都求出. 此题的解题思路如下: 引入TreeSet:通过集合快速找到所有出现过的字符串 引入ArrayList:为了快速排序,再通过StringBuffer生成排序后的字符串 通过String的indexOf方法和lastIndexOf方法来计算每个字符串出现的次数最大值 使用HashMap

我的Java开发学习之旅------&gt;Java语言中方法的参数传递机制

实参:如果声明方法时包含来了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时传给形参的参数值也被称为实参. Java的实参值是如何传入方法?这是由Java方法的参数传递机制来控制的,Java里方法的参数传递方式只有一种:值传递.所谓值传递,就是将实际参数的副本(复制品)传入方法内,而参数本身不会收到任何影响. 一.参数类型是原始类型的值传递 下面通过一个程序来演练 参数类型是原始类型的值传递的效果: public class ParamTransferTest { public sta

我的Java开发学习之旅------&gt;Java使用Fork/Join框架来并行执行任务

现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多. 虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并未这种多核CPU做好准备,因此并不能很好地利用多核CPU的性能优势. 为了充分利用多CPU.多核CPU的性能优势,级软基软件系统应该可以充分"挖掘"每个CPU的计算能力,决不能让某个CPU处于"空闲"状态.为此,可以考虑把一个任务拆分成多个"小任务",把

我的Java开发学习之旅------&gt;Base64的编码思想以及Java实现

Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法.Base64是一种最常见的二进制编码方法. 一.编码规则 所谓Base64,就是说选出64个字符----小写字母a-z.大写字母A-Z.数字0-9.符号"+"."/"(再加上作为垫字的"=&qu