有如下程序,对于部分参数在调用函数时被复制(如:String, arry, Object(可能Object不算));有些被引用(如:HashMap)想问下,那些类型的变量调用函数时被复制,哪些被引用?
多谢先!--------------
import java.util.HashMap;public class Test1 { public static void main(String[] args) {
String s="s1";
Object o = "o1";
int[] a = new int[]{1,2,3};
HashMap h = new HashMap();
h.put("h1", "v");
f(s, o, a, h);
System.out.println("string=" + s);
System.out.println("object=" + o);
System.out.println("array=" + a.length);
System.out.println("hashmap=" + h.size());
}
static void f(String s, Object o, int[] a, HashMap h){
s +="__";
o = "222";
a = new int[]{1,2,3,4};
h.put("2", "v2");
}
}-----------结果:
string=s1
object=o1
array=3
hashmap=2
多谢先!--------------
import java.util.HashMap;public class Test1 { public static void main(String[] args) {
String s="s1";
Object o = "o1";
int[] a = new int[]{1,2,3};
HashMap h = new HashMap();
h.put("h1", "v");
f(s, o, a, h);
System.out.println("string=" + s);
System.out.println("object=" + o);
System.out.println("array=" + a.length);
System.out.println("hashmap=" + h.size());
}
static void f(String s, Object o, int[] a, HashMap h){
s +="__";
o = "222";
a = new int[]{1,2,3,4};
h.put("2", "v2");
}
}-----------结果:
string=s1
object=o1
array=3
hashmap=2
f(s, o, a, h);//s,o,a被复制,h被引用
h.put("2", "v2");//v2被引用
h.put("h1", "v");//v被引用
f(s, o, a, h);//s,o,a被复制,h被引用
h.put("2", "v2");//v2被引用
和
HashMap h = new HashMap();都是集合类型吧,
为什么前者是复制,后者是引用呢?
和
HashMap h = new HashMap();都是集合类型吧,
为什么前者是复制,后者是引用呢?
-------------------------------------------
麻烦说清楚点,new关键字是干什么的。
o = "222"; //同上
a = new int[]{1,2,3,4}; //同上
h.put("2", "v2"); //通过引用来操作对象, 不会丢失
C和java都做了好多年了,指针、地址这些概念还是清楚的。
我想问在java这么多种类型里,那些类是会被复制的,那些类会被引用。(2种类的特征是什么)To Dan1980:
为何String有其特殊性,从String的源代码哪里可看出。
HashMap和String都是同样继承Object为何有不同呢?To mainGalaxy(天狼星):
我在h.put("2", "v2");后加了句new HashMap();但结果没边,这样看起来好像是复制,是吗?Thanks!
可以看看lz的代码对4个变量的操作,前3个都是在赋值,最后是对map的put
f(String s, Object o, int[] a, HashMap h) 在调用这个方法的时候,s,o, a, h是在栈中的临时变量,也就是说只有在这个方法的生命周期内才有效,(lz做c很多年应该知道传值和传地址的区别吧, 指针也是变量只不过我们操作他的规则很特殊), 对前3个变量的操作都是对变量本身的操作(赋值), 没有对他们指向的对象做操作,又能期望那些对象有什么改变呢?
而对第4个的操作是对h这个变量指向的对象的操作( map.put() )
如果对第4个变量的操作也是h=new HashMap(); 那么结果就是什么也没有变化
原始类型的包装类也是这样的,也是做map的key的好东东,因为对象的改变会使它本身的hashCode改变,这样HashMap就会重新hash,
object=o1
array=3
hashmap=2 //因为函数中调用了类似于设置之类的方法,改变了内容
如果你是:
h = new HashMap();
h.put("2", "v2");
你将得到:
hashmap=1感觉楼主是不是思维进死胡同了??
java的基本类型和string的对象会被复制,其他的是引用,如果前者是数组的话也是引用,因为数组可以被看作是array对象
---------------------------------
不要误导人家,只有基本类型才是复制,String是类不会被复制.数组在java里是和类一样的不会被复制.
收获不少也解决了这个问题。特别是Dan1980的:简单类型和地址永远是复制的,而除此之外都是不复制的。
之前有这个困惑也是由于对String的不了解。很感谢Veryx和jianfengqu对String的解释。Many thanks you all!