Не очень, конечно, понимаю потайной смысл этого выражения
Arrays.equals(bytes, new String(bytes).getBytes()); // false
Но прокомментирую:
Во-первых, вы, наверное, не в курсе, что не каждый набор байтов можно транслировать в строку. Так что new String(bytes)
может вернуть все что угодно, например, обрезать нетранслированные байты. Как говорит мануал:
The behavior of this constructor when the given bytes are not valid in the default charset is unspecified.
Во-вторых, здесь упущен один очень важный параметр - кодировка, по умолчанию применяется текущая кодировка платформы, что делает код нетранспортабельным. В разных платформах/устройствах результат будет разный.