`

java Map toString() 源码解读测试

    博客分类:
  • java
阅读更多

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

   

 

   

 

  • 大小: 75.9 KB
  • 大小: 23.4 KB
  • 大小: 15.8 KB
  • 大小: 19.4 KB
0
0
分享到:
评论

相关推荐

    map.toString()后转换成Map类型

    ### Map.toString()后转换成Map类型的实现方法及解析 在Java编程中,有时我们需要将一个`Map`对象转换为字符串形式进行存储或传输,而在接收端又需要将该字符串重新转换回`Map`对象以便进一步处理。本篇将详细介绍...

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    jsonjava 源码和测试文件

    总的来说,`jsonjava`库是一个简洁高效的JSON处理工具,它的源码和测试文件为深入理解JSON在Java中的实现提供了很好的学习材料。通过研究这些文件,你可以了解到JSON数据结构如何映射到Java对象,以及如何在Java程序...

    最好的java对象ToString处理方案,ToString基类

    在给定的`标题`中提到的"最好的java对象ToString处理方案,ToString基类"指的是一个优化的`toString`实现,通过创建一个基类,让所有Java对象都可以轻松地继承并自定义其`toString`行为。 在`描述`中,提到这个工具...

    Java解析JSON源码

    Java解析JSON源码是Java开发中的重要一环,因为JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛应用于服务器与客户端之间的数据传输。本文将深入探讨如何在Java中解析JSON源码,以及如何利用...

    java源码包2

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java xml和map互转

    在Java编程中,XML(可扩展标记语言)是一种用于存储和传输数据的标准化格式,而Map是Java集合框架中的一个重要接口,它提供了键值对的数据结构。将XML与Map进行互转是常见的需求,特别是在处理配置文件或者进行数据...

    java toString ToStringBuilder ReflectionToStringBuilder

    在Java编程中,`toString()`方法是一个非常关键的成员函数,它用于返回对象的字符串表示形式,通常包含类名和对象的属性值。当我们需要打印或调试对象时,`toString()`方法尤其有用。本篇文章将深入探讨几种在Java中...

    Java经典编程源码基础例程300.zip

    Java经典编程源码例程,可以做为你的学习设计参考。 第1章 Java语言概述 1 实例001 输出“Hello World” 2 实例002 输出控制台传递的参数 2 实例003 输出由“*”组成的三角形 3 实例004 输出符号表情 5 第2章 ...

    java实现的map排序

    最后,通过调用map.toString()打印出排序后的Map,可以看到键值对是按照键的升序排列的。 需要注意的是,TreeMap在插入和删除元素时的性能为O(log(n)),而在查找时的性能为O(log(n))。如果需要频繁地插入、删除、...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java-遍历map

    在Java编程语言中,`Map`接口是一种非常重要的数据结构,用于存储键值对。它在实际应用中极为广泛,特别是在处理关联数据时。本文将深入探讨如何在Java中使用`keySet`方法来遍历`Map`集合,以及相关的知识点。 ### ...

    Java rt.jar源码

    Java的rt.jar源码是Java运行时库的核心组成部分,它包含了Java标准版(Java SE)中的大部分核心类库。rt.jar文件通常位于JDK安装目录的`jre/lib`或`lib`子目录下,其内容是Java开发和运行所必需的。由于rt.jar是二...

    Java1.6源码

    2. **集合框架**:Java 1.6的集合框架在`java.util`包中,包括`List`、`Set`、`Map`接口及其实现类如`ArrayList`、`LinkedList`、`HashSet`、`HashMap`等。源码分析可以揭示它们的内部数据结构和操作算法,比如`...

    java POI导出源码

    使用POI,可以通过循环遍历数据集(如List、Map或数组)并将数据填充到Cell对象中。例如,可以使用`cell.setCellValue()`方法设置单元格的文本内容。 4. **高级功能** - **公式支持**:POI允许在单元格中插入...

    Java Object toString方法原理解析

    Java Object toString方法原理解析 Java Object 的 toString 方法是每个 Java 开发者都应该了解的基础知识。本文将通过示例代码详细介绍 Java Object toString 方法的原理解析,帮助开发者更好地理解和应用此方法。...

    万能的toString

    在Java编程语言中,`toString()`方法是一个非常重要的工具,它允许对象转化为字符串形式,方便在控制台打印、日志记录或与其他字符串进行拼接。本文将深入探讨`toString()`方法,以及它在Java中的应用。 `toString...

    java中map集合的用法.doc

    Java中的Map接口是Java集合框架的重要组成部分,它用于存储键值对的数据结构。Map不同于List,List是以索引来访问元素,而Map则是通过键(key)来查找对应的值(value)。Map接口定义了一系列方法,使得我们可以对...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...

Global site tag (gtag.js) - Google Analytics