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之List使用方法
    Java之数组遍历
    收集关于前端的一些网站、博客资源、框架、源码等 、 会持续更新哦!!!!!
    css常用代码含义
    css两列等高布局
    HTML之DocType的几种类型
    CSS实现圆角的方法
    IE6图片元素img下出现多余空白问题
    web标准常见问题整理
    好的 Web 前端年薪会有多少?
  • 原文地址:https://www.cnblogs.com/zhihow/p/9070906.html
Copyright © 2011-2022 走看看