zoukankan      html  css  js  c++  java
  • 005 String s = "Hello";s = s + " world!";执行这两行代码执行后,原始的 String 对象中的内容到底变了没有?

    原始的String对象中的内容没有改变成“Hello world”.

    1、原因

      因为在Java中String类被设计成不可改变的类,所以String类的所有对象都是不可变的。第一句代码中,s(存储在栈区)引用了堆中的一个内存区域

    (记为a1),a1堆内存区域存储的内容是“Hello”。执行第二句代码后,s不在引用a1区域,而是重新引用了堆中的另外内存区域(记为a2),且a2中的内容是“Hello world”。s并没有对原始的a1堆内存中的内容进行改变,而是重新指向了新的堆内存区域。

     

    2、启发

      在程序中,如果需要多次对字符串进行修改的时候,不建议使用String类型定义字符串对象,因为这会频繁的在堆中开辟内存创建新的String对象,造成低效和内存浪费。可以使用StringBuffer,它允许修改,而不是每个不同的字符串都要生成一个新的对象。

    3、两种赋值方式的区别

      String s = "Hello"的赋值方式,“Hello”的内容是不允许修改的,而且若String s1 = "Hello";String s2 = "Hello";则s1和s2指向同一个字符串对象,也即同一块内存。但是String s1= new String(“Hello”)和String s2 = new String(“Hello”),s1和s2指向两个不同的string对象,指向的内存区域也不一样。总结如下:对于字符串常量,如果内容相同,则Java认为它们代表同一个String对象,而使用关键字new调用构造器,则每new一次,就会创建一个新的对象,而不论内容是否相同。

  • 相关阅读:
    VFIO PF SRIOV IOMMU UIO概念解释、关联
    集群节点间网络通信TIPC
    1. C语言中的数据结构.md
    第三讲. COTS包交换介绍
    SYSTick 定时器
    热电偶基础知识介绍-04
    附录1· 初识Linux操作系统
    热电偶冷端补偿
    珍惜是最宝贵的财富。
    CSS 设置标题文字只显示一行,多余显示省略号
  • 原文地址:https://www.cnblogs.com/xwwbb/p/11082089.html
Copyright © 2011-2022 走看看