Причина, по которой вы получаете "странный" вывод из System.out.println(f.toString())
, заключается в том, что вы печатаете массив, а не строку. Классы массива Java не переопределяют метод toString()
. Поэтому вызываемый метод toString()
- это метод из java.lang.Object
, который определен для вывода имени класса объекта и его хэш-кода идентификатора. (В этом случае имя класса byte[]
будет «[b».)
Я думаю, что ваша путаница возникает из-за того, что вы мысленно приравниваете строку и массив байтов. Есть две причины, почему это концептуально неправильно:
В Java строки не являются массивами чего-либо. Класс String - полностью инкапсулированный класс, который не может быть приведен ни к чему другому ... кроме Object.
В Java String моделирует последовательность символов, а не последовательность байтов.
Последнее является ключевым отличием, поскольку существует множество возможных преобразований между последовательностями символов и байтами, многие из которых имеют потери в одном или обоих направлениях. Когда вы звоните "hello".getBytes()
, вы получаете преобразование, подразумеваемое кодировкой символов вашей платформы по умолчанию, но вы могли бы предоставить параметр для getBytes
, чтобы использовать другую кодировку в преобразовании.