理解String不可变
问题的引入:
java中只有值传递,没有引用传递,这里有两种情况,一种是传对象,一种是传基础类型,传对象其实是传对象的引用,
http://guhanjie.iteye.com/blog/1683637这篇文章描述了一些情况:
基础类型传递的时候,直接把内存里面真正的值传递过去,而在对象传递的时候,是把对象的引用传递过去。
那么问题来了,为什么String作为对象,再方法调用的时候却跟基础类型调用的效果是一样的。
给出代码:
public class Example {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };
public static void main(String args[]) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
}
public void change(String str, char ch[]) {
str="test ok";
ch[0] = 'g';
}
}
这里输出:good and gbc
本例中,str和ch作为对象一起传入方法change,也一同改变,ch变化了,str并没有改变。
解释:
1,如果你看到这里了,那么你应该理解了java中总是值传递(传对象的时候,对象的地址就是他的值)。
2,String是不可变的对象,为什么这么说呢,我们看String的源码可以知道:String是final的,String的成员变量也是final的,首先String实例化出来是不可变的(除非反射)。当我们尝试改变他的时候:
str="test ok";
其实是在内存空间再创建一个"test ok"的对象,并把str引用指向这个新创建的对象,原来的ex.str引用依旧指向了之前的"good"对象的地址。
3,我们要区别对待String,想想看,为什么会引入这样的问题,其实是因为String作为对象却可以跟基础类型数据一样使用+,=等操作。这在语言中本身就已经对String做了特殊的处理。
java为String对象重载"+",这里的重载是,一个操作符在应用于特定的类时,被赋予了特殊的意义(用于String的"+"和"+="是Java仅有的两个重载过的操作符,而java并不允许程序员重载任何操作符)
http://blog.csdn.net/clam_clam/article/details/6831345
思考:延续第三点,我们能不能创建一个类似String的对象,即也是final,其成员变量都是final的,然后作为对象传递,在方法体类改变而不影响其原本的值。
转载于:https://www.cnblogs.com/yemanling/p/4556322.html
理解String不可变相关推荐
- String可不可变???
众所周知,String是不可变的. 但是为什么String不可变呢?String不可变是指的什么不可变呢?哪里又可以变呢?接下来我总结一下我学习String的心得(大佬勿喷!) 一些东西从源码的角度进 ...
- 按我的理解string似乎不是字面值类型,但为什么《c++ primer》习题7.55答案说Data类是集合类呢?
按我的理解string似乎不是字面值类型,但为什么<c++ primer>习题7.55答案说Data类是集合类呢?Data类定义如下: struct Data{ int ival; str ...
- String内容不能改变的理解 String的值不能修改的理解
String内容不能改变的理解 String的值不能修改的理解 java中,String类的值声明后是不能修改,有些初学者就难以理解,为什么下面程序明明是修改了String对象的内容,为什么还 ...
- java string的作用_浅谈java String不可变的好处
一.java内部String类的实现: java 8: public final class String implements java.io.Serializable, Comparable, C ...
- 深入理解String、StringBuffer和StringBuilder类的区别
Java提供了String.StringBuffer和StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法. 它们的相同点是都用来封装字符串:都实现了CharSequence接 ...
- 深入理解String、StringBuffer和StringBuilder
1.String类的特性 public final class Stringimplements java.io.Serializable, Comparable<String>, Cha ...
- java object怎么拿字段_「Java面试秘籍」String不可变,如何理解
Java中最常见的就是String类,那么很多人都说String是不可变类型,那么如何解释下面的代码? public class StringTest { public static void mai ...
- 深入理解String.intern
在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8种基本 ...
- 01.几张图轻松理解String.intern()
当调用 intern() 方法时,编译器会将字符串添加到方法区的运行常量池中(stringTable维护),并返回指向该常量的引用. 在翻<深入理解Java虚拟机>的书时,又看到了2-7的 ...
- Java基础提升篇:理解String 及 String.intern() 在实际中的应用
点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 你所需要的 ...
最新文章
- vant组件搜索并选择_Vue.js自定义弹层组件|vue仿微信/ios弹窗
- 【面试招聘】聊聊秋招中的面试技巧
- adobe 书签怎么设置_让我们设置一些规则…没有Adobe Analytics处理规则
- mysql移动文件后打不开_Windows端MySQL data目录迁移(貌似会启动不了)
- C++冒泡排序(正宗版)
- C++开源代码覆盖率工具OpenCppCoverage介绍(Windows)
- Hadoop源码分析:Hadoop编程思想
- 毕设之 yolo5 航空影像飞行器检测
- 在线点餐APP开发前景如何?
- Android中设置分割线
- 最优传输论文(一)Sliced Wasserstein Discrepancy for Unsupervised Domain Adaptation
- 为什么需要一部21世纪的全球通史?
- Linux 基础上篇
- 天九共享:突破“邓巴数字”桎梏 创造资源能力圈
- 【Python军火库】pyautogui:成熟的鼠标和键盘自己动起来!
- 一文读懂AlphaGo背后的强化学习
- word去掉页面横线
- 16代表啥_出道12年33岁当选,新晋金鹰女神,宋茜比几位前任女神差了啥
- JavaScript翻转数组
- 基于jsp的洋酒销售系统