2011-01-05 39 views
0
private List<CourseGroupBean> courseGroups = new ArrayList<CourseGroupBean>(); 
... 
courseGroups = getAlgorithmUtil().listCourses(); 
... 
List<CourseGroupBean> courseGroupsTwo = courseGroups; 

我知道如果我做第三行,它会将courseGroups的引用分配给courseGroupsTwo,但我只想分配它的值。如何在Java中做到这一点?通过Java中的值分配非原始变量

编辑

我的意思是,如果我删除/添加一个对象在courseGroupsTwo它musn't改变在courseGroups什么。

+0

你是说,你想使对象的副本,而不是引用? – jmort253 2011-01-05 14:44:22

回答

1

的Java本身不支持复制按值的对象,所以你必须做你自己:

List<CourseGroupBean> courseGroupsTwo = new ArrayList<CourseGroupBean>(courseGroups); 

将执行的courseGroups浅拷贝,也就是说,它会创建一个包含一个新的列表与courseGroups相同的对象。如果需要,您可以用更合适的List替代ArrayList

如果您愿意,您也可以使用cloneclone有点令人讨厌,因为你需要在克隆后进行强制转换。 Casting通常是不好的,因为它可能会引入运行时错误,而如果出现错误,上面的代码会产生编译时错误。

+0

另外,如果两个列表已经存在,你可以使用'java.util.Collections.copy(courseGroupsTwo,courseGroups)' – codelark 2011-01-05 14:46:27

+0

根据你的回答,当我从courseGroupsTwo中移除一个元素时,它是否会导致courseGroups发生变化? – kamaci 2011-01-05 15:02:40

+0

编号'courseGroupsTwo'和'courseGroups'是不同的对象,但它们包含对原始“CourseGroupBean”对象的共享引用。从'courseGroupsTwo'删除引用不会影响'courseGroups'中的引用。 – 2011-01-05 15:04:18

0
 List<CourseGroupBean> courseGroupsTwo = (ArrayList<CourseGroupsBean>) courseGroups.clone(); 

但是,不仅仅是调用.clone()。根据下面的这个资源,你的类还必须实现接口Cloneable;否则,一个CloneNotSupportedException异常被抛出:

http://www.roseindia.net/java/example/java/util/clone-method-example-in-java.shtml

+0

在这种情况下'CloneNotSupportedException'不是一个问题,因为'ArrayList'实现了cloneable,'clone'做了一个浅拷贝,所以'CourseGroupsBean'对象不会被克隆。 – 2011-01-05 14:52:03

0

调用构造ArrayList(Collection<? extends E>)

List<CourseGroupBean> courseGroupsTwo = new ArrayList<CourseGroupBean>(courseGroups)