下面一段代码 值为什么变化?

问题描述

public class ListTest { public static void main(String[] args) { List<CoreSltoRecord> list = new ArrayList<CoreSltoRecord>(); CoreSltoRecord c = new CoreSltoRecord(); c.setIsvalid((short)1); list.add(c); List<CoreSltoRecord> listall = new ArrayList<CoreSltoRecord>(); listall.addAll(list); for(CoreSltoRecord r : list){ r.setIsvalid((short)2); }// for(CoreSltoRecord r : listall){// r.setIsvalid((short)2);// } System.out.println(list.get(0).getIsvalid()); //值都是2 System.out.println(listall.get(0).getIsvalid());//值都是2 }}

解决方案

List只是一个容器,里面只记录一个引用(可以理解成c里面的指针),指向CoreSltoRecord。所以现在2个List都同时指向一个CoreSltoRecord了。你随便改哪个List里的东西,其实改的都是同一个CoreSltoRecord,改完另一个list看到的东西也自然会变化。
解决方案二:
list.addAll(Collection);这个方法的底层实现: public boolean addAll(Collection<? extends E> c) {Object[] a = c.toArray(); int numNew = a.length;ensureCapacity(size + numNew); // Increments modCount System.arraycopy(a, 0, elementData, size, numNew); size += numNew;return numNew != 0; }从代码可以看出它只是将原有集合的元素的引用,复制给新的集合,而这里所谓的复制只是复制了每个元素的地址,并不是真正意义上的复制对象,两次操作都是操作的同一个对象。

时间: 2024-07-30 00:13:26

下面一段代码 值为什么变化?的相关文章

c++-为什么这段代码中对象rectangle的各个成员函数输出的值是对的,而box的却都是错的

问题描述 为什么这段代码中对象rectangle的各个成员函数输出的值是对的,而box的却都是错的 #include using namespace std; class rectangle { protected: double length,width,l,w; public: void setlength(); void getlength(); void setwidth(); void getwidth(); double area(); double perimeter(); dou

struts2-这段代码的错误在哪里,id属性的值为空,但是控制台能输出所有的value值,求大神解答??

问题描述 这段代码的错误在哪里,id属性的值为空,但是控制台能输出所有的value值,求大神解答?? <s:form action=""deleteMessageAction"" method=""post""> <table align=""center"" width=""40%"" border=""5&

方法-猜猜看这段代码的返回值?如何归纳

问题描述 猜猜看这段代码的返回值?如何归纳 以下的代码: public class GuessTheValue { int foo(int[] array, int num){ int i = array.length - 1; while (i >= 0){ if (array[i] > num){ return i; } i--; } return i; } 假设我们正在用一个非空的数组调用这个方法.我们应该如何归纳调用这个方法返回一个-1?我们应该如何归纳调用这个方法返回一个12? 我的

callback(data)-javascript代码,从request取到callback值之后,有段代码没看懂,请大神指导。

问题描述 javascript代码,从request取到callback值之后,有段代码没看懂,请大神指导. if('${callback}' != ''){ var callback = eval('window.opener.${callback}'); callback(data); } 非常疑惑,为什么可以执行callback(data);这段代码没看懂啊. 解决方案 callback 是一个方法吧,你找找看

c++-C++ 为什么同一段代码第一次提示左操作数必须为左值,改过运行之后再改回原来的,就不提示错误了。

问题描述 C++ 为什么同一段代码第一次提示左操作数必须为左值,改过运行之后再改回原来的,就不提示错误了. 选择排序 template void selectSort(T a[],int size) { int i,j,k; T tmp; for(i=0;i<size-1;i++) { k=i; for(j=i+1;j<size;j++) { if(a[j]<a[k]) k=j; } tmp=a[i];a[i]=a[k]; a[k]=tmp; } int main() {...} vs2

如果监视一个对象的属性变化,并触发一段代码

问题描述 Hi问题是关于如何监视一个对象的属性状态变化就好比在 ServletContextAttributeListener 一样当 ServletContext 属性发生变化时,会触发一段 代码的执行我想明白的就是 如果做,才能 监视自己写的对象,并在其 指定属性发生变化时,出发一段代码呢?请各位赐教下,小弟在此感激不尽 解决方案 监控属性变化,可以使用Observer模式,Java本身提供对这种模式的支持,你按下面的例子看一下:///你需要临视的Beanpackage com.test;i

如何精确测量一段代码的执行时间

最近在工作中遇到了需要精确测量一段C代码执行时间的需求,大家给出的方案有以下三种: gettimeofday(2) rdtsc/rdtscp clock_gettime(2) 下面我们就逐一介绍下这三种方案的用法和限制,主要的关注点是准确性.精度和调用成本,讨论环境是运行在Intel x86上的Linux x86_64系统,内核的版本号高于2.6.32. gettimeofday(2) 首先是gettimeofday(2),函数原型如下: #include <sys/time.h> int g

javaee-为什么我的这段代码只有第一行显示点击后的结果

问题描述 为什么我的这段代码只有第一行显示点击后的结果 为什么我的这段代码只有第一行显示点击后的结果,点击其他行的+ 或者 - 数量和价格也都在第一行变化 还有用循环从数据库得到的gprice(商品价格) 当 选择多个商品加入购物车时,价格都变成最后选中的那个商品的价格?为什么没有得到各自的价格? 这是购物车的代码 上张效果图,点击第二行效果也都显示在第一行 <%@ page language="java" import="java.util.*" pageE

c++-这段代码怎么改,才能运行(main的第一行要保留)

问题描述 这段代码怎么改,才能运行(main的第一行要保留) #include using namespace std; class student { public: student(int n,float s):num(n),score(s){} void change(int n,float s){num=n;score=s;} void display(){cout<<num<<" "<<score<<endl;} private