項目中需將 ArrayList<ArrayList<Integer>> 轉為格式化字符串:[[1,2,3],[2,3,5]] → "[1,2,3]#[2,3,5]"。直接調用 toString() 發現輸出為 [1, 2]#[2, 3](逗號後有空格),不符合預期。
@Override
public String toString() {
if (isEmpty()) return "[]";
StringBuilder buffer = new StringBuilder(size() * 16);
buffer.append('[');
Iterator<?> it = iterator();
while (it.hasNext()) {
Object next = it.next();
if (next != this) {
buffer.append(next);
} else {
buffer.append("(this Collection)");
}
if (it.hasNext()) {
buffer.append(", "); // 關鍵:逗號+空格分隔
}
}
buffer.append(']');
return buffer.toString();
}
", "(逗號+空格)分隔(this Collection) 避免無限遞歸ArrayList<Object> c = new ArrayList<>(); c.add(1); c.add(2); c.add(c); // 將集合加入自身 System.out.println(c); // 輸出: [1, 2, (this Collection)]
無法修改 JDK 源碼時,可後處理字符串:
String result = list.toString().replaceAll(" ", "");
// "[1, 2]#[2, 3]" → "[1,2]#[2,3]"
public String toString() {
return getClass().getName() + '@' + Integer.toHexString(hashCode());
}
// 輸出示例: java.lang.Object@e23e786
未重寫時返回:類全名 + @ + 哈希碼十六進制
| 類 | 實現邏輯 | 線程安全 | 效能 |
|---|---|---|---|
| String | 直接返回 this | 不可變,天然安全 | N/A |
| StringBuilder | 調用父類 AbstractStringBuilder.toString() | 非線程安全 | 高 |
| StringBuffer | 調用父類 AbstractStringBuilder.toString(),方法同步 | 線程安全 | 較低 |
public String toString() {
Iterator<Entry<K,V>> i = entrySet().iterator();
if (!i.hasNext()) return "{}";
StringBuilder sb = new StringBuilder();
sb.append('{');
for (;;) {
Entry<K,V> e = i.next();
K key = e.getKey();
V 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(' '); // 同樣使用逗號+空格
}
}
輸出格式:{key1=value1, key2=value2}
toString() 默認格式(特別是分隔符)toString() 提供業務含義