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
视为对象;这里没有演员阵容。好的,再次非常感谢。我当时不确定,现在我清楚了。