为什么String被设计为final
来源:互联网 发布:数据线线芯 编辑:程序博客网 时间:2024/05/13 12:43
设计为final就是为了不想改变,理由有两点,设计(安全)和效率。
设计安全:
只有当字符串是不可变的,字符串池才有可能实现,字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串,如果字符串是可变的,当变量改变了它的值,那么其它指向这个值的变量的值也会一起改变,那么会引起很严重的安全问题。
另一方面,从平台安全性上来说,Java自出生那天起就是“为人民服务”,这也就是为什么Java做不了病毒,也不一定非得是病毒,反正总之就是为了安全,人家Java的开发者目的就是不想让Java干这类危险的事儿,Java并不是操作系统本地语言,换句话说Java必须借助操作系统本身的力量才能做事,JDK中提供的好多核心类比如String,这类的类的内部好多方法的实现都不是Java编程语言本身编写的,好多方法都是调用的操作系统本地的API,这就是著名的“本地方法调用”,也只有这样才能做事,这种类是非常底层的,和操作系统交流频繁的,那么如果这种类可以被继承的话,如果我们再把它的方法重写了,往操作系统内部写入一段具有恶意攻击性质的代码什么的,这不就成了核心病毒了么?如果这些个核心的类都能被随便操作的话,那是很恐怖的,会出现好多好多未知的错误,莫名其妙的错误….
从效率上讲:
final修饰的类不能被继承,这意味着不允许任何人定义String的子类。这意味着JVM才不用对相关方法在虚函数表中查询,而直接定位到String类的相关方法上,提高了执行效率。
因为字符串是不可变的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步,这也是设计为final来保证线程安全的一个体现。
因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算,这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。
总而言之,就是要保证 java.lang.String 引用的对象一定是 java.lang.String的对象,而不是引用它的子孙类,这样才能保证它的效率和安全。
- 为什么String被设计为final
- 为什么String类被设计成final
- String类为什么被定义为final类型
- 为什么String被设计为不可变
- String为什么要设计成final
- Java中String类为什么定义为final
- 为什么把String类设置为final的
- String 为什么是final
- Java中String为什么被设计成immutable(不可修改的)/final
- String为什么被设计成final以及字符串池的学习
- 为什么jdk中把String类设计成final?
- 为什么jdk中把String类设计成final?
- 为什么jdk中把String类设计成final?
- 为什么 jdk 中把 String 类设计成 final
- 为什么jdk中把String类设计成final?
- 为什么 jdk 中把 String 类设计成 final
- Java的String为什么要设计成final
- 为什么jdk中把String类设计成final?
- thrift学习笔记(一) thrift简介及第一个helloword程序
- 目前为止小程序审核不通过原因整理汇总
- ThreadPoolExecutor使用和思考(中)-keepAliveTime及拒绝策略
- Ajax跨域访问(二)
- 1 FreeMarker数据+模型=输出 实例
- 为什么String被设计为final
- opencv学习笔记之xml文件读写
- 回文词(Uva 401)
- [3] Window PowerShell DSC 学习系列----如何在PowerShell DSC 5.x 安装最新的DSC Module?
- JAVA之抽象和封装
- C语言指针变量
- java文件操作
- NYOJ 1170 最大的数
- 环信即时通讯集成过程