首先看一个程序

package reverse;

public class Reverse {
public static void main(String[] args)
{
String c1=new String("abc");
String c2=new String("abc");
String c3=c1;
System.out.println("c1==c2:"+ (c1==c2));
System.out.println("c1.equals(c2):"+c1.equals(c2));
System.out.println("c3==c1:"+(c3==c1));
System.out.println("c1.equals(c3):"+c1.equals(c3));
c1="han";
System.out.println(c1+" "+c3);
System.out.println(""+(c3==c1));
}
}

第一个输出语句c1==c2很好理解,因为c1和c2都是用new 创建的对象的引用,虽然对象的值相同,但两个对象在不同的内存空间,也就是说c1和c2是对两个不同的对象的引用,所以结果为false。第二个输出语句c1.equals(c2)是调用了String类的equals方法,该方法用于比较两个字符串对象的值是否相等,所以结果为true。

c1、c2变量在内存中的模拟:

对于c3==c1为true是因为将c1赋值给了c3 也就是将c1对象的引用赋值给了c3;c1和c3在内存中的模拟:

对于System.out.println(c1+"   "+c3),这个输出语句有人会问既然c1和c3引用的是同一个对象,为什么改变c1的值c3的值并不会改变呢?

这就涉及到了Java中String对象的不可变性,什么叫不可变性呢,简单的说就是一旦一个String对象被创建并被赋值(初始化)这个对象的值就不会变化。

一旦一个String对象在内存中创建,它将是不可改变的,所有的String类中方法并不是改变String对象自己,而是重新创建一个新的String对象。

也就是说c1=han,并不是改变了原有对象的值,而是创建了一个新的字符串对象,这个对象的值是han,并把这个对象的引用赋值给了c1。

此时c1 和c3在内存中的模拟:

所以此时c1==c3 为false

正因为String对象的不可变性,如果需要对字符串进行大量的修改、添加字符、删除字符等操作尽量不要使用String对象,因为这样会频繁的创建新的对象导致程序的执行效率下降

这时我们可以使用字符串生成器StringBuilder。

Java中String对象的不可变性的更多相关文章

  1. Java中String对象创建机制详解()

    一String 使用 private final char value来实现字符串存储 二Java中String的创建方法四种 三在深入了解String创建机制之前要先了解一个重要概念常量池Const ...

  2. Java中String对象两种赋值方式的区别

    本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...

  3. java中String对象的存储位置

    public class Test { public static void main(String args[]) { String s1 = "Java"; String s2 ...

  4. Java中String对象的存储位置(学习笔记)

    首先,String是final修饰的.immutable对象,它以一个个字符的方式存储在字符数组中.其次,String类型创建对象有两种方式:①通过字面量赋值:会先去常量池中查找是否存在相同的字符串, ...

  5. Java中String对象的创建

    字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改 String类有一个对应的String池,也就是 String pool.每一个内容相同的字 ...

  6. Java中String类型的不可变性和驻留池

    一 基本概念 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当获得这个类的一个实例引用时,可以改变这个实例的内容. 不可变类:不可变类的实例一但创 ...

  7. java中String对象的split方法

    在java.lang包中有String.split()方法,返回是一个String[]数组,今天碰到一个自己没注意的问题: 1.特殊分隔符 String str1 = "123|456|78 ...

  8. 实习第二天-String对象的不可变性-未解决

    public class Reverse { public static void main(String[] args) { String c1=new String("abc" ...

  9. java中String类为什么不可变?

    在面试中经常遇到这样的问题:1.什么是不可变对象.不可变对象有什么好处.在什么情景下使用它,或者更具体一点,java的String类为什么要设置成不可变类型? 1.不可变对象,顾名思义就是创建后的对象 ...

随机推荐

  1. 查一下 excel中某一列是否有重复

    另一列中写入 =IF(COUNTIF(C:C,C1)>1,"有重复","") 其余往下拖拉公式 我在想如果可以有不往下拖的呢? 不过好像筛选中也有类似的选 ...

  2. free-jqGrid

    PM> Install-Package free-jqGrid jqGrid 是一个用来显示网格数据的jQuery插件,通过使用jqGrid可以轻松实现前端页面与后台数据的ajax异步通信.文档 ...

  3. 读取raw目录中的文件数据

    try { InputStream is2 = getResources().openRawResource(R.raw.info); InputStreamReader isr2 = new Inp ...

  4. Delphi 异或,英文为exclusive OR,或缩写成xor

    异或,英文为exclusive OR,或缩写成xor 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为“⊕”,计算机符号为“xor”.其运算法则为: a⊕b = (¬a ∧ b) ∨ ...

  5. DzzOffice结合office web Apps私有部署的实例

    很多朋友都想在自己使用的DzzOffice中,调用本地部署的office web Apps server. 下面我就直接从头到尾的将部署全部过程分享给大家. 准备条件:两台服务器,配置稍高点,以免卡顿 ...

  6. JS 实现 ResizeBar,可拖动改变两个区域(带iframe)大小

    将网页化成两个区域,左边区域是一个树结构,右边区域是一个iframe,点击左边区域时,右边区域加载页面.实现功能:在两个区域间加一个可拖动条,拖动时改变左右两个区域的大小.在Google上搜索slid ...

  7. div模拟的下拉框特效

    随笔- 4 文章- 0 评论- 0 ? <style type="text/css"> body, ul, li { margin: 0; padding: 0; fo ...

  8. SNIFFER问题集锦

    SNIFFER相关教程下载: Sniffer使用教程.pdf|Sniffer用法.ppt 具体问题解决: 1.SNIFFER4.75无法使用,打开后提示 No adapter is binding t ...

  9. 【LeetCode】58 - Length of Last Word

    Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...

  10. MFC类目录及头文件(转)

    类 描述 头文件 CAnimateCtrl 自动化通用控件 afxcmn.h CArchive afx.h CArchiveException afx.h CArray afxtempl.h CAsy ...