1. 编写一个单元测试类
@Test public void tt() { Map<Object, Object> map = new HashMap<>(); map.put("11", "aaaa"); map.put("22", "bbbb"); map.put("33", "cccc"); map.put("44", "dddd"); System.out.println(map); System.out.println("--------------- 改装map.toString方法测试 start ---------------"); long btime1 = System.currentTimeMillis(); String str = toString2(map); System.out.println(str); long etime1 = System.currentTimeMillis(); System.out.println("共花费了: "+(etime1-btime1) + " milliseconds"); System.out.println("--------------- 改装map.toString方法测试 end ---------------"); System.out.println("--------------- map.toString 源码方法测试 start ---------------"); long etime2 = System.currentTimeMillis(); String str2 = toString3(map); System.out.println(str2); long btime2 = System.currentTimeMillis(); System.out.println("共花费了: "+(etime2-btime2) + " milliseconds"); System.out.println("--------------- map.toString 源码方法测试 end ---------------"); }
2.通过源码我们找到了代码实现(如下:)
通过源码解读,我们可以知道,map.toString()方法主要是
通过map的迭代器判断集合是否有值,如果没有值就直接返回,如果有值我们就通过for(;;) 死循环 和
StringBuilder (不需要考虑线程安全问题, 并且考虑到效率,所以使用StringBuilder 不使用StringBuffer)
字符串缓冲区的拼接,最后加一个判断,当游标遍历到最后一个说明没有值了,直接返回字符串数据.
4 思考:于是看到这里,我们就去想源码拿出来 再把for(;;) 死循环 换成 while(true)进行测试
(最终代码实现)
@Test public void tt() { Map<Object, Object> map = new HashMap<>(); map.put("11", "aaaa"); map.put("22", "bbbb"); map.put("33", "cccc"); map.put("44", "dddd"); System.out.println(map); System.out.println("--------------- 改装map.toString方法测试 start ---------------"); long btime1 = System.currentTimeMillis(); String str = toString2(map); System.out.println(str); long etime1 = System.currentTimeMillis(); System.out.println("共花费了: "+(etime1-btime1) + " milliseconds"); System.out.println("--------------- 改装map.toString方法测试 end ---------------"); System.out.println("--------------- map.toString 源码方法测试 start ---------------"); long etime2 = System.currentTimeMillis(); String str2 = toString3(map); System.out.println(str2); long btime2 = System.currentTimeMillis(); System.out.println("共花费了: "+(etime2-btime2) + " milliseconds"); System.out.println("--------------- map.toString 源码方法测试 end ---------------"); } public String toString2(Map<Object, Object> map) { Iterator<Map.Entry<Object, Object>> i = map.entrySet().iterator(); if (!i.hasNext()) return "{}"; StringBuilder sb = new StringBuilder(); sb.append('{'); while (true) { Map.Entry<Object, Object> e = i.next(); Object key = e.getKey(); Object value = e.getValue(); sb.append(key == this ? "(this Map)" : key); sb.append('='); sb.append(value == this ? "(this Map)" : value); if (!i.hasNext()) return sb.append('}').toString(); sb.append(',').append(' '); } } /** * @param map * @return */ public String toString3(Map<Object, Object> map) { Iterator<Map.Entry<Object, Object>> i = map.entrySet().iterator(); if (!i.hasNext()) return "{}"; StringBuilder sb = new StringBuilder(); sb.append('{'); for (; ; ) { Map.Entry<Object, Object> e = i.next(); Object key = e.getKey(); Object value = e.getValue(); sb.append(key == this ? "(this Map)" : key); sb.append('='); sb.append(value == this ? "(this Map)" : value); if (!i.hasNext()) return sb.append('}').toString(); sb.append(',').append(' '); } }
5.测试结果如下:
测试结果:失败
总结: (1) map.toString 是通过 迭代器 和 StringBuilder(字符串缓冲区) 和 for(;;) 死循环实现的;
(2) for(;;) 死循环的效率 比 white(true) 死循环的效率高;
相关推荐
map.toString()后转换成Map类型
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...
Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...
private static SortedMap, Integer> mapSortByKey(Map, Integer> unsort_map) { ... result.put(unsort_key[i].toString(), unsort_map.get(unsort_key[i])); } return result.tailMap(result.firstKey()); }
每个项目我都必用的工具类,使用非常简单,放到项目目录中,java对象继承这个ToString类就可以,用在代码日志里特别方便,还支持过滤特定字段,满足日志保密性要求
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
Java经典编程源码例程,可以做为你的学习设计参考。 第1章 Java语言概述 1 实例001 输出“Hello World” 2 实例002 输出控制台传递的参数 2 实例003 输出由“*”组成的三角形 3 实例004 输出符号表情 5 第2章 ...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
主要介绍了Java源码解析Integer方法解读,包括toString方法、toUnsignedString方法、highestOneBit方法等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
java内常用包,date类,toString的使用方法
重写JAVA 程序 tostring()函数,以满足运行时跟综、排错,用log4j的trace级别输出,正常系统运行时不影响性能。 方便生产环境有问题时不停机排查。 主要用于VO或PO。
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...
主要介绍了Java Object toString方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
day01_JAVA语言概述与基本语法:标识符、变量也变量分类、源码_反码_补码、进制转换、编码与字符集 day02_基本语法.运算符:算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三元运算符、运算符优先级 ...
以下是对在JAVA中toString方法的作用进行了详细的分析介绍,需要的朋友可以参考下
java 的eclipse或idea等 定义变量时 直接引入lombok.jar包 在类外部 引入@AllArgsConstructor @NoArgsConstructor @Data 简便方法引入getter/setter/tostring等方法
String[] msg = l.get(i).toString().split(","); c = new Label(0, i, msg[0]); sheet.addCell(c); c = new Label(1, i, msg[1]); sheet.addCell(c); c = new Label(2, i, msg...
收集整理了一些toString的实现方式,相信其中一定有你喜欢的,还等什么赶紧下载吧,评论后积分返回