`

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源码包---java 源码 大量 实例

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

    JAVA上百实例源码以及开源项目源代码

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

    对于java map类排序

    private static SortedMap, Integer&gt; mapSortByKey(Map, Integer&gt; unsort_map) { ... result.put(unsort_key[i].toString(), unsort_map.get(unsort_key[i])); } return result.tailMap(result.firstKey()); }

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

    每个项目我都必用的工具类,使用非常简单,放到项目目录中,java对象继承这个ToString类就可以,用在代码日志里特别方便,还支持过滤特定字段,满足日志保密性要求

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java源码包2

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

    java源码包4

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

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

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

    java源码包3

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

    Java源码解析Integer方法解读

    主要介绍了Java源码解析Integer方法解读,包括toString方法、toUnsignedString方法、highestOneBit方法等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    java常用包。Date类,tostring方法视频

    java内常用包,date类,toString的使用方法

    bean运行时跟综实例-TOSTRING

    重写JAVA 程序 tostring()函数,以满足运行时跟综、排错,用log4j的trace级别输出,正常系统运行时不影响性能。 方便生产环境有问题时不停机排查。 主要用于VO或PO。

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

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

    Java Object toString方法原理解析

    主要介绍了Java Object toString方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java7hashmap源码-java:Java

    day01_JAVA语言概述与基本语法:标识符、变量也变量分类、源码_反码_补码、进制转换、编码与字符集 day02_基本语法.运算符:算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三元运算符、运算符优先级 ...

    浅析JAVA中toString方法的作用

    以下是对在JAVA中toString方法的作用进行了详细的分析介绍,需要的朋友可以参考下

    java简便方法引入getter/setter/tostring等方法

    java 的eclipse或idea等 定义变量时 直接引入lombok.jar包 在类外部 引入@AllArgsConstructor @NoArgsConstructor @Data 简便方法引入getter/setter/tostring等方法

    java处理execl表格源码

    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...

    java toString ToStringBuilder ReflectionToStringBuilder

    收集整理了一些toString的实现方式,相信其中一定有你喜欢的,还等什么赶紧下载吧,评论后积分返回

Global site tag (gtag.js) - Google Analytics