先见下面实例:

public class TestDemo {

	@Test
public void test(){
//String str = "hello";
String str = new String("hello");
appendStr(str);
System.out.println(str);
StringBuilder sb = new StringBuilder("hello");
appendSb(sb);
System.out.println(sb);
} private void appendStr(String s){
s = "world";
} private void appendSb(StringBuilder s){
s.append("world");
}
}

输入:

hello
helloworld

问题:为什么用String和StringBuilder作为形参最后导致结果不一致呢?

过程分析:

当用String作为形参时

1. 引用str指向new String("hello")对象。

2. 调用appendStr时,形参s复制了实参str的值,此时形参,实参指向同一个对象,即均指向"hello"这个对象。

3. 在appendStr方法内部,将对象“world”的引用被赋给形参s,但并未对实参str产生影响,即实参str依旧指向"hello"这个对象。

4. appendStr方法结束后,形参s在栈内存中释放,对象"world"因不存在被引用,在后续gc中会被回收。

5. 打印str执行的对象内容,依旧是"hello".

当用StringBuilder作为形参时、

1. 引用str指向new StringBuilder("hello")对象。

2. 调用appendSb时,形参s复制了实参str的值,此时形参,实参指向同一个对象,即均指向"hello"这个对象。

3. 在appendSb方法内部,调用了append的方法,该方法会找到形参所指向的对象,即"hello"这个对象,然后修改了该对象,往后面追加了字符串“world”,即修改了

他所指向的对象内容。

4. appendSb方法结束后,形参s在栈内存中释放,对象"helloworld"因还被实参str引用,不会被回收。

5. 打印str执行的对象内容,内容已经改变为"helloworld".

区别:在appendStr方法内部,给形参赋予了一个新的对象的引用,即形参与实参指向了不同的对象,二者之间没有了关系。

而appendSb方法内部,是操作形参所指向的对象,改变该对象的内容,而形参和实参依旧是指向同一个对象,故实参所指向的对象也就变了。

总结:在java中都是值传递,基本类型即是传递原始值,而引用类型则是传递引用所指向的对象的地址。

String和StringBuilder作为参数的区别的更多相关文章

  1. String、StringBuilder和StringBuffer的区别

    1         String.StringBuilder和StringBuffer的区别 String.StringBuilder.StringBuffer都可以用来保存字符串.如果是使用次数比较 ...

  2. 面试必知:String、StringBuilder、StringBuffer的区别

    你知道String.StringBuilder.Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗? 别急,这篇文章带你解决这些问题. 可变性 首先,String是字符串,我 ...

  3. JAVA String介绍、常量池及String、StringBuilder和StringBuffer得区别. 以及8种基本类型的包装类和常量池得简单介绍

    一.概述 String是代表字符串的类,本身是一个最终类,使用final修饰,不能被继承. 二.定义方式   方式一:直接赋值法 String str1 = "hello"; 方式 ...

  4. Java 中的String、StringBuilder与StringBuffer的区别联系(转载)

    1 String 基础 想要了解一个类,最好的办法就是看这个类的源代码,String类源代码如下: public final class String implements java.io.Seria ...

  5. String和StringBuilder、StringBuffer的区别?

    估计很多Java初学者在学习Java的过程中都会遇到这个问题,那就是String,StringBuilder,StringBuffer这三个类之间有什么区别?今天在这里整理一下,希望对大家有帮助哈.如 ...

  6. String 、Stringbuilder和StringBuffer的区别

    JAVA平台提供了三个类:String.StringBuilder和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数值不可改变的字符串.而这个S ...

  7. String、StringBuilder与StringBuffer的区别

    1.String类是public.final修饰的. 在Java中,被final修饰的类是不允许被继承的,并且String它的成员方法都默认为final方法. 查看源码得知,String类其实是通过c ...

  8. Java基础(32):String与StringBuilder、StringBuffer的区别(String类)

    在Java中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串,那么它们之间有什么区别呢? String 类具有是不可变 ...

  9. string,stringbuilder和stringbuffer的区别

    String.StringBuffer.StringBuilder之间的区别(网上收集) StringBuffer.StringBuilder和String一样,也用来代表字符串.String类是不可 ...

随机推荐

  1. ObjectCopy

    对象的传参用的是传引用,但开发中通常不允许对传入参数进行修改.因此对象拷贝很常用,Python提供一个很方便的对象拷贝方法 如代码: __author__ = 'mengxuan' import co ...

  2. Django中国|Django中文社区——python、django爱好者交流社区

    Django中国致力于成为Python和Django框架等技术的中文开发者学习交流平台. 内容涵盖python教程.python基础.Django教程.python入门.web.py教程.linux教 ...

  3. Android直接通过ip进行Http请求

    在测试环境,如果直接通过ip访问的话,比如:url:123.123.123/user/login.do?username=a&psw=b,这样是不行的,会报protocal协议错误,要写全称, ...

  4. 理解和熟练运用js中的call及apply

    call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向. 因为 JavaScript 的函数存在「定义时上下文」和 ...

  5. git的id_rsa.pub的生成(也就是github上的SSH Keys)

    只需要一条语句就可以实现生成id_rsa.pub和id_rsa的目的:ssh-keygen -t rsa -C your_email 注意:这个邮箱是你github上的邮箱.只有在gthub上添加了这 ...

  6. weixin

    http://gps.yesky.com/19/34467019.shtml http://***/goods.php?id=320 http://www.sablog.net/blog/archiv ...

  7. android系统如何自适应屏幕大小

    1.屏幕相关概念 1.1分辨率 是指屏幕上有横竖各有多少个像素 1.2屏幕尺寸 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 android将屏幕大小分为四个级别 ...

  8. EasyUI 调用getSelections方法只能获取到一行的原因

    $('#tt').datagrid({ url: 'GetDataJosn', title: 'DataGrid', width: 800, height: 300, pageSize: 10, id ...

  9. 【BZOJ 3473】 字符串 (后缀数组+RMQ+二分 | 广义SAM)

    3473: 字符串 Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串 ...

  10. 几个RTP的开源实现

    玩了两天rtp协议,基本把rtsp/rtcp/rtp/rtmp/srtp/strcp/mms,几个协议的区别和概念弄明白了. 这里记录一下. rtsp:类似用户界面操作,和Http比较类似,提供播放, ...