在java中String类为什么要设计成final

因为String是引用类型,也就是每个字符串都是一个String实例。通过源码可以看到String底层维护了一个byte数组:private final byte[] value;(JDK9中为byte数组,并非网上所说的char数组)。被final修饰的类不能被继承,也就是不能有子类。

在java中String类为什么要设计成final-Worktile社区

首先,String是引用类型,也就是每个字符串都是一个String实例。通过源码可以看到String底层维护了一个byte数组:private final byte[] value;(JDK9中为byte数组,并非网上所说的char数组)。虽然该数组被修饰为final,但这并不能保证数组的数据不会变化,因此还需要声明为private防止被其他类修改数据。

被final修饰的类不能被继承,也就是不能有子类。那么为什么要把String设计为不能被继承呢?简单来说有两点:安全和效率。

安全

要知道String是一个非常非常基础的类,用处超级广泛,各种各样的类基本都使用到了字符串。

假设String类可以被继承,现在有一个方法method,该方法的参数为String类型,并且该方法利用到了字符串的长度特性:

public int method(String s){

    //do something

    int a = s.length() + 1;

    return a;

}

基于Java的多态特性,当我们把MyString的实例作为参数传入method()方法时,编译器是不会报错的。但是我们的运行结果则完全错误,这会造成非常严重的后果。

相对于每次使用字符串的时候使用final修饰,直接把String类定义为final更为安全,效率也更高。并且,整个类声明为final之后,如果有一个String的引用,则它引用的一定是String对象,而不会是其他类的对象(泛型允许引用子类)。防止世界被熊孩子破坏2333

除了由多态引起的安全问题,还有引用类型本身的问题。

不可变的字符串还可以保证多线程时的线程安全问题。多线程时,只有读操作一般不会引发线程安全问题,当读写同时存在时便容易引发安全问题。当字符串不可变时也就不能写,当然不会引发线程问题。

效率

基于字符串的不可变,才能有字符串常量池这一特性。字符串常量池的诞生是为了提升效率和减少内存分配。可以说我们编程有百分之八十的时间在处理字符串,而处理的字符串中有很大概率会出现重复的情况。正因为String的不可变性,常量池很容易被管理和优化。

并且1.7之前,字符串常量池在方法区,1.7之后在堆内存中,并且不仅仅可以存储对象,还可以存储对象的引用:

String s = new String(“A”) + new String(“B”);//此时常量池存在”A”、”B”,但是不存在”AB”;堆中存在”A”、”B”、”AB”,并且s指向”AB”

s.intern();//1.7之后这里加入的是对象s的引用,而非直接保存”AB”字符串

//intern用来返回常量池中的某字符串,如果常量池中已经存在该字符串,则直接返回常量池中该对象的引用。否则,在常量池中加入该对象,然后 返回引用。

对于什么时候会在常量池存储字符串对象:

显示调用String的intern方法的时候,例如上例。

直接声明字符串字面常量的时候,例如: String a = “aaa”;

直接new String(“A”)方法的参数使用常量的时候

字符串直接常量相加的时候,例如: String c = “aa” + “bb”; 其中的aa/bb只要有任何一个不是字符串字面常量形式,都不会在常量池生成”aabb”. 且此时jvm做了优化,不会同时生成”aa”和”bb”在字符串常量池中

延伸阅读:

什么是string类?

C++、java、VB等编程语言中的名词。 在java、C#中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。

string>是C++标准程序库中的一个头文件,定义了C++标准中的字符串的基本模板类std::basic_string及相关的模板类实例

其中的string是以char作为模板参数的模板类实例,把字符串的内存管理责任由string负责而不是由编程者负责,大大减轻了C语言风格的字符串的麻烦。

std::basic_string提供了大量的字符串操作函数,如比较、连接、搜索、替换、获得子串等。并可与C语言风格字符串双向转换。std::basic_string属于C++ STL容器类,用户自定义的类也可以作为它的模板参数,因此也适用C++ STL Algorithm库。

string本质上是以字符作为元素的vector特化版本;不存在0字符结尾这个概念,能装入’\0’这种数据。

std::basic_string类模板存储且操纵类似char的对象的序列。该对象类型的性质由特性类模板std::char_traits的实例来提供,并作为std::basic_string的第二个模板参数 [1]  。

C++11标准规定:basic_string的元素是连续存储的。即对于basic_string s,有:&*(s.begin() + n) == &*s.begin() + n,其中n属于[0, s.size())。换句话说,指向s[0]的指针即为指向CharT[]数组的首元素指针。C++11已经禁止了写入时复制(copy-on-write)的实现,因为存在多线程安全问题。一般都采用了小字符串优化(SSO)实现,如Visual C++:

