zoukankan      html  css  js  c++  java
  • 图解String类型的不可变性及其原因

    1.String的不可变性

    String s=“abcd”;

    上面的语句定义了一个字符串变量s。该变量指向字符串“abcd”,当初始化变量s时,会在堆中为s非配内容空间。例如以下图所看到的:


    当将字符串变量,赋值给还有一个字符串变量时,比如:String s2=s。

    此时。s2和s是同样的字符串对象。例如以下图所看到的:


    当一个字符串连接其它字符时。他就指向了新的字符串对象,比如。s=s.concat("ef“)。 例如以下图所看到的


    当一个字符串在堆中被分配内容时,它就是不可变的,不论什么String的方法都无法改变字符串本身,但它能够返回一个新的字符串对象。

    假设须要能够改动的字符串对象,能够使用StringBuffer和StringBuilder,StringBuffer是线程安全的,因为StringBuilder不须要进行同步操作,StringBuilder是比較高速的。

    2.String 不可变性的原因

    1)字符串池(String pool)的需求
    在Java中,当初始化一个字符串变量时。假设字符串已经存在。就不会创建一个新的字符串变量,而是返回存在字符串的引用。

    比如: String string1="abcd";
    String string2="abcd";
    这两行代码在堆中仅仅会创建一个字符串对象。

    假设字符串是可变的。改变还有一个字符串变量。就会使还有一个字符串变量指向错误的值。

    2)缓存字符串hashcode码的须要
    字符串的hashcode是常常被使用的。字符串的不变性确保了hashcode的值一直是一样的,在须要hashcode时,就不须要每次都计算,这样会非常高效。
    3)出于安全性考虑
    字符串常常作为网络连接、数据库连接等參数。不可变就能够保证连接的安全性。



  • 相关阅读:
    Delphi关于记录文件的操作转
    数字电视分辨率
    delphi FileSetAttr 设置文件的属性转
    vc delphi 回调函数具体说明和实例与分析 转
    TFileStream(文件流) 读写转
    HDMI接口
    UDP和TCP协议包大小的计算转
    字符编解码的故事(ASCII,ANSI,Unicode,Utf8) 转
    [bzoj3894]文理分科
    [bzoj5338]xor
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5134898.html
Copyright © 2011-2022 走看看