String和StringBuilder作为参数的区别
先见下面实例:
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作为参数的区别的更多相关文章
- String、StringBuilder和StringBuffer的区别
1 String.StringBuilder和StringBuffer的区别 String.StringBuilder.StringBuffer都可以用来保存字符串.如果是使用次数比较 ...
- 面试必知:String、StringBuilder、StringBuffer的区别
你知道String.StringBuilder.Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗? 别急,这篇文章带你解决这些问题. 可变性 首先,String是字符串,我 ...
- JAVA String介绍、常量池及String、StringBuilder和StringBuffer得区别. 以及8种基本类型的包装类和常量池得简单介绍
一.概述 String是代表字符串的类,本身是一个最终类,使用final修饰,不能被继承. 二.定义方式 方式一:直接赋值法 String str1 = "hello"; 方式 ...
- Java 中的String、StringBuilder与StringBuffer的区别联系(转载)
1 String 基础 想要了解一个类,最好的办法就是看这个类的源代码,String类源代码如下: public final class String implements java.io.Seria ...
- String和StringBuilder、StringBuffer的区别?
估计很多Java初学者在学习Java的过程中都会遇到这个问题,那就是String,StringBuilder,StringBuffer这三个类之间有什么区别?今天在这里整理一下,希望对大家有帮助哈.如 ...
- String 、Stringbuilder和StringBuffer的区别
JAVA平台提供了三个类:String.StringBuilder和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数值不可改变的字符串.而这个S ...
- String、StringBuilder与StringBuffer的区别
1.String类是public.final修饰的. 在Java中,被final修饰的类是不允许被继承的,并且String它的成员方法都默认为final方法. 查看源码得知,String类其实是通过c ...
- Java基础(32):String与StringBuilder、StringBuffer的区别(String类)
在Java中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串,那么它们之间有什么区别呢? String 类具有是不可变 ...
- string,stringbuilder和stringbuffer的区别
String.StringBuffer.StringBuilder之间的区别(网上收集) StringBuffer.StringBuilder和String一样,也用来代表字符串.String类是不可 ...
随机推荐
- php实现手机拍照上传头像功能
现在手机拍照很火,那么如何使用手机拍照并上传头像呢?原因很简单,就是数据传递,首先手机传递照片信息,这个就不是post传递 也不是get函数传递, 这个另外一种数据格式传递,使用的是$GLOBALS ...
- vi 编辑器的使用
1) vi的自动对齐功能 我从window的网页上拷贝了一段代码到vi中,结果是不对齐的.见下图 此时为了对齐,我的做法是: ESC-v 进入视图模式,然后全选 再然后直接按 = 号. 然 ...
- load-store/register-memory/register-plus-memory比较
在理解ARM的load-store架构时,我在百度上搜索了很长时间,但是始终找不到一篇像样的中文文章.最后,在用谷歌搜索的英文网站上终于找到了一些蛛丝马迹.让我们先看一下一篇英文资料. Process ...
- MYSQL数据库备份与恢复【转】
mysqldump -h主机名 -P端口 -u用户名 -p密码 (–database) 数据库名 > 文件名.sql 在window上需要通过CMD进入mysql安装目录下的bin目录下执行 ...
- jquery仿ios日期时间插件
Demo下载: 手机时间控件.zip 使用之前,请在页面中加入以下js和css: jquery-1.9.1.js mobiscroll.core-2.5.2.js mobiscroll.core-2. ...
- python中的字典(dict),列表(list),元组(tuple)
一,List:列表 python内置的一种数据类型是列表:list.list是一种有序的数据集合,可以随意的添加和删除其中的数据.比如列出班里所有的同学的名字,列出所有工厂员工的工号等都是可以用到列表 ...
- Windows Xp Home Edition 安装IIS组件
问题描述: 在虚拟机(操作系统是Windows Xp Home Edition)中安装Sql Server 2005的时候警告缺少IIS相关组件,控制面板"添加/删除组件"中也没有 ...
- ASP.NET之HttpModule拦截404异常
Httpmodule代码: public class Error404Module : IHttpModule { public void Init(HttpApplication context) ...
- CrystalDiskMark 的使用方法
CrystalDiskMark 是一个测试你的硬盘或者存储设备的小巧硬盘测试工具.简单易于操作的界面让你随时可以测试你的存储设备,测试存储设备大小和测试数字都可以选择,还可测试可读和可写的速度. 具体 ...
- 调试技巧 —— 如何利用windbg + dump + map分析程序异常
调试技巧 —— 如何利用windbg + dump + map分析程序异常 逗比汪星人2011-09-04上传 调试技巧 —— 如何利用windbg + dump + map分析程序异常 http ...