Java: Синтаксис и смысл за "[B @1ef9157"? Binary/адрес?
Эй, Я пытаюсь выяснить, что означает префикс B @в java. Они выходят, когда я пытаюсь печатать массивы байтов. Однако байт-массивы размером 32 и размер 4 идентичны по длине. Всегда "[@B1234567".
Что это? Кроме того, они имеют свойство только печатать шестнадцатеричные значения. Я знаю, что это не просто бинарный шрифт, потому что появятся случайные расширенные символы ascii.
Вот пример байт [] для байта [] хеш-таблицы, отображающий печать, где отображения разделены двоеточием, и это байтовые массивы 4-байтных ключей и 32-байтовые элементы.
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
Ответы
Ответ 1
Вы смотрите на идентификатор объекта, а не на свалку содержимого.
- Массив [].
- B означает байт.
- @ отделяет тип от идентификатора.
- шестнадцатеричные цифры - это идентификатор объекта или хэш-код.
Если целью является печать содержимого массива, существует много способов. Например:
byte[] in = new byte[] { 1, 2, 3, -1, -2, -3 };
System.out.println(byteArrayToString(in));
String byteArrayToString(byte[] in) {
char out[] = new char[in.length * 2];
for (int i = 0; i < in.length; i++) {
out[i * 2] = "0123456789ABCDEF".charAt((in[i] >> 4) & 15);
out[i * 2 + 1] = "0123456789ABCDEF".charAt(in[i] & 15);
}
return new String(out);
}
A полный список номенклатуры типов можно найти в JNI документация.
Вот полный список:
- B - байт
- C - char
- D - double
- F - float
- I - int
- J - long
- L *** полностью-квалифицированный класс *; ** - между
L
и a ;
- это полное имя класса, используя /
в качестве разделителя между пакетами ( например, Ljava/lang/String;
)
- S - короткий
- Z - boolean
- [ - один
[
для каждого измерения массива
- (*** типы аргументов *) *** return-type * - подпись метода, например
(I)V
, с дополнительным псевдотипом V
для метода void
Ответ 2
[B @означает "массив байтов". Другие примитивные типы массивов имеют разные префиксы:
class Test
{
public static void main(String [] args)
{
byte[] b = new byte[0];
int[] i = new int[0];
char[] c = new char[0];
long[] l = new long[0];
double[] d = new double[0];
float[] f = new float[0];
short[] s = new short[0];
System.out.println(b);
System.out.println(i);
System.out.println(c.toString());
System.out.println(l);
System.out.println(d);
System.out.println(f);
System.out.println(s);
}
}
Печать
[[email protected]
[[email protected]
[[email protected]
[[email protected]
[[email protected]
[[email protected]
[[email protected]
Непримитивные типы включают имя типа после [L
, например:
[Ljava.lang.String;@a90653
[Ljava.lang.Object;@de6ced
Если вы хотите напечатать содержимое массива байтов как шестнадцатеричный, здесь приведен код, который поможет вам:
class Test
{
public static void main(String [] args)
{
byte[] b = new byte[] { (byte) 0xf3, (byte) 0xf1, (byte) 0x7f };
System.out.println(toHex(b));
}
private static final char[] HEX_DIGITS = "0123456789abcdef".toCharArray();
public static String toHex(byte[] bytes)
{
char[] c = new char[bytes.length*2];
int index = 0;
for (byte b : bytes)
{
c[index++] = HEX_DIGITS[(b >> 4) & 0xf];
c[index++] = HEX_DIGITS[b & 0xf];
}
return new String(c);
}
}
Ответ 3
Реализация по умолчанию toString()
- это имя класса, за которым следует "@", за которым следует хеш-код объекта (в шестнадцатеричном виде).
Хэш-код по умолчанию, в свою очередь, "обычно реализуется путем преобразования внутреннего адреса объекта в целое число". На практике Sun JVM использует адрес дескриптора объекта в качестве входа для генерации хэш-кода по умолчанию.
В случае примитивных типов (int
, char
и т.д.) или типов массивов, таких как byte[]
, правила именования, определенные в Спецификация виртуальной машины Java для дескрипторов полей. Согласно этим правилам один '[' указывает массив одного измерения, а "B" указывает тип компонента byte
.
Ответ 4
Я подозреваю, хотя я не знаю, что шестнадцатеричные строки являются представлениями адресов экземпляров в памяти и, вероятно, имеют мало общего с длинами массивов. Вы можете уточнить свой вопрос?
Ответ 5
Стоит отметить, что equals() происходит от Object, так что если a.equals(b), то a == b. т.е. если у вас есть два байтовых массива, которые содержат одни и те же данные, они не равны() и не будут соответствовать ключам в Hashtable, HashXxxx