在同一个整型数组中,是否可能区分存储的字符和整数?

16

我的代码是

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

如果我打印这个,输出将是 97 98

如果我打印 (char) num 那么输出将是 a b

是否可能将数组打印为a 98? 我猜数组会存储数组元素的整数值,所以不可能。但是这里有什么解决方案吗?


4
我想不出如何做到这一点。你为什么想要这样做?也许你应该采用不同的方法? - Thomas Böhm
我怀疑这是不可能的。你能用List代替吗? - sidgate
13
一旦数值存储到数组中,它们就变成了普通整数。无法知道它们是来自字符还是普通整数。 - Arnaud
@ThomasBöhm 我对此很好奇。 - Audumbar
1
虽然提供的答案中 Object array[] 的方法是正确的,但您应该避免以这种方式混合数据类型。如果必须这样做,请将原始数据类型包装在自己的抽象数据类型中或将它们分开。 - Cloud
显示剩余2条评论
4个回答

27

我认为使用 int[] 没有任何方法可以实现这一点。但是,您可以创建 Object[] 来实现。

以下是代码片段:

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

输出:

a
98

9
如果只有两种可能的类型(char和int),我宁愿创建一个自定义对象来保存值,并确保它是int或char之一。这样可以避免危险的行为,因为对象数组可能会被填充任何内容。 - Jean-François Savard

11

你有一个 int[] 数组,这是字节码的样子:

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值。


相当深入的解释。这意味着将调用对应的valueOf()方法来打印Object数组,而对于原始数据类型的数组则不会发生这种情况。是吗? - Audumbar

10

不,int[]无法知道其数据是作为字符还是数字在源代码中被写入的。如果您希望保留这种信息,需要使用不同的数据结构。


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

1
如果您使用对象数组,它不必检查类,因为对象的toString方法会自动调用。(在他的打印示例中) - Thomas Böhm
为什么要使用if语句?只需使用array[i].toString()即可获得一个不可知的字符串表示。 - MichaelK
2
@MichaelKarnerfors,你甚至不需要调用toString()方法,因为它会自动调用! - Thomas Böhm
2
@ThomasBöhm和其他人是正确的。然而,如果在现实生活中想要实际“使用”存储的值...而且问题是如何区分之后的值。 - Joop Eggen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接