Подтвердить что ты не робот

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]
4b9b3361

Ответ 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