当前位置: 首页 > article >正文

String可以被继承吗?

String类由final修饰,所以不能被继承。

扩展:

在Java中,String类被设计为不可变类,主要表现在它保存字符串的成员变量是final的。

  • Java 9之前字符串采用char[]数组来保存字符,即 private final char[] value
  • Java 9做了改进,采用byte[]数组来保存字符,即 private final byte[] value

之所以要把String类设计为不可变类,主要是出于安全和性能的考虑,可归纳为如下4点。

  • 由于字符串无论在任何 Java 系统中都广泛使用,会用来存储敏感信息,如账号,密码,网络路径,文件处理等场景里,保证字符串 String 类的安全性就尤为重要了,如果字符串是可变的,容易被篡改,那我们就无法保证使用字符串进行操作时,它是安全的,很有可能出现 SQL 注入,访问危险文件等操作。
  • 在多线程中,只有不变的对象和值是线程安全的,可以在多个线程中共享数据。由于 String 天然的不可变,当一个线程”修改“了字符串的值,只会产生一个新的字符串对象,不会对其他线程的访问产生副作用,访问的都是同样的字符串数据,不需要任何同步操作。
  • 字符串作为基础的数据结构,大量地应用在一些集合容器之中,尤其是一些散列集合,在散列集合中,存放元素都要根据对象的 hashCode() 方法来确定元素的位置。由于字符串 hashcode 属性不会变更,保证了唯一性,使得类似 HashMap,HashSet 等容器才能实现相应的缓存功能。由于 String 的不可变,避免重复计算 hashcode,只要使用缓存的 hashcode 即可,这样一来大大提高了在散列集合中使用 String 对象的性能。
  • 当字符串不可变时,字符串常量池才有意义。字符串常量池的出现,可以减少创建相同字面量的字符串,让不同的引用指向池中同一个字符串,为运行时节约很多的堆内存。若字符串可变,字符串常量池失去意义,基于常量池的 String.intern() 方法也失效,每次创建新的字符串将在堆内开辟出新的空间,占据更多的内存。

因为要保证String类的不可变,那么将这个类定义为final的就很容易理解了。如果没有final修饰,那么就会存在String的子类,这些子类可以重写String类的方法,强行改变字符串的值,这便违背了String类设计的初衷。


http://www.kler.cn/a/376861.html

相关文章:

  • PLC实现HTTP协议JSON格式数据上报对接的参数配置说明
  • python学opencv|读取图像(二十九)使用cv2.getRotationMatrix2D()函数旋转缩放图像
  • 【llm/ollama/qwen】在本地部署qwen2.5-coder并在vscode中集成使用代码提示功能
  • Wsl报 不存在具有提供的名称的分布
  • openai swarm agent框架源码详解及应用案例实战
  • 【CSS】设置滚动条样式
  • 【开源免费】基于SpringBoot+Vue.JS墙绘产品展示交易平台(JAVA毕业设计)
  • 《分子科学学报》
  • 怎么压缩pdf文件大小?关于压缩PDF文件大小的几种压缩方法
  • Git常用高频命令学习
  • Milvus - 标量字段索引技术解析
  • Linux云计算 |【第五阶段】CLOUD-DAY10
  • 实体类的json和对象转换工具类
  • Python Flask内存泄漏分析定位
  • 尚航科技亮相中国国际数字经济博览会,重磅发布怀来尚云智算中心
  • KTHREAD--InitialStack和KernelStack和TSS的esp0
  • css实现antd丝带效果
  • ubuntu安装与配置Nginx(2)
  • 制造业中的主数据有哪些?
  • 【重生之我要苦学C语言】深入理解指针3
  • kafka里的consumer 是推还是拉?
  • [RootersCTF2019]ImgXweb
  • python实现了对一个数据集(从csv文件读取)的数据预处理、异常值检测、数据重构以及使用多种机器学习模型进行评估和调优的功能
  • selenium 点击元素报错element not interactable
  • 处理非结构化数据:Python中的BeautifulSoup库解析HTML
  • 扫描项目中存在高危风险依赖包升级处理。