zoukankan      html  css  js  c++  java
  • java中String类为什么要设计成final?

    1

    将方法或类声明为final主要目的是:确保它们不会在子类中改变语义。String类是final类,这意味着不允许任何人定义String的子类。

    String基本约定中最重要的一条是immutable。

    但是假如String没有声明为final, 那么你的StringChilld(声明为final就不可被继承)就有可能是被复写为mutable的,这样就打破了成为共识的基本约定。

     
    2
    String源码前几行
    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];
    •  String类用final关键字修饰,说明String不可继承。
    • 字段value 是char【】数组,用final修饰,说明value这个引用地址不可变,但是Array数组是可变的。
      栈指针不可变,但是堆上的数据本体可以变。
    3 不可变有什么好处
    • 安全:多线程下对资源做写操作有危险。不可变对象不能被写,所以线程安全。
    • 可以共用一个实例(在多线程中共享一个不可变对象而不用担心线程安全问题):当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。String one = “someString”;String two = “someString”,都用字面量“someString赋值”,他们其实都指向同一个内存地址。当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。(PS:运行时常量池是方法区的一部分,用于存放各种字面量和符号引用)
    • String是几乎每个类都会使用的类,特别是作为Hashmap之类的集合的key值时候,mutable的String有非常大的风险。
  • 相关阅读:
    nodeclub 学习记录
    读mongoose api 记录
    sublime 插件 和free 注册码
    mongodb 基本语法
    安装 adobe flash player
    nginx 安装
    压缩 解压文件
    async 异步流程控制规则
    a标签# 和javascript:;的区别
    获取url 参数
  • 原文地址:https://www.cnblogs.com/chengdabelief/p/7503987.html
Copyright © 2011-2022 走看看