Can anybody explain to me the concept of the toString() method, defined in the Object class? How is it used, and what is its purpose?
Coding:
public class Test {
    public static void main(String args[]) {
        ArrayList<Student> a = new ArrayList<Student>();
        a.add(new Student("Steve", 12, "Daniel"));
        a.add(new Student("Sachin", 10, "Tendulkar"));
        System.out.println(a);
        display(a);
    }
    static void display(ArrayList<Student> stu) {
        stu.add(new Student("Yuvi", 12, "Bhajji"));
        System.out.println(stu);
    }
}
Student.java:
public class Student {
    public String name;
    public int id;
    public String email;
    Student() {
    }
    Student(String name, int id, String email) {
        this.name = name;
        this.id = id;
        this.email = email;
    }
     public String toString(){           //using these toString to avoid the output like this [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]
          return name+" "+id+" "+email;     
         }  
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name=name;
    }
    public int getId(){
        return id;
    }
    public void setId(int id){
        this.id=id;
    }
    public String getEmail(){
        return email;
    }
    public void setEmail(String email){
        this.email=email;
    }
}
Output:
[Steve 12 Daniel, Sachin 10 Tendulkar]
[Steve 12 Daniel, Sachin 10 Tendulkar, Yuvi 12 Bhajji]
If you are not used toString() in Pojo(Student.java) class,you will get an output like [com.steve.test.Student@6e1408, com.steve.test.Student@e53108].To avoid these kind of issue we are using toString() method.
From the Object.toString docs:
Returns a string representation of the object. In general, the
toStringmethod returns a string that "textually represents" this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method.The
toStringmethod for classObjectreturns a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Example:
String[] mystr ={"a","b","c"};
System.out.println("mystr.toString: " + mystr.toString());
output:- mystr.toString: [Ljava.lang.String;@13aaa14a
                                                                        Apart from what cletus answered with regards to debugging, it is used whenever you output an object, like when you use
 System.out.println(myObject);
or
System.out.println("text " + myObject);
                                                                        If you learn Python first and then Java. I think it plays the same role as __str__() method in Python, it is a magic method like __dict__() and __init__() but to refer to a string representing the the object. 
Correctly overridden toString method can help in logging and debugging of Java.
the toString() converts the specified object to a string value.