zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    JMeter性能测试
    CentOS7下安装elsticsearch、kibana、filebeat、logstash服务
    Docker容器 之 Harbor 私有镜像仓库的搭建
    Vagrant and VirtualBox 构建 CentOS7
    java 位运算 之 左移和右移理解
    List如果一边遍历,一边删除,且不会报错呢?
    享元模式
    装饰器模式
    日常记录
    销售与营销有什么区别?
  • 原文地址:https://www.cnblogs.com/qingergege/p/5701011.html
Copyright © 2011-2022 走看看