对String的深入理解
2016-03-12 14:54
477 查看
我们先来看一段代码:
最终输出的结果是:
面试的时候,答案我是写对了,但是当问我为什么输出这样时,我说因为change中修改的和main中修改的不是一个对象。然后接着又问,那如果代码修改成下边这样呢:
再看下面的代码:
按照我的解释,change中修改的和main中的不是一个对象,岂不是要输出“TEST”了吗?可见我的解释是错误的。
正确的解释应该是:
package com.ykp.test; public class StringTest { public static void main(String[] args) { String str = "TEST"; change(str); System.out.println(str); } public static void change(String str) { str = str.replace('S', 'E'); str = str.substring(1); } }
最终输出的结果是:
TEST
面试的时候,答案我是写对了,但是当问我为什么输出这样时,我说因为change中修改的和main中修改的不是一个对象。然后接着又问,那如果代码修改成下边这样呢:
再看下面的代码:
package com.ykp.test; public class StringTest { private String name; public void setName(String name) { this.name = name; } public static void main(String[] args) { StringTest str = new StringTest(); str.setName("TEST"); change(str); //输出sbsb System.out.println(str.name); } public static void change(StringTest str) { //str代表的是StringTest对象,StringTest的属性值是可以修改的, //再加上我们接下来有没有new StringTest(),所以此处的str和main中的是同一个 str.setName("sbsb"); } }
按照我的解释,change中修改的和main中的不是一个对象,岂不是要输出“TEST”了吗?可见我的解释是错误的。
正确的解释应该是:
public static void main(String[] args) { //str是一个字符串,其值是不可修改的 String str = "TEST"; change(str); //这句话输出的还是期初创建的那个对象的值 System.out.println(str); } public static void change(String str) { //在进行下面这行代码之前,str的内存地址还是main中的那个 //replace函数最终会创建一个新的对象返回给str,此时的str的内存地址已经是另一个对象的了 str = str.replace('S', 'E'); //substring函数又创建了一个新的string对象 str = str.substring(1); }
相关文章推荐
- C#索引器
- Java学习-序列化
- 正则表达式学习笔记
- C++第一次实验—2
- 文章学习和解读
- “万能makefile”写法详解,一步一步写一个实用的Makefile
- Android蓝牙通信
- js中object、字符串与正则表达式的方法
- HDU 3836 - Equivalent Sets【强连通分量 基础题】
- 省市区与分类多级联动的插件
- 解决mysql保存中文数据乱码
- 自己挑出的几个windows xp、7、8.0、10的纯净版官方镜像下载地址
- CentOS 设置redis为服务
- 在TextBox中敲击回车执行ASP.NET后台事件
- 【BZOJ 3295】动态逆序对 - 分块+树状数组
- C#中的结构体与类的区别
- C# 结构体 struct
- 我的第一个Python游戏
- Sql语言的分类
- Apache Commons Configuration读取xml配置