【问题标题】:How does Java compiler convert Collections that contain custom classes?Java 编译器如何转换包含自定义类的集合?
【发布时间】:2013-08-02 23:03:20
【问题描述】:

当编写如下代码时:

 List<Integer> list = new ArrayList<Integer>();
 for (int i = 1; i < 10; i++)
 list.add(i); 

即使我们在 arrayList 中添加一个 int,Java 编译器也不会发出编译错误,因为它会(通过使用 Wrapper Class Integer)将它转换为以下代码:

List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i < 10; i++)
list.add(Integer.valueOf(i));

但是,当我有一个自定义类并且我想在集合中存储对象时会发生什么?更具体地说,发生了哪些强制转换操作以及这些操作是否可以被视为额外开销。

下面的代码也是这样:

Animal animal= new Animal();
ArrayList<Animal> list = new ArrayList<Animal>();
for (int i = 1; i < 10; i++){
    animal.code=i;
    list.add(animal);
    animal= new Animal();
}
Animal temp;
for (int i = 1; i < 10; i++){
temp=list.get(i);
} 

被 JVM 转换成这样的:

Animal animal= new Animal();
ArrayList<Object> list = new ArrayList<Object>();
for (int i = 1; i < 10; i++){
    animal.id=i;
    list.add((Object)animal);
    animal= new Animal();
}
Animal temp;
for (int i = 1; i < 10; i++){
temp=(Animal)list.get(i);
} 

【问题讨论】:

  • 欢迎来到 SO。第一个问题好。要了解有关泛型、类型擦除等的更多信息,请查看:Java Generics FAQ

标签: java collections arraylist compilation jvm


【解决方案1】:

这种现象称为type erasure。你很近,但不完全在那里。

就好像类型参数已从方法调用中移除,而隐式类型转换已添加到方法的返回中。

ArrayList list = new ArrayList();  // The JVM sees only the raw type

稍后在for 循环中:

list.add(animal);  // No (Object) cast necessary, Animal is already implicitly an Object.

在第二个for 循环中:

temp = (Animal) list.get(i);  // Correct, a cast is inserted here.

这将发生在自定义类(例如 Animal)以及任何其他类型(例如 Integer)中(正如您已经指出的,int 将被装箱为 Integer)。

【讨论】:

  • 感谢您的回答。我想知道在使用 list.add(animal) 时是否将装箱视为开销。更具体地说,如果 Java 集合的初始列表包含 Animal 对象而不是 Object 对象,那会不会有任何性能差异,因为我猜不需要装箱?
  • list.add(animal) 没有拳击。 Boxing refers specifically to placing a primitive value in a wrapper object,它不是强制转换:intIntegerdoubleDouble 等。list.add(animal) 没有开销,因为 JVM 已经将 animal 视为 @987654339 @;这里没有演员表。
  • 好的,再次非常感谢。我不确定,现在我清楚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多