java-集合-toString方法

聊聊集合对toString的重写

今天用java写一道算法题玩玩,然后碰到了利用tostring转化格式的问题,然后就看看toString

起源

public abstract class AbstractCollection
extends Objectimplements Collection

toString是在java.util.AbstractCollection类下的一个方法,这个类主要实现collection接口,而且文档说是骨干实现,这个类包含了

 boolean add(E e) 
          确保此 collection 包含指定的元素(可选操作)。 
 boolean addAll(Collection<? extends E> c) 
          将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 
 void clear() 
          移除此 collection 中的所有元素(可选操作)。 
 boolean contains(Object o) 
          如果此 collection 包含指定的元素,则返回 true。 
 boolean containsAll(Collection<?> c) 
          如果此 collection 包含指定 collection 中的所有元素,则返回 true。 
 boolean isEmpty() 
          如果此 collection 不包含元素,则返回 true。 
abstract  Iterator<E> iterator() 
          返回在此 collection 中的元素上进行迭代的迭代器。 
 boolean remove(Object o) 
          从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 
 boolean removeAll(Collection<?> c) 
          移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 
 boolean retainAll(Collection<?> c) 
          仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 
abstract  int size() 
          返回此 collection 中的元素数。 
 Object[] toArray() 
          返回包含此 collection 中所有元素的数组。 
<T> T[] 
 toArray(T[] a) 
          返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。 
 String toString()  
  返回此 collection 的字符串表示形式。

总共14个添加或覆盖的方法,
主要介绍为

返回此 collection 的字符串表示形式。该字符串表示形式由 collection 元素的列表组成,这些元素按其迭代器返回的顺序排列,并用方括号 ("[]") 括起来。相邻元素由字符 ", "(逗号加空格)分隔。通过 String.valueOf(Object) 可以将元素转换成字符串。 

覆盖:
类 Object 中的 toString
返回:
此 collection 的字符串表示形式

我有点疑惑,它源码里面是不是调用了String.valueof(Object),那就看看吧

package java.util;下的AbstractCollection抽象类

 public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            //集合就加集合,元素就加元素
            sb.append(e == this ? "(this Collection)" : e);
            //结尾
            if (! it.hasNext())
                return sb.append(']').toString();
			//加逗号
            sb.append(',').append(' ');
        }
    }

原来集合里面的toString重写是用StringBuilder一个一个加出来的
集合的toString原来使用了StringBuffer的toString
得,集合转字符串那么多方法还是用StringBuilfer()做吧

public static void main(String[] args) {
		LinkedList<Character> list = new LinkedList();
		list.add('a');
		list.add('b');
		
		StringBuffer buffer = new StringBuffer();
		Iterator<Character> it = list.iterator();
		while(it.hasNext()){
			buffer.append(it.next());
		}
		System.out.println(buffer.toString());	
	}

这是StringBuffer的toString,返回了一个新的字符串

public synchronized String toString() {
        if (toStringCache == null) {
            toStringCache = Arrays.copyOfRange(value, 0, count);
        }
        return new String(toStringCache, true);
    }

复制方式是这个

public static char[] copyOfRange(char[] original, int from, int to) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        char[] copy = new char[newLength];
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }
上面这个利用 public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);复制的数组

总结:集合的tostring改写可以用StringBuffer,原理上用arraycopy复制数组,在生成一个新的字符串


版权声明:本文为m0_37687058原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。