泛型
泛型<?> 集合对象--本质即为数据以及对数据的操作
List<Empl> list
[table]
|栈名称|栈|说明|堆|堆中内容|
||||||
|list|ox00|堆中创建的数组的地址|Empl[]|空数组|
||||||
|empl|0x11|堆中创建的对象的地址|Empl|数组对应下标存储当前对象的地址即栈中存放的地址
||||||
[/table]
1.修改集合中的引用类型的数据,会改变数据的内容
输出结果:
[b]
100
100
AAA
B
C
[/b]
从输出结果可以得出:
及时对象已经放入集合中,但集合存放的是引用对象的地址,而不是引用对象的内容,
所以,对象放入集合后,如果再对集合进行修改
后面,再次调用遍历集合时,就会出现某些属性与预期的结果不一致的问题。
问题解释:
1.程序开发过程中,对同一个集合进行多次操作,功能按照方法分开
上一个方法的操作修改会影响下一个方法中的集合中的数据
原因:是因为取出集合中对象地址,然后对对象内容直接进行修改。
2.避免出现此类问题
clone 为了保持源数据不变,而又要实现新的功能,考虑在使用数据前进行备份,而对备份的数据进行处理。
泛型<?> 集合对象--本质即为数据以及对数据的操作
List<Empl> list
[table]
|栈名称|栈|说明|堆|堆中内容|
||||||
|list|ox00|堆中创建的数组的地址|Empl[]|空数组|
||||||
|empl|0x11|堆中创建的对象的地址|Empl|数组对应下标存储当前对象的地址即栈中存放的地址
||||||
[/table]
1.修改集合中的引用类型的数据,会改变数据的内容
import java.util.ArrayList;
import java.util.List;
public class CollectionObjectTest {
/**
* @param args
*/
public static void main(String[] args) {
// 装包即解包,对于包装类,JDK自动实现包的转换,此处声明为对象,只是想重新赋值
List<Integer> integerList = new ArrayList<Integer>();
Integer a = new Integer(100);
Integer b = new Integer(100);
integerList.add(a);
integerList.add(b);
a = new Integer(200);
for(Integer inte : integerList){
System.out.println(inte);
}
// 自定义对象
Empl e1 = new Empl("A",1);
Empl e2 = new Empl("B",2);
Empl e3 = new Empl("C",3);
List<Empl> listEmp = new ArrayList<Empl>(3);
listEmp.add(e1);
listEmp.add(e2);
listEmp.add(e3);
e1.setName("AAA");
for(Empl emp : listEmp){
System.out.println(emp.getName());
}
}
}
class Empl {
String name ;
Integer age ;
public Empl(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
输出结果:
[b]
100
100
AAA
B
C
[/b]
从输出结果可以得出:
及时对象已经放入集合中,但集合存放的是引用对象的地址,而不是引用对象的内容,
所以,对象放入集合后,如果再对集合进行修改
后面,再次调用遍历集合时,就会出现某些属性与预期的结果不一致的问题。
问题解释:
1.程序开发过程中,对同一个集合进行多次操作,功能按照方法分开
上一个方法的操作修改会影响下一个方法中的集合中的数据
原因:是因为取出集合中对象地址,然后对对象内容直接进行修改。
2.避免出现此类问题
clone 为了保持源数据不变,而又要实现新的功能,考虑在使用数据前进行备份,而对备份的数据进行处理。