1. 编写一个单元测试类

 @Testpublic 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)进行测试

(最终代码实现)

 @Testpublic 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) 死循环的效率高;

java Map toString() 源码解读测试相关推荐

  1. Java Review - PriorityQueue源码解读

    文章目录 Pre PriorityQueue 概述 PriorityQueue 继承关系 PriorityQueue通过用数组表示的小顶堆实现 时间复杂度 构造函数 方法 add()和offer() ...

  2. Java Review - LinkedList源码解读

    文章目录 Pre 概述 底层数据结构-双向链表 源码解析 构造函数 方法源码分析 getFirst() getLast() remove相关方法 remove(e) remove(index) rem ...

  3. java基本集合源码解读-JDK8/11

    文章目录 前言 详尽的debugger底层查看源码配置 一.集合体系图 二.List类集合 2.1.1 ArrayList 2.1.2ArrayList底层源码分析 结论: 2.1.3 使用Array ...

  4. Java Review - ArrayList 源码解读

    文章目录 概述 方法的执行效率 源码剖析 底层数据结构 -数组 构造函数 自动扩容机制 set() get add()/addAll() remove() trimToSize() indexOf() ...

  5. Java Review - Queue和Stack 源码解读

    文章目录 Pre 概述 Queue Deque ArrayDeque 一览 构造函数 属性 方法 addFirst() addLast() pollFirst() pollLast() peekFir ...

  6. jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现

    jdk1.8.0_45源码解读--Map接口和AbstractMap抽象类的实现 一. Map架构 如上图: (01) Map 是映射接口,Map中存储的内容是键值对(key-value). (02) ...

  7. 【JVM】Java类加载器设计原理(ClassLoader源码解读/ SPI机制/ 绕开双亲委派/ 常见Java虚拟机)

    目录 1. 什么是类加载器 2. 类加载器加载的过程 3. Class文件读取来源 4. 类加载器的分类 5. 那些操作会初始化类加载器 6. 类加载器的双亲委派机制 6.1 双亲委派机制机制的好处 ...

  8. Java Review - LinkedHashMap LinkedHashSet 源码解读

    文章目录 Pre 概述 数据结构 类继承关系 构造函数 方法 get() put() remove() LinkedHashSet 使用案例 - FIFO策略缓存 Pre Java Review - ...

  9. Java Review - HashMap HashSet 源码解读

    文章目录 概述 HashMap结构图 构造函数 重点方法源码解读 (1.7) put() get() remove() 1.8版本 HashMap put resize() 扩容 get HashSe ...

最新文章

  1. 圆平移后的方程变化_1.1 直角坐标系中的平移变换与伸缩变换
  2. LeetCode 313. 超级丑数(动态规划)
  3. mysql group by null_MySQL无GROUP BY直接HAVING返回空的问题分析
  4. oracle registers,【案例】Oracle RAC强制删除node节点过程的详细笔记
  5. vue-props入门
  6. win32com模块
  7. Labelimg讲解
  8. Prometheus(四)——Alertmanager
  9. SDH原理--1.SDH概述
  10. Mac Docker配置阿里云镜像(最新)
  11. 骨传导品牌排行榜前十名,2022十大骨传导耳机品牌
  12. cJSON详细剖析(四)----cJSON_Print()函数
  13. C/C++就业领域与学习方向 | 学习计划
  14. 怎样使用PS制作木刻效果图片?添加木刻特效原来这么简单!
  15. 6GK5116-0BA00-2AB2的技术参数说明
  16. 携手阿里和暴风重磅发布的小辣椒PLAYER到底有哪些黑科技?
  17. 【专家Insight】行动的力量:CDO的数字化转型行动指南
  18. Python绘制万花筒
  19. [数学学习笔记]无穷小与无穷大
  20. 发布:程序员导航网站建成之程序发布上线

热门文章

  1. 企业IT项目开发之七宗罪(下篇)
  2. 好看的html5播放器,7 款超具个性的 HTML5 播放器
  3. vue实现聊天框,模拟对话附上html
  4. Matlab一元二次方程求根
  5. 现代远程教育入学指南(石油大学)--高等数学(二)在线作业
  6. IC失效分析芯片测试
  7. 打卡3本书10句话-20
  8. 安卓ImageView镜像翻转
  9. 路由器输入正确的dns服务器,路由器里的dns服务器填写原则?-DNS
  10. java多态注意事项(陷进)