如何在Java中打印List的所有元素?

我试图打印List所有元素,但它是打印Object的指针而不是值。

这是我的打印代码…

 for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } 

任何人都可以请帮助我为什么不打印元素的价值。

下面是关于打印出列表组件的一些例子:

 public class ListExample { public static void main(String[] args) { List<Model> models = new ArrayList<>(); // TODO: First create your model and add to models ArrayList, to prevent NullPointerException for trying this example // Print the name from the list.... for(Model model : models) { System.out.println(model.getName()); } // Or like this... for(int i = 0; i < models.size(); i++) { System.out.println(models.get(i).getName()); } } } class Model { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 

下面是紧凑的,并避免在您的示例代码中的循环(并给你很好的逗号):

 System.out.println(Arrays.toString(list.toArray())); 

但是,正如其他人所指出的那样,如果您没有为列表中的对象实现明智的toString()方法,您将获得您正在观察的对象指针(实际上是哈希码)。 这是真的,无论他们是否在列表中。

从Java 8开始,Listinheritance了一个默认的“forEach”方法,您可以像这样将其与方法引用“System.out :: println”结合使用:

 list.forEach(System.out::println); 

Java 8 Streams方法…

 list.stream().forEach(System.out::println); 
 System.out.println(list);//toString() is easy and good enough for debugging. 

toString()AbstractCollection将是干净和容易的,做到这一点AbstractListAbstractList的子类, 所以不需要for循环,也不需要toArray()。

返回此集合的string表示forms。 string表示由集合元素的列表组成,它们按其迭代器返回的顺序包含在方括号中(“[]”)。 相邻的元素由字符“,”(逗号和空格)分隔。 通过String.valueOf(Object)将元素转换为string。

如果您在列表中使用任何自定义对象,请说学生,您需要重写它的toString()方法(重写此方法总是好的)以获得有意义的输出

看下面的例子:

 public class TestPrintElements { public static void main(String[] args) { //Element is String, Integer,or other primitive type List<String> sList = new ArrayList<String>(); sList.add("string1"); sList.add("string2"); System.out.println(sList); //Element is custom type Student st1=new Student(15,"Tom"); Student st2=new Student(16,"Kate"); List<Student> stList=new ArrayList<Student>(); stList.add(st1); stList.add(st2); System.out.println(stList); } } public class Student{ private int age; private String name; public Student(int age, String name){ this.age=age; this.name=name; } @Override public String toString(){ return "student "+name+", age:" +age; } } 

输出:

 [string1, string2] [student Tom age:15, student Kate age:16] 

列表中的对象必须有toString实现,才能打印出有意义的内容。

下面是一个快速testing,看看不同之处:

 public class Test { public class T1 { public Integer x; } public class T2 { public Integer x; @Override public String toString() { return x.toString(); } } public void run() { T1 t1 = new T1(); t1.x = 5; System.out.println(t1); T2 t2 = new T2(); t2.x = 5; System.out.println(t2); } public static void main(String[] args) { new Test().run(); } } 

当这个执行时,打印到屏幕上的结果是:

 t1 = Test$T1@19821f t2 = 5 

由于T1不会覆盖toString方法,所以它的实例t1打印出来的东西不是很有用。 另一方面,T2覆盖toString,所以我们控制它在I / O中使用时打印的内容,并在屏幕上看到一些更好的东西。

通过使用java 8的function…..

 import java.util.Arrays; import java.util.List; /** * @author AJMAL SHA * */ public class ForEach { public static void main(String[] args) { List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API"); (features).forEach(System.out::println); } } 

我认为首先你需要了解发生了什么事情。

  1. 你没有指定列表包含哪些元素,如果它是一个基本的数据types,那么你可以打印出来的元素。
  2. 但是如果元素是对象,那么Kshitij Mehta提到你需要在对象中实现(覆盖)方法“toString” – 如果它没有被实现 – 让它从对象中返回完整的东西,例如:

     class Person { private String firstName; private String lastName; @Override public String toString() { return this.firstName + " " + this.lastName; } } 

System.out.println(list); 为我工作。

这是一个完整的例子:

 import java.util.List; import java.util.ArrayList; public class HelloWorld { public static void main(String[] args) { final List<String> list = new ArrayList<>(); list.add("Hello"); list.add("World"); System.out.println(list); } } 

它会打印[Hello, World]

  list.stream().map(x -> x.getName()).forEach(System.out::println); 

我写了一个转储函数,它基本上打印出一个对象的公共成员,如果它没有覆盖toString()。 人们可以很容易地扩展它来调用getter。 的Javadoc:

将给定的Object转储到System.out,使用以下规则:

  • 如果对象是Iterable,它的所有组件都被转储。
  • 如果Object或它的一个超类覆盖toString(),则“toString”被转储
  • 否则该方法将被recursion调用,以供Object的所有公共成员使用
 /** * Dumps an given Object to System.out, using the following rules:<br> * <ul> * <li> If the Object is {@link Iterable}, all of its components are dumped.</li> * <li> If the Object or one of its superclasses overrides {@link #toString()}, the "toString" is dumped</li> * <li> Else the method is called recursively for all public members of the Object </li> * </ul> * @param input * @throws Exception */ public static void dump(Object input) throws Exception{ dump(input, 0); } private static void dump(Object input, int depth) throws Exception{ if(input==null){ System.out.print("null\n"+indent(depth)); return; } Class<? extends Object> clazz = input.getClass(); System.out.print(clazz.getSimpleName()+" "); if(input instanceof Iterable<?>){ for(Object o: ((Iterable<?>)input)){ System.out.print("\n"+indent(depth+1)); dump(o, depth+1); } }else if(clazz.getMethod("toString").getDeclaringClass().equals(Object.class)){ Field[] fields = clazz.getFields(); if(fields.length == 0){ System.out.print(input+"\n"+indent(depth)); } System.out.print("\n"+indent(depth+1)); for(Field field: fields){ Object o = field.get(input); String s = "|- "+field.getName()+": "; System.out.print(s); dump(o, depth+1); } }else{ System.out.print(input+"\n"+indent(depth)); } } private static String indent(int depth) { StringBuilder sb = new StringBuilder(); for(int i=0; i<depth; i++) sb.append(" "); return sb.toString(); } 

为String的数组列表

 list.forEach(s -> System.out.println(Arrays.toString((String[]) s ))); 
  List<String> textList= messageList.stream() .map(Message::getText) .collect(Collectors.toList()); textList.stream().forEach(System.out::println); public class Message { String name; String text; public Message(String name, String text) { this.name = name; this.text = text; } public String getName() { return name; } public String getText() { return text; } } 
 public static void main(String[] args) { answer(10,60); } public static void answer(int m,int k){ AtomicInteger n = new AtomicInteger(m); Stream<Integer> stream = Stream.generate(() -> n.incrementAndGet()).limit(k); System.out.println(Arrays.toString(stream.toArray())); } 

根据是否需要独立列出值,可以使用以下2个选项:

 System.out.println(listName.get(i).toString()); 

输出:

71

839

1471

6857

或者如果你不关心结果是否单独列出,你可以使用

 System.out.println(listName.toString()); 

输出:[71,839,1471,6857]

看到这个在行动,这是我正在捣鼓的代码…

  public static void main(String[] args) { final long Original = 600851475143L; long numberToEval=0; long remains = 1; List<Integer> factors = new ArrayList<Integer>(); numberToEval = Original; while((remains < Original) && (remains != 0)) { remains = breakDown(numberToEval); if(remains > 0){ factors.add((int) remains); numberToEval = numberToEval / remains; } } remains = numberToEval; factors.add((int) remains); for(int i = 0; i < factors.size(); i++) { System.out.println(factors.toString()); } } static long breakDown (long numPass) { long myNum = numPass; long startPoint = (myNum / 2); for(long x = 2; x < startPoint; x++) { if(myNum % x == 0) { numPass = x; x = startPoint+1; System.out.println(numPass); } } if(myNum == numPass) { return 0; } else { return numPass; } } 

尝试重写toString()方法,因为您希望该元素将被打印。 所以打印的方法可以是这样的:

 for(int i=0;i<list.size();i++){ System.out.println(list.get(i).toString()); }