聊聊集合对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版权协议,转载请附上原文出处链接和本声明。