Когда вы просите Java напечатать объект, для которого не определен метод toString, он будет использовать реализацию по умолчанию toString в классе Object. Из javadocs:
Метод toString для класса Object
возвращает строку, состоящую из
название класса, из которого объект
является экземпляром, символ знака
`@ 'и шестнадцатеричное без знака
представление хэш-кода
объект. Другими словами, этот метод
возвращает строку, равную значению
из:
getClass().getName() + '@' + Integer.toHexString(hashCode())
В вашем примере «protocol.Route» будет именем класса, а «c17164» - это то, что возвращает метод hashcode в виде hexString, который, если hashCode не был перезаписан, вероятно, является адресом объекта, хотя это реализация зависимый.
Итак, есть несколько способов решить вашу проблему.
Напишите свою собственную реализацию метода toString для класса Route, который печатает нужные данные. Это, наверное, самый «правильный» способ решения вашей проблемы. Он хранит вещи, хорошо инкапсулированные в классе, означая, что только метод toString внутри класса должен знать точные переменные-члены, которые должны быть напечатаны.
Если ситуация такова, что вы не можете изменить класс Route, вы можете создать подкласс для своей собственной версии класса Route, к которой вы можете добавить метод toString. Однако, в зависимости от дизайна класса, это может быть сложно.
Попросите текущий метод printRT заглянуть внутрь каждого объекта Route и получить конкретную информацию, которую вы хотите добавить к текущей строке.
Также обратите внимание, что с текущим кодом вы записали следующее во внутренний цикл:
s= " ROUTING TABLE " + conf.routingTable[hop].get(i);
Это означает, что printRT будет возвращать только строку для самой последней итерации цикла. Таким образом, большую часть времени в цикле for тратится на создание строк, присвоение их переменной, а затем их перезапись в следующий раз в цикле.
Если вы хотите возвращать строковое представление для каждой итерации, вам нужно изменить вышеприведенное на что-то вроде следующего:
s += " ROUTING TABLE " + conf.routingTable[hop].get(i);
Теперь новая информация добавляется в s каждый раз через цикл. Однако, в зависимости от количества выполняемых конкатенаций строк, класс StringBuilder может быть лучшей альтернативой (см. Краткое резюме и учебное пособие по нему здесь ).