Вот честно говорю, если toString не переопределен, то выводится все равно с hashCode, будь то это forEach, или итеративный метод
В некоторых коллекциях используется hashCode для операций с обьектами. Хранение, упорядочивание и тд и тп. Вам надо про это прочитать. И посмотреть про ссылочные типы данных. Посравнивать обьекты, строки и примитивные типы. Прочитать про привидение типов и автобоксинг