介绍
在Java开发中,我们常常需要将一个List对象中的元素转成字符串进行显示或者存储等操作。而List类中提供了一个toString方法,用于将List对象转成字符串形式返回。但是,这个方法的实现方式可能会让我们产生一些疑惑。在本文中,我们将会从多个方面详细阐述如何正确地使用List.toString方法。
正文
一、List.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(',').append(' '); } }
List.toString方法的实现原理是通过遍历List中的元素,依次将元素放入一个StringBuilder对象中,并在中间添加逗号和空格,最终将整个StringBuilder对象转成字符串形式返回。需要注意的是,如果List对象中的元素是Collection类型,List.toString方法会把该元素表示为"(this Collection)",这个结果可能导致一些误解。
二、使用List.toString方法需要注意的点
1. List对象为空的情况
当List对象为空时,List.toString方法返回的字符串为"[]",也就是一个空集合。这个结果可能是我们所期望的,但是在一些情况下,例如在日志输出中,我们可能需要更直观的提示。因此,建议在使用List.toString方法之前先进行判空操作,以避免这个问题。
2. List对象中元素的类型
List对象中的元素可以为任意类型,但是如果元素的类型为自定义类型,则要确保该类型正确地实现了toString方法。否则,List.toString方法会输出该元素的内存地址而不是元素的具体值。
public class Person { private String name; private int age; // constructor, getter/setter methods... public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } List<Person> list = new ArrayList<>(); list.add(new Person("Tom", 20)); list.add(new Person("Jerry", 22)); System.out.println(list.toString()); // 输出:[Person{name='Tom', age=20}, Person{name='Jerry', age=22}]
3. List对象中含有Collection类型的元素
如果List对象中含有Collection类型的元素,那么List.toString方法会将该元素表示为"(this Collection)"。这个结果可能会让我们产生一些疑惑。因此,在使用List.toString方法时,要注意判断List对象中是否含有Collection类型的元素,并且对含有Collection类型元素的情况进行单独处理。
List<List<Integer>> list = new ArrayList<>(); list.add(Arrays.asList(1, 2)); list.add(Arrays.asList(3, 4)); System.out.println(list.toString()); // 输出:[[1, 2], [3, 4]] Map<String, List<Integer>> map = new HashMap<>(); map.put("list1", Arrays.asList(1, 2)); map.put("list2", Arrays.asList(3, 4)); System.out.println(map.toString()); // 输出:{list1=[1, 2], list2=[3, 4]}
4. List对象中含有Null元素
如果List对象中含有Null元素,List.toString方法会将该元素表示为"null"。这个结果可能会让我们产生一些误解。因此,在使用List.toString方法时,要注意判断List对象中是否含有Null元素,并且对含有Null元素的情况进行单独处理。
List<String> list = new ArrayList<>(); list.add("Tom"); list.add(null); System.out.println(list.toString()); // 输出:[Tom, null]
三、自定义List.toString方法
由于List.toString方法的输出结果可能会让我们产生一些疑惑,因此,在一些情况下,我们需要自定义List.toString方法,以适应我们的需求。自定义List.toString方法的原理也很简单,即通过遍历List中的元素,依次将元素转成字符串形式拼接起来,并加上适当的符号。
public class CustomList<E> extends ArrayList<E> { public String toString() { if (isEmpty()) { return "[]"; } StringBuilder sb = new StringBuilder(); sb.append("["); for (int i = 0; i < size(); i++) { E e = get(i); if (e == this) { sb.append("(this Collection)"); } else if (e == null) { sb.append("null"); } else { sb.append(e.toString()); } if (i != size() - 1) { sb.append(", "); } } sb.append("]"); return sb.toString(); } } List<String> list = new CustomList<>(); list.add("Tom"); list.add("Jerry"); System.out.println(list.toString()); // 输出:[Tom, Jerry]
结论
List.toString方法是一个非常常用的方法,但是在使用过程中还是需要注意到它的一些细节,以免产生误解。在一些情况下,我们还需要自定义List.toString方法以适应我们的需求。