• 图解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)出于安全性考虑
    字符串常常作为网络连接、数据库连接等參数。不可变就能够保证连接的安全性。



  • 相关阅读:
    开启chrome默认支持ipv6
    IC6151试用发现的问题
    锁存器(latch)、触发器(Flipflop)、寄存器(register)的区别
    文件管理小习惯:在特定位置创建快捷方式
    采用SPI接口的芯片
    阅读笔记:TI Grounding in mixedsignal systems demystified, Part 1
    IC6151使用小技巧,摸索中。。。
    基于RBAC模型的权限管理系统的设计和实现(转载)
    Cron 表达式说明
    组织结构及授权系统关系
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5134898.html
Copyright © 2020-2023  润新知