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类型的实现方法及解析 在Java编程中,有时我们需要将一个`Map`对象转换为字符串形式进行存储或传输,而在接收端又需要将该字符串重新转换回`Map`对象以便进一步处理。本篇将详细介绍...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...
总的来说,`jsonjava`库是一个简洁高效的JSON处理工具,它的源码和测试文件为深入理解JSON在Java中的实现提供了很好的学习材料。通过研究这些文件,你可以了解到JSON数据结构如何映射到Java对象,以及如何在Java程序...
在给定的`标题`中提到的"最好的java对象ToString处理方案,ToString基类"指的是一个优化的`toString`实现,通过创建一个基类,让所有Java对象都可以轻松地继承并自定义其`toString`行为。 在`描述`中,提到这个工具...
Java解析JSON源码是Java开发中的重要一环,因为JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛应用于服务器与客户端之间的数据传输。本文将深入探讨如何在Java中解析JSON源码,以及如何利用...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
在Java编程中,XML(可扩展标记语言)是一种用于存储和传输数据的标准化格式,而Map是Java集合框架中的一个重要接口,它提供了键值对的数据结构。将XML与Map进行互转是常见的需求,特别是在处理配置文件或者进行数据...
在Java编程中,`toString()`方法是一个非常关键的成员函数,它用于返回对象的字符串表示形式,通常包含类名和对象的属性值。当我们需要打印或调试对象时,`toString()`方法尤其有用。本篇文章将深入探讨几种在Java中...
Java经典编程源码例程,可以做为你的学习设计参考。 第1章 Java语言概述 1 实例001 输出“Hello World” 2 实例002 输出控制台传递的参数 2 实例003 输出由“*”组成的三角形 3 实例004 输出符号表情 5 第2章 ...
最后,通过调用map.toString()打印出排序后的Map,可以看到键值对是按照键的升序排列的。 需要注意的是,TreeMap在插入和删除元素时的性能为O(log(n)),而在查找时的性能为O(log(n))。如果需要频繁地插入、删除、...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
在Java编程语言中,`Map`接口是一种非常重要的数据结构,用于存储键值对。它在实际应用中极为广泛,特别是在处理关联数据时。本文将深入探讨如何在Java中使用`keySet`方法来遍历`Map`集合,以及相关的知识点。 ### ...
Java的rt.jar源码是Java运行时库的核心组成部分,它包含了Java标准版(Java SE)中的大部分核心类库。rt.jar文件通常位于JDK安装目录的`jre/lib`或`lib`子目录下,其内容是Java开发和运行所必需的。由于rt.jar是二...
2. **集合框架**:Java 1.6的集合框架在`java.util`包中,包括`List`、`Set`、`Map`接口及其实现类如`ArrayList`、`LinkedList`、`HashSet`、`HashMap`等。源码分析可以揭示它们的内部数据结构和操作算法,比如`...
使用POI,可以通过循环遍历数据集(如List、Map或数组)并将数据填充到Cell对象中。例如,可以使用`cell.setCellValue()`方法设置单元格的文本内容。 4. **高级功能** - **公式支持**:POI允许在单元格中插入...
Java Object toString方法原理解析 Java Object 的 toString 方法是每个 Java 开发者都应该了解的基础知识。本文将通过示例代码详细介绍 Java Object toString 方法的原理解析,帮助开发者更好地理解和应用此方法。...
在Java编程语言中,`toString()`方法是一个非常重要的工具,它允许对象转化为字符串形式,方便在控制台打印、日志记录或与其他字符串进行拼接。本文将深入探讨`toString()`方法,以及它在Java中的应用。 `toString...
Java中的Map接口是Java集合框架的重要组成部分,它用于存储键值对的数据结构。Map不同于List,List是以索引来访问元素,而Map则是通过键(key)来查找对应的值(value)。Map接口定义了一系列方法,使得我们可以对...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...