是否可以区分存储在同一整数数组中的字符和整数?

Aud*_*bar 16 java

我的代码是

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

如果我打印这个,我会得到o/p为97 98.

如果我打印(char) num那么o/p将是ab.

是否可以将数组打印为98?我的猜测是,数组将存储数组元素的整数值,这是不可能的.但是这里的解决方案呢

use*_*685 27

我认为没有办法做到这一点int[].但你可以创建Object[]来实现这一目标.

这是代码片段:

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

输出:

a
98
Run Code Online (Sandbox Code Playgroud)

  • 如果只有两种可能的类型(char和int),我宁愿创建一个自定义对象来保存值,并确保它是int或char.这样就可以避免危险的行为,因为Object数组可以填充任何东西. (9认同)

Mar*_*oun 11

你有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
}
Run Code Online (Sandbox Code Playgroud)

如您所见,值插入为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
}
Run Code Online (Sandbox Code Playgroud)

请注意

// Method java/lang/Character.valueOf:(C)Ljava/lang/Character;
Run Code Online (Sandbox Code Playgroud)

line,告诉该方法Character.valueOf被调用,因此您将获得实际字符而不是其int值.


Mic*_*elK 10

不,不可能int[]知道它的数据是作为字符写入还是作为源代码中的数字写入.如果您希望保留此类信息,则需要不同的数据结构.


Joo*_*gen 9

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

  • @MichaelKarnerfors你甚至不必调用toString(),因为它是自动调用的! (2认同)
  • @ThomasBöhm和其他人也是如此.然而,如果在现实生活中,人们想要实际使用储值...而且问题是如何在事后对价值进行分析. (2认同)