zoukankan      html  css  js  c++  java
  • 关于Java中的String类的不可变

    此处,不再论述String的不可变,只说说为什么String是不可变的。

    粗暴点,直接来了,String的不可变原因有三:

    1).String类是final的

    用final修饰的类是不可被继承的,用在了String类就代表它不可被继承,不可被后来的程序员用新类继承然后修改它。 这一招,意在让String “断子绝孙”,我认为和阉割有异曲同工之妙。

    2).String的值是一个char数组,是被final和private修饰的

    贴一下String的源代码:

    1 public final class String
    2     implements java.io.Serializable, Comparable<String>, CharSequence {
    3     /** The value is used for character storage. */
    4     private final char value[];
    5 .........
    6 }

    可以看到,String的值实际上是存在一个私有的final char数组中的,数组是一个引用型变量,给它加一个final作用是使value这个句柄的引用地址不可变,但是value指向的数组是放在heap堆中的,它的值是可以改变的

    private修饰的作用是使value不能被其他类访问到,这一点就防止了其他的类直接操作value引用指向的heap堆中的数据。

    3).String设计人员在后面的所有方法中都避免了直接操作heap中的数据

    在第二点中提到了,“value指向的数组是放在heap堆中的,它的值是可以改变的”。虽然value被final修饰,但是作用并不大,甚至final对value的保护作用还不如private。之所以在我们的使用中无法对字符串做修改,是因为Sun公司的程序员在设计String的时候,都小心地避过了直接操作字符串的内容。

  • 相关阅读:
    多态
    课堂动手动脑
    凯撒加密
    构造方法、类初始化
    课堂动手动脑------随机数的产生
    课堂内容小结
    JAVA数字求和
    运行上次失败用例(--lf 和 --ff)
    conftest.py作用范围
    fixture作用范围
  • 原文地址:https://www.cnblogs.com/zhihow/p/9070906.html
Copyright © 2011-2022 走看看