新手学习JAVA,关于System.arraycopy的一个问题

为啥我写的arraycopy 不像是例子中那样 copy的引用。。。。但他们又是相等的。。。

自己理解所写的代码

来源于CSDN一位博主网页中的代码
网页地址:http://blog.csdn.net/angjunqiang/article/details/42031351

用它分别 copy二维数组 和 copy一维数组

为啥二维数组copy的时候像是把它源数组的地址给目的数组了

一维数组copy的时候 和 源数组 没关系一样

4个回答

System.arraycopy()是复制运行栈中的内容,

  • 对于基本类型, 内容就是value.
  • 对于引用类型, 内容就是reference.

你自已写的数组里面是User对象, 所以复制是reference, 他们都指向运行堆中的相同地址,这个地址存着对象的内容.

不知道是否解析清楚, 详解可以阅读JVM内存模型资料.

qq_35158582
c4951491235 谢谢您的回答~~
接近 2 年之前 回复

1对于两个数组来说 是深拷贝 , 你的例子是 用int 所以也是深拷贝(基础类型赋值) 然后你用== 判断 是错的 因为这里 是值判断 不是引用判断 ,其实内存地址是不一样的
2 官网例子 里面是对象 还有你后面 的数组 赋值 (引用赋值) 浅拷贝 所以 改变了 注 基础类型 == 为 值判断

qq_35158582
c4951491235 谢谢您的回答~~
接近 2 年之前 回复

在做这个实验的时候,你是用的是基本类型,进行比较或者赋值操作的时候会进行自动装箱操作,也就是说
其实你使用的Integer类型,这是一个final类型,这种类型是不能改变的,所以其实你在对a_bak[0]进行赋值的时候,改变的是引用,而非
值,当然得不到结果,而你所看到的那个例子它的赋值操作改变的是属性,所以是那个结果,问题的本质就是
你的赋值操作不是你想象的那样改变了值,而是改变了引用。

qq_35158582
c4951491235 谢谢您的回答~~
接近 2 年之前 回复

System提供的复制是基于本地方法栈的操作,是对源数组和目标数组的元素进行复制,并不会改变两个数组的内存地址,就是说这两个数组的地址引用不会变,
变得是数组里面的元素

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问