Java中String对象的不可变性

首先看一个程序

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。

时间: 2024-08-24 11:28:11

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

java中String对象和String变量

java中String对象和String变量 (2011-12-27 20:40:27) 转载▼ 标签: it 最近在论坛上看到关于String s = new String("XYZ") + new String("XYZ");到底创建几个对象的讨论,觉得比较有意思,在此总结一下. 在JAVA中除了8种基本类型之外,其他的都是类对象及其引用.所以 "XYZ"在JAVA中是一个String对象,对于String类对象来说它的对象值是不能修改的,也

java中String对象的长度

java中String的长度 使用 Integer.MAX_VALUE Integer.MAX_VALUE = 2147483647 :   String   和   StringBuffer 获得长度的方法: public   int   length() Returns   the   length   of   this   string.   The   length   is   equal   to   the   number   of   16-bit   Unicode   c

Java中String对象的传递解析

话不多说了,直接上代码. public class Demo { // static String str = "hello world!"; // static String str = new String("hello world!"); // static char[] ch = new char[]{'A','B','C'}; public static void test(String str,char[] ch,int a) { System.out.

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

一 基本概念 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当获得这个类的一个实例引用时,可以改变这个实例的内容. 不可变类:不可变类的实例一但创建,其内在成员变量的值就不能被修改.其中String类就是不可变类的经典应用. 二 例子 package cn.xy.test; public class StringTest{ /**  * a的值在编译时就被确定下来,故其值"xy"被放入String的驻留池(驻留池在堆中)并被a指向.

java中String对象的split方法

在java.lang包中有String.split()方法,返回是一个String[]数组,今天碰到一个自己没注意的问题: 1.特殊分隔符 String str1 = "123|456|789"; System.out.println(str1.split("|")[0]); 结果是1 这里要注意的是"|"作为分隔符要写成这样 System.out.println(str1.split("\\|")[0]); 同理如果用&qu

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

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)); //c1==c2:false 第一个输出语句c1==c2很好理解,因为c1和c2都是用new 创

java中String的不可变性

昨天面试的时候,面试官问我String的不可变性,我回答的有点糟糕,赶紧查资料总结一下以备忘! 一.原理 1.不变模式(不可变对象) 在并行软件开发过程中,同步操作似乎是必不可少的.当多线程对同一个对象进行读写操作时,为了保证对象数据的一致性和正确性,有必要对对象进行同步.而同步操作对系统性能是相当的损耗.为了能尽可能的去除这些同步操作,提高并行程序性能,可以使用一种不可改变的对象,依靠对象的不变性,可以确保其在没有同步操作的多线程环境中依然始终保持内部状态的一致性和正确性.这就是不变模式. 不

java中String类为什么不可变?

在面试中经常遇到这样的问题:1.什么是不可变对象.不可变对象有什么好处.在什么情景下使用它,或者更具体一点,java的String类为什么要设置成不可变类型? 1.不可变对象,顾名思义就是创建后的对象不可以改变,典型的例子有java中的String类型. 2.相比于可变对象,不可变对象有很多优势: (1)不可变对象可以提高String Pool(字符串常量池)的效率和安全性.如果你知道一个对象是不可变动 ,那么需要拷贝的对象的内容时就不用复制它本身二只是复制它的地址,复制地址(通常一个指针的大小

JAVA中String类

1.String类定义的变量是不可变得 eg:String s0="kvill"; String s1 = new String("kvill"); 为什么要设计为不可变: 1.1 字符串常量池的需要 1.2允许String对象缓存HashCode Java中String对象的哈希码被频繁地使用, 比如在hashMap 等容器中. 字符串不变性保证了hash码的唯一性,因此可以放心地进行缓存.这也是一种性能优化手段,意味着不必每次都去计算新的哈希码. 在String