Можно ли различать символ и целое число, хранящиеся в одном и том же целочисленном массиве?

Мой код

int array[] = {'a',98};
for(int num:array) {
    System.out.println(num);
}

Если я напечатаю это, я получу o/p как 97 98.

Если я напечатаю (char) num, тогда o/p будет a b.

Можно ли печатать массив как a 98? Я предполагаю, что массив будет хранить целочисленные значения элементов массива, это невозможно. Но какое-нибудь решение здесь?

Ответы

Ответ 1

Я не думаю, что это можно сделать с помощью int[]. Но вы можете создать Object[], чтобы достичь этого.

Вот фрагмент кода:

public static void main (String[] args) throws Exception {
    Object array[] = {'a',98};
    for(Object o : array){
        System.out.println(o);
    }
}

Вывод:

a
98

Ответ 2

У вас есть int[] array, как выглядит байт-код:

public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1    // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_2
       1: newarray       int
       3: dup
       4: iconst_0
       5: bipush        97
       7: iastore
       8: dup
       9: iconst_1
      10: bipush        98
      12: iastore
      13: astore_1
      14: return
}

Как вы можете видеть, значения вставляются как int.

Другие пользователи предложили использовать Object[] array. Посмотрите на его байт-код:

public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1       // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_2
       1: anewarray     #2      // class java/lang/Object
       4: dup
       5: iconst_0
       6: bipush        97
       8: invokestatic  #3      // Method java/lang/Character.valueOf:(C)Ljava/lang/Character;
      11: aastore
      12: dup
      13: iconst_1
      14: bipush        98
      16: invokestatic  #4      // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      19: aastore
      20: astore_1
      21: return
}

Обратите внимание на

// Method java/lang/Character.valueOf:(C)Ljava/lang/Character;

которая сообщает, что вызывается метод Character.valueOf, поэтому вы получите фактический символ вместо значения int.

Ответ 3

Нет, для int[] невозможно знать, были ли его данные записаны как символ или как число в исходном коде. Вам нужна другая структура данных, если вы хотите сохранить такую ​​информацию.

Ответ 4

Object[] array = { 'a', 98 }
if (array[i] instanceof Character) { // Or Integer