java的值传递与引用传递

发布时间:2017-3-27 18:51:48 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"java的值传递与引用传递",主要涉及到java的值传递与引用传递方面的内容,对于java的值传递与引用传递感兴趣的同学可以参考一下。

java的值传递与引用传递        今天一个同事也碰到一个问题,问题大致是这样的: 有一个list1对象:               ArrayList list1=new ArrayList();         list1.add(“string1”);         list1.add(“string2”);        这时候又定义了一个list2, 并将list1赋值给list1,然后对list2进行修改,发现list1也改变了:         ArrayList list2 = list1;         List2.add(“string1”); 于是同事再次,试验了:         ArrayList list2 = new ArrayList();         list2 = list1;         list2.add(“string1”); 结果发现list1还是被修改了~~这个问题是属于java中比较常见的一个问题,即java的值传递与引用传递问题。下面对其进行简单的介绍:        java值传递与引用传递 1、对象是按引用传递的---带"="号的赋值操作 2、Java 应用程序有且仅有的一种参数传递机制,即按值传递---由"函数调用"引起的 3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本 4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址(引用),而不是值的副本 5、注意:String虽是对象,但永远是传值。  String对象一旦创建,它的内容就是固定不可变的。 6、记住地5点,这是 唯一一个对象传递的是值而不是内存地址。 因为String对象一旦创建,它的内容就是固定不可变的。 7、 两个string字符串用  +  串联起来会产生一个全新的对象,这个对象会有新的内存地址(引用)。 { String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结。   在java中有3个类来负责字符的操作。 1.Character 是进行单个字符操作的, 2.String 对一串字符进行操作。不可变类。 3.StringBuffer 也是对一串字符进行操作,但是可变类。 String: 是对象不是原始类型(基本类型). 为不可变对象,一旦被创建,就不能修改它的值. 对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去. String 是final类,即不能被继承. StringBuffer: 是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象 它只能通过构造函数来建立, StringBuffer sb = new StringBuffer(); note:不能通过付值符号对他进行付值.  sb = "welcome to here!";//error 对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer 中付值的时候可以通过它的append方法. sb.append("hello"); 字符串连接操作中StringBuffer的效率要比String高: String str = new String("welcome to "); str += "here"; 的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后 再将StringBuffer toSting(); 这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣. 并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值. 这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.  }       首先我们来看看第一点:对象是按引用传递的确实,这一点我想大家没有任何疑问,例如:      class Test01     {     public static void main(String[] args)     {     StringBuffer s= new StringBuffer("good");     StringBuffer s2=s;     s2.append(" afternoon.");     System.out.println(s);     }     }     对象s和s2指向的是内存中的同一个地址因此指向的也是同一个对象。     如何解释“对象是按引用传递的”的呢?      这里的意思是进行对象赋值操作是传递的是对象的引用,因此对象是按引用传递的,有问题吗?     程序运行的输出是:     good afternoon.     这说明s2和s是同一个对象。     这里有一点要澄清的是,这里的传对象其实也是传值,因为对象就是一个指针,这个赋值是指针之间的赋值,因此在java中就将它说成了传引用。(引用是什么?不就是地址吗?地址是什么,不过就是一个整数值)     再看看下面的例子:     class Test02     {     public static void main(String[] args)     {     int i=5;     int i2=i;     i2=6;     System.out.println(i);     }     }     程序的结果是什么?5!!!     这说明什么,原始数据类型是按值传递的,这个按值传递也是指的是进行赋值时的行为。     下一个问题:Java 应用程序有且仅有的一种参数传递机制,即按值传递     class Test03     {     public static void main(String[] args)     {     StringBuffer s= new StringBuffer("good");     StringBuffer s2=new StringBuffer("bad");     test(s,s2);     System.out.println(s);//9     System.out.println(s2);//10     }     static void test(StringBuffer s,StringBuffer s2) { //此时会在方法栈中新建引用,但指向同一内存地址     System.out.println(s);//1     System.out.println(s2);//2     s2=s;//3     s=new StringBuffer("new");//4     System.out.println(s);//5     System.out.println(s2);//6     s.append("hah");//7     s2.append("hah");//8     }     }     程序的输出是:     good     bad     new     good     goodhah     bad     为什么输出是这样的?     这里需要强调的是“参数传递机制”,它是与赋值语句时的传递机制的不同。     我们看到1,2处的输出与我们的预计是完全匹配的     3将s2指向s,4将s指向一个新的对象     因此5的输出打印的是新创建的对象的内容,而6打印的原来的s的内容     7和8两个地方修改对象内容,但是9和10的输出为什么是那样的呢?     Java 应用程序有且仅有的一种参数传递机制,即按值传递。     所以,最上面的那个问题的解决方法如下:      ArrayList list1=new ArrayList();            list1.add(“string1”);            list1.add(“string2”);            ArrayList list2 = new ArrayList();            for(int i = 0; i < list1.length; i++) {                      list2.add(list1.get(i));              } 这样再对list1进行修改,就不会影响到list2了。

上一篇:
下一篇:poj 2785 二分问题 4 Values whose Sum is 0

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款