Overriding toString() method to print values of ArrayList in Java

In this article, we will discuss and understand why we need to override toString() method for displaying ArrayList contents

Problem statement:

  • Assume that we want to store number of Employee records into Collection, preferably ArrayList for faster access
  • So, whenever we retrieve Employee records then it must print in certain format

Here, there are 2 cases to be considered to understand the importance of toString() method

 

Case 1: provide and implement toString() method in Employee class

  • Simply, override toString() method
  • Provide/code format details inside toString() method implementation

Let’s start with coding to implement above solution

Employee class

  • Contains four attributes namely Id, name, age, designation
  • 4-arg parameterized constructor
  • Overrides toString() method providing format detail to print employee information

Employee.java

package in.bench.resources.override.tostring;

public class Employee {

	// member variables
	private int employeeId;
	private String employeeName;
	private int employeeAge;
	private String employeeDesignation;

	// 4-arg parameterized constructor
	public Employee(int employeeId, String employeeName,
			int employeeAge, String employeeDesignation) {
		super();
		this.employeeId = employeeId;
		this.employeeName = employeeName;
		this.employeeAge = employeeAge;
		this.employeeDesignation = employeeDesignation;
	}

	// override toString() method
	@Override
	public String toString() {
		return "Employee [employeeId=" + employeeId 
				+ ", employeeName=" + employeeName 
				+ ", employeeAge=" + employeeAge
				+ ", employeeDesignation=" + employeeDesignation
				+ "]";
	}
}

 

Main class – to store and retrieve employee records

  • This class is used to store and retrieve employee records
  • ArrayList stores all employee records
  • Enhanced forEach loop is used to retrieve employee records

StoreAndRetrieveEmployeeRecords.java

package in.bench.resources.override.tostring;

import java.util.ArrayList;

public class StoreAndRetrieveEmployeeRecords {

	public static void main(String[] args) {

		// create ArrayList object to store employee records
		ArrayList<Employee> empRecords = new ArrayList<Employee>();

		// add employee records to AL object
		empRecords.add(new Employee(101, "SJ", 19, "Writer"));
		empRecords.add(new Employee(102, "RS", 17, "Developer"));
		empRecords.add(new Employee(103, "ZR", 25, "Supporter"));
		empRecords.add(new Employee(104, "IL", 27, "Manager"));
		empRecords.add(new Employee(105, "SR", 15, "Marketer"));

		// retrieving employee records using enhanced forEach loop
		for(Employee emp : empRecords) {
			System.out.println(emp);
		}
	}
}

Output:

Employee [employeeId=101, employeeName=SJ, employeeAge=19,
employeeDesignation=Writer]

Employee [employeeId=102, employeeName=RS, employeeAge=17, 
employeeDesignation=Developer]

Employee [employeeId=103, employeeName=ZR, employeeAge=25, 
employeeDesignation=Supporter]

Employee [employeeId=104, employeeName=IL, employeeAge=27, 
employeeDesignation=Manager]

Employee [employeeId=105, employeeName=SR, employeeAge=15, 
employeeDesignation=Marketer]

 

Case 2: Going back to our actual question

Why we need to override toString() method for displaying ArrayList contents ?

  • In the above example Case 1, we have overridden toString() method
  • And also provided implementation detail to print employee information in certain format
  • Because of overridden toString() method, we can display employee information in the desired format
  • Let’s us move forward and see what would have happened, if we haven’t overridden toString() method

Employee class

  • This is the same employee class, containing 4 attributes namely Id, name, age, designation
  • 4-arg parameterized constructor
  • But doesn’t override toString() method
  • Which means, default toString() method of Object class will get invoked

Employee.java

package in.bench.resources.override.tostring;

public class Employee {

	// member variables
	private int employeeId;
	private String employeeName;
	private int employeeAge;
	private String employeeDesignation;

	// 4-arg parameterized constructor
	public Employee(int employeeId, String employeeName, 
			int employeeAge, String employeeDesignation) {
		super();
		this.employeeId = employeeId;
		this.employeeName = employeeName;
		this.employeeAge = employeeAge;
		this.employeeDesignation = employeeDesignation;
	}
}

Note: doesn’t overrides toString() method

 

Main class – to store and retrieve employee records

  • This is very same class used in the Case 1

StoreAndRetrieveEmployeeRecords.java

package in.bench.resources.override.tostring;

import java.util.ArrayList;

public class StoreAndRetrieveEmployeeRecords {

	public static void main(String[] args) {

		// create ArrayList object to store employee records
		ArrayList<Employee> empRecords = new ArrayList<Employee>();

		// add employee records to AL object
		empRecords.add(new Employee(101, "SJ", 19, "Writer"));
		empRecords.add(new Employee(102, "RS", 17, "Developer"));
		empRecords.add(new Employee(103, "ZR", 25, "Supporter"));
		empRecords.add(new Employee(104, "IL", 27, "Manager"));
		empRecords.add(new Employee(105, "SR", 15, "Marketer"));

		// retrieving employee records using enhanced forEach loop
		for(Employee emp : empRecords) {
			System.out.println(emp);
		}
	}
}

Output:

in.bench.resources.override.tostring.Employee@1db9742
in.bench.resources.override.tostring.Employee@106d69c
in.bench.resources.override.tostring.Employee@52e922
in.bench.resources.override.tostring.Employee@25154f
in.bench.resources.override.tostring.Employee@10dea4e

 

Conclusion:

  • Have you noticed, what is getting printed in the output console without toString() method
  • It is each employee object representation in hexadecimal format i.e.;
  • Qualified_class_name@HashCode_in_HEX_format (i.e.; class-name followed by @ symbol and then hashcode of the Object in hexadecimal format)
  • Therefore, it is very necessary to override toString() method to print values of the ArrayList Object in desired format

 

Alternate Way:

One other way, where we can get rid of implementing toString() method to print ArrayList values, is to include getter & setter methods and invoke setter and getter to set & retrieve values accordingly.

Hope, you found this article very helpful. If you have any suggestion or want to contribute any other way or tricky situation you faced during Interview hours, then share with us. We will include that code here.

 

Happy Coding !!
Happy Learning !!

How to left pad with zeroes to a String in Java
Converting StringTokenizer tokens into ArrayList in Java