关于java的容器类 list,map等的toString()方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java的容器类 list,map等的toString()方法相关的知识,希望对你有一定的参考价值。

写代码的时候,经常使用list和map的toString()方法,但是跟到list,map的源码的时候怎么找也找不到重写的toString()啊,而且api上list和map也没有重写toString()这个方法啊,那为什么直接打印出list和map都是可读性很好的形式呢?

List<Student> list = new ArrayList<>();
System.out.println(list.toString());


1. 打印的是list.toString(),但简单说是“编译看左面,运行看右面”,深入说是运行期方法的动态分派,所以执行的是ArrayList类的toString()方法。


2.ArrayList继承AbstractList


3.AbstractList继承AbstractCollention

4.AbstractCollention中重写了toString()方法

参考技术A 我今天也遇到了同样的问题,翻了下api搞懂了一点。
List是一个接口,你使用List肯定没法直接new一个对象出来,常见的是new一个ArrayList类的对象,向上转型赋给List接口的对象。那所以在调用List接口对象的toString方法也就是在调用ArrayList的toString方法了。
我查了jdk的api,发现所有实现了List接口的类,只有CopyOnWriteArrayList这个类不是同时继承自AbstractCollection类的。其他实现了List接口的类都同时继承自AbstractCollection类,所以它们都有AbstractCollection类的toString方法。
而且,CopyOnWriteArrayList类虽然没有继承AbstractCollection类,但是自己重写了toString方法。
所以,使用到List对象的地方肯定是一个上转型对象,否则无法实例化,而所有的实现List接口的类都有一个重写后的toString方法。因此,即使没看到List接口有对toString的定义,它的对象却有着可读性强的toString方法。
参考技术B 可能你是刚学习这门语言吧?其实很简单就可以知道答案了啊.设个断点,然后一步步F5(eclipse环境下)不就知道答案了吗?

当然我得承认我一开始想当然地认为在所有的集合类的总父接口里统一override了toString()方法.断点一看才知道不是这么回事,
事实上,是在这个类里实现的:
public abstract class AbstractCollection<E> implements Collection<E>

在其中有一个toString()的重写
public String toString()
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]";

StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;)
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");



建议你自己随便新建一个list或者map什么的,用断点的方法去看看程序到底怎么走的.追问

确实是调用了AbstractCollection类里的toString()方法,但是list是怎么调用AbstractCollection里的toString()方法的呢,list又不是继承于AbstractCollection,请教?

追答

晕.那就讲详细点咯.

这个就是我们平时说的System.out.println()会对非String类型的内容自动分析作不同的动作.

你F3一路追踪println就可以看到这个签名的类了
public class PrintStream extends FilterOutputStream

里面的细节你自己体会下,我直接讲了反而没啥效果了

本回答被提问者采纳
参考技术C

1.List 中常用的ArrayList的toString()  继承于abstract class AbstractCollection 这个类

public String toString()
    
        Iterator iterator1 = iterator();
        if(!iterator1.hasNext())
            return "[]";
        StringBuilder stringbuilder = new StringBuilder();
        stringbuilder.append('[');
        do
        
            Object obj = iterator1.next();
            stringbuilder.append(obj != this ? obj : "(this Collection)");
            if(!iterator1.hasNext())
                return stringbuilder.append(']').toString();
            stringbuilder.append(", ");
         while(true);
    

2.Map 中常用的HashMap的toString() 继承于abstract class AbstractMap 这个类

public String toString()
    
        Iterator iterator = entrySet().iterator();
        if(!iterator.hasNext())
            return "";
        StringBuilder stringbuilder = new StringBuilder();
        stringbuilder.append('');
        do
        
            Map.Entry entry = (Map.Entry)iterator.next();
            Object obj = entry.getKey();
            Object obj1 = entry.getValue();
            stringbuilder.append(obj != this ? obj : "(this Map)");
            stringbuilder.append('=');
            stringbuilder.append(obj1 != this ? obj1 : "(this Map)");
            if(!iterator.hasNext())
                return stringbuilder.append('').toString();
            stringbuilder.append(", ");
         while(true);
    

参考技术D 创建一个List list = new xxxList( );
调用list.toString();实际上是调用的xxxList的toString方法,因为list在编译的时候是List在运行的时候就是xxxList,而xxxList继承了AbstractCollection,AbstractCollection重写了toString方法

以上是关于关于java的容器类 list,map等的toString()方法的主要内容,如果未能解决你的问题,请参考以下文章

Java 容器源码分析之 Map

总结的一些json格式和对象/String/Map/List等的互转工具类

java容器的一些存取用法

Java--容器认识

Java--容器认识

Java容器类