文章标题:在java中String类为什么要设计成final,发布者:小编,转载请注明出处:https://worktile.com/kb/p/36137

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小编小编认证作者
上一篇 2023年1月30日 下午10:43
下一篇 2023年1月30日 下午10:48

相关推荐

  • 什么是聚簇索引,什么是非聚簇索引

    聚簇索引是一种数据库索引类型,用于按照某个特定顺序组织数据表中的数据,特点是数据的物理存储顺序与索引键值的顺序相同。非聚簇索引的特点在于数据的物理存储顺序与索引键值顺序无关。非聚簇索引存储了索引键值和相应数据行的地址,允许一个表有多个非聚簇索引。 一、聚簇索引 1. 定义与结构 2. 功能与优势 3…

    2023年7月12日
    81000
  • 什么是接口幂等性

    幂等性是分布式系统设计中十分重要的概念,具有这一性质的接口在设计时总是秉持这样的一种理念:调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。 一、什么是接口幂等性 幂等性原本是数学上的概念,即使公式:f(x)=f(f(x)) 能够成立的数学性质。用在编程领域…

    2023年7月28日
    44800
  • 海豚oa系统

    海豚OA系统:是一种面向企业级用户设计的办公自动化平台,1、提供文档管理、工作流程设计、通信联络、项目管理等功能2、支持移动办公3、具备高度定制性。其文档管理系统特别强调对企业知识产权的保护与分类存储,确保资料的安全性。 海豚OA系统在文档管理方面,提供可靠的权限设置机制,只允许授权用户访问敏感文档…

    2024年1月12日
    27900
  • 团队项目管理软件有什么

    团队项目管理软件有:1、PingCode;2、Worktile;3、Asana;4、禅道;5、Redmine。PingCode是国内国内的一款知名研发项目管理软件,曾在2021年,被知名媒体36氪评为:2021年国内研发项目管理榜单名列前茅的研发项目管理系统。 一、PingCode 这是国内国内的一…

    2023年4月22日
    44700
  • oa信息是什么

    OA信息指的是办公自动化(Office Automation)的相关信息,它涉及使用计算机和软件应用来提升工作效率、简化流程、优化文档管理以及加强通信协作。这一范畴包括电子邮件系统、时间管理工具、数据分析和处理程序、及网络协同平台等。在电子邮件系统中,通过高效的邮件管理,个人和团队能够快速沟通和交换…

    2024年1月11日
    27900
  • 管理系统项目

    开门见山地回应该议题,管理系统项目通常指组织为了提升管理效率及质量而实施的软件化工程。管理系统项目能实现数据集成、优化流程、提升决策质量、增加透明度以及促进组织发展。1、实现数据集成,通过统一的数据库和接口,管理系统项目能够将分散的数据贯穿,达成数据共享与最大化利用。关于数据集成,详细描述即是采用现…

    2024年1月10日
    16900
  • 非住宅项目如何管理好

    非住宅项目的管理工作涉及诸多方面,包括但不限于项目计划与时间管理、成本控制、质量保证、合规性检查、以及危机和风险管理。成功管理非住宅项目的核心观点包括明确项目目标、细致规划、严格执行、有效沟通、定期评审、合理分配资源、灵活应对变化、以及持续优化过程。在这些关键因素中,细致规划尤为重要。它包括对项目的…

    2024年4月10日
    5700
  • 栋号长如何管理一个工地项目

    工地项目管理是一个复杂的过程,涉及规划、组织、指挥、协调、控制等多个方面。成功管理一个工地项目需要以下重点:严格的项目规划、高效的团队协作、精准的成本控制、有效的风险管理、持续的进度监控。在这些要点中,特别是严格的项目规划是项目成功的关键,它包括细致的施工计划、资源分配、时间节点的设定和前期调研,确…

    2024年4月11日
    5300
  • 项目时间管理如何做的更有效

    项目时间管理的有效方法包括制定详细的工作分解结构、设置实际可行的时间目标、使用专业的项目管理工具、持续跟踪项目进度、运用敏捷方法灵活应对变化、加强团队沟通以及进行风险管理。特别地,制定详细的工作分解结构(WBS)对于提高项目时间管理的效率至关重要。它涉及将整个项目细分成更小、更易于管理的部分,让项目…

    2024年4月11日
    7000
  • 办公室自动化oa

    自动化办公系统(OA)主要功能涵盖消息传递、办公流程管理、文档共享及协同工作四大模块。办公自动化(OA)提升工作效率、确保信息安全、支持远程协作、提供实时数据分析并重点解读远程协作的重要性。 一、消息传递系统的重构与优化 办公自动化平台的一大核心是信息交流,其中消息传递系统的重构与优化不可小觑。组织…

    2024年1月11日
    28100

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部