Data classes are one more concept that Kotlin uses to be a more productive language. To show this, let's go back to our User class in Java. If we wanted to compare this type by the values it holds (its properties), we would have to override the equals method and compare all the values inside it. But then, with the equals method overridden, we also have to override the hashcode method; otherwise, none of the hash-related collection types (HashMap, HashSet, HashTable, and so on) would work. The hashcode method should return an equal hash value from all objects that the equals method considers the same. While we are overriding those two methods, let's also override the toString method so that the users of our class can get a nice string representation of it. Then, the Java version would look like this (getter and setter methods omitted):
public...