如何在Java中覆盖ArrayList的toString方法?

use*_*316 10 java overriding arraylist tostring

我想在Java中为ArrayList创建自己的toString()方法.但是,即使我将这样的toString()添加到包含ArrayList的类中,我也无法使其工作.

@Override
public String toString() {
    String result = "+";
    for (int i = 0; i < list.size(); i++) {
        result += " " + list.get(i);
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

当我像这样调用我的ArrayList时list.toString(),我仍然得到默认表示.我错过了什么吗?

sas*_*724 10

ArrayList<String> list = new ArrayList<String>()
{
    private static final long serialVersionUID = 1L;

    @Override public String toString()
    {
        return super.toString();
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的缺点是你必须创建一个匿名实现,每次你想要/需要这个= \时扩展`ArrayList`. (6认同)
  • 如果你真的需要它一次,它就不会真正有用= \. (3认同)

Lui*_*oza 9

你无法覆盖1toString方法.相反,你可以使用一个转换工具类的,你想/需要的方式.另一种选择是使用.ArrayListArrayListStringArrays.deepToString(yourList.toArray())

使用Java 8,可以非常轻松地完成:

//List<String> list
System.out.println(String.join(",", list));
Run Code Online (Sandbox Code Playgroud)

或者,如果您有List<Whatever>:

System.out.println(
    list.stream()
        .map(Whatever::getFieldX())
        .collect(Collectors.joining(", "))
);
Run Code Online (Sandbox Code Playgroud)

我仍然反对延伸ArrayList或类似,技术上可行,但我不认为这是一个不错的选择.


1你可以扩展ArrayList和覆盖toString但通常这不是一个好主意.更多信息:


ars*_*jii 6

你应该做点什么

public static String listToString(List<?> list) {
    String result = "+";
    for (int i = 0; i < list.size(); i++) {
        result += " " + list.get(i);
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

并将列表作为参数传递给listToString().你可以在技术上扩展ArrayList(使用匿名类或具体的类)并实现toString自己,但这似乎没有必要.

  • 通过在这里使用`StringBuilder`而不是`String`,您也可以获得性能提升. (5认同)

Den*_*hel 6

您需要编写一个从ArrayList扩展的类:

import java.util.ArrayList;

public class MyArrayList extends ArrayList {
    private static final long serialVersionUID = 1L;

    @Override
    public String toString() {
        String result = "+";
        for (int i = 0; i < this.size(); i++) {
            result += " " + this.get(i);
        }
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在其他用户尝试从中学习时,即使对于小示例代码也遵循 Java 命名约定是很好的。这里:类名应该以大写字母开头。在类名中包含“List”这个词也很好。 (2认同)