Java编译器如何转换包含自定义类的集合?

Java编译器如何转换包含自定义类的集合?,java,collections,arraylist,compilation,jvm,Java,Collections,Arraylist,Compilation,Jvm,编写以下代码时: List<Integer> list = new ArrayList<Integer>(); for (int i = 1; i < 10; i++) list.add(i); List List=new ArrayList(); 对于(int i=1;i

编写以下代码时:

 List<Integer> list = new ArrayList<Integer>();
 for (int i = 1; i < 10; i++)
 list.add(i); 
List List=new ArrayList();
对于(int i=1;i<10;i++)
列表.添加(i);
Java编译器不会发出编译错误,即使我们在arrayList中添加int,因为它(通过使用包装类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);
} 
List List=new ArrayList();
对于(int i=1;i<10;i++)
列表.添加(整数.值(i));
但是,当我有一个自定义类并且我想在集合中存储对象时会发生什么?更具体地说,发生了什么样的转换操作,这些操作可以被视为额外的开销

以下代码也是如此:

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);
} 
Animal动物=新动物();
ArrayList=新建ArrayList();
对于(int i=1;i<10;i++){
动物代码=i;
列表。添加(动物);
动物=新动物();
}
动物体温;
对于(int i=1;i<10;i++){
temp=列表获取(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);
} 
Animal动物=新动物();
ArrayList=新建ArrayList();
对于(int i=1;i<10;i++){
动物id=i;
列表。添加((对象)动物);
动物=新动物();
}
动物体温;
对于(int i=1;i<10;i++){
温度=(动物)列表。获取(i);
} 
这种现象被称为。你离得很近,但不太近

这就好像从方法调用中删除了类型参数,并将隐式强制转换添加到方法的返回中

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.
temp = (Animal) list.get(i);  // Correct, a cast is inserted here.
在第二个
for
循环中:

list.add(animal);  // No (Object) cast necessary, Animal is already implicitly an Object.
temp = (Animal) list.get(i);  // Correct, a cast is inserted here.

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

欢迎使用。好的,第一个问题。要阅读有关泛型、键入擦除等的更多信息,请查看:。感谢您的回答。我想知道在使用list.add(动物)时,拳击是否被视为开销。更具体地说,如果java集合的初始列表包含的是动物对象而不是对象对象,那么会不会有性能上的差异,因为我猜装箱是不必要的?没有使用
list.add(Animal)
装箱,它不是强制转换:
int
Integer
double
double
,等等。
列表没有开销。添加(动物)
,因为JVM已经将
animal
视为
对象;这里没有演员阵容。好的,再次非常感谢。我当时不确定,现在我清楚了。