返回信息流在扩容的时候 ,会拷贝数组,深拷贝还是浅拷贝?什么样子的过程呢?拷贝的时候是新开辟空间复制元素吗?原来的数组引用怎么处理的呢?置为null吗
发自「贵邮」
这是一条镜像帖。来源:北邮人论坛 / java / #48841同步于 2016/3/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
arraylist求问
westbear
2016/3/27镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
浅拷贝。里面所有的对象还指向原来的对象,对象没有被拷贝。
另外,ArrayList的用户应该看不出来里面的东西被拷贝了,其中一点就是“原来指向某个对象,现在还是指向那个对象”。
java里面class都是引用类型,不像C++和Rust那样,Java没有“值类型”。如果C++里的vector拷贝了,发生的事情会更微妙。
http://www.cnblogs.com/Coffee-guy/archive/2012/08/04/2623020.html
一维数组传递的是值,不是引用啊,这应该是深复制吧。。。
【 在 nuanyangyang 的大作中提到: 】
: 浅拷贝。里面所有的对象还指向原来的对象,对象没有被拷贝。
: 另外,ArrayList的用户应该看不出来里面的东西被拷贝了,其中一点就是“原来指向某个对象,现在还是指向那个对象”。
: java里面class都是引用类型,不像C++和Rust那样,Java没有“值类型”。如果C++里的vector拷贝了,发生的事情会更微妙。
: ...................
【 在 wht 的大作中提到: 】
: http://www.cnblogs.com/Coffee-guy/archive/2012/08/04/2623020.html
: 一维数组传递的是值,不是引用啊,这应该是深复制吧。。。
:
数组是对象,对象类型的变量的值是指向这个对象的引用。Java在传递参数的时候,永远是“按值传递”,而这个值是一个引用。
至于数组的元素,如果元素类型是基本类型,那么值直接存在数组中;如果元素类型是对象类型,那么数组里每一个元素都是一个指向这个类型的对象的引用。
arraycopy拷贝的是每个元素的值。如果是对象类型,那么数组元素的值就是指向对象的引用。因此,是浅拷贝。
如果元素很多的话,这样感觉效率好低啊,虽然只是复制对象的引用
【 在 nuanyangyang 的大作中提到: 】
: 浅拷贝。里面所有的对象还指向原来的对象,对象没有被拷贝。
: 另外,ArrayList的用户应该看不出来里面的东西被拷贝了,其中一点就是“原来指向某个对象,现在还是指向那个对象”。
:
: java
: .........
发自「贵邮」
暖神,还有一个问题:为什么java里面的泛型是伪泛型呢?C#是真泛型怎么理解呢?
【 在 nuanyangyang 的大作中提到: 】
: 浅拷贝。里面所有的对象还指向原来的对象,对象没有被拷贝。
: 另外,ArrayList的用户应该看不出来里面的东西被拷贝了,其中一点就是“原来指向某个对象,现在还是指向那个对象”。
:
: java
: .........
发自「贵邮」
【 在 westbear 的大作中提到: 】
: 如果元素很多的话,这样感觉效率好低啊,虽然只是复制对象的引用
:
: 发自「贵邮」
如果从1扩张到n,如果每次容量加倍,如1->2->4->8->16->...,那么总的拷贝的元素(的值或者引用)的个数约等于n。还好吧。
【 在 westbear 的大作中提到: 】
: 暖神,还有一个问题:为什么java里面的泛型是伪泛型呢?C#是真泛型怎么理解呢?
:
: 发自「贵邮」
确切地说,是JVM无法表达“泛型”的概念。所以“泛型”只是Java语言的概念,到了JVM,所有的泛型参数里的类型都会变成Object。而.NET虚拟机本身有虚拟机层的泛型。
也就是说真泛型的意思是:虚拟机会针对传入的不同类型编译成不同的类型 ,不是像java那样都擦除成object?
【 在 nuanyangyang 的大作中提到: 】
:
: 【 在 westbear 的大作中提到: 】
: : 暖神,还有一个问题:为什么java里面的泛型是伪泛型呢?C#是真泛型怎么理解呢?
: :
: : 发自「贵邮」
:
: 确切地说,是JV
: .........
发自「贵邮」
【 在 westbear 的大作中提到: 】
: 也就是说真泛型的意思是:虚拟机会针对传入的不同类型编译成不同的类型 ,不是像java那样都擦除成object?
:
: 发自「贵邮」
起码.NET会。