为什么String被设计为不可变
2015-06-05 17:58
302 查看
对象不可变定义
不可变对象是指对象的状态在被初始化以后,在整个对象的生命周期内,不可改变。
如何不可变
通常情况下,在java中通过以下步骤实现不可变
对于属性不提供设值方法
所有的属性定义为private final
类声明为final不允许继承
Return deep cloned objects with copied content for all mutable fields in class
注意:不用final关键字也可以实现对象不可变,使用final只是显示的声明,提示开发者和编译器为不可变。
Java中典型的不可变类为String类
为什么String被设计为不可变?
安全首要原因是安全,不仅仅体现在你的应用中,而且在JDK中,Java的类装载机制通过传递的参数(通常是类名)加载类,这些类名在类路径下,想象一下,假设String是可变的,一些人通过自定义类装载机制分分钟黑掉应用。如果没有了安全,Java不会走到今天
性能 string不可变的设计出于性能考虑,当然背后的原理是string pool,当然string pool不可能使string类不可变,不可变的string更好的提高性能。
线程安全 当多线程访问时,不可变对象是线程安全的,不需要什么高深的逻辑解释,如果对象不可变,线程也不能改变它。
以上内容应该会使面试官满意
参考:click here
不可变对象是指对象的状态在被初始化以后,在整个对象的生命周期内,不可改变。
如何不可变
通常情况下,在java中通过以下步骤实现不可变
对于属性不提供设值方法
所有的属性定义为private final
类声明为final不允许继承
Return deep cloned objects with copied content for all mutable fields in class
注意:不用final关键字也可以实现对象不可变,使用final只是显示的声明,提示开发者和编译器为不可变。
Java中典型的不可变类为String类
为什么String被设计为不可变?
安全首要原因是安全,不仅仅体现在你的应用中,而且在JDK中,Java的类装载机制通过传递的参数(通常是类名)加载类,这些类名在类路径下,想象一下,假设String是可变的,一些人通过自定义类装载机制分分钟黑掉应用。如果没有了安全,Java不会走到今天
性能 string不可变的设计出于性能考虑,当然背后的原理是string pool,当然string pool不可能使string类不可变,不可变的string更好的提高性能。
线程安全 当多线程访问时,不可变对象是线程安全的,不需要什么高深的逻辑解释,如果对象不可变,线程也不能改变它。
以上内容应该会使面试官满意
参考:click here
相关文章推荐
- iOS常用快捷键
- ProgressBar自定义
- SQLSERVER sp_indexoption的用法 ---- 配置SQLSERVER 只使用行锁
- 生成删除所有外键约束语句
- netty 多线程用一个长连接(channel) 发送消息 并发安全吗?
- 测试博文
- jQuery选择器
- 全文检索的基本原理
- 取月末和取月初
- weblogic后台启动及相杀死相关进程
- 【LeetCode】Maximal Rectangle && Maximal Square
- nginx 入门配置
- SQL SERVER 2005 分区的基本操作
- 在Linux系统中安装使用恶意软件扫描工具及杀毒引擎的教程
- grep
- 路由表填充及准则
- Xcode 6 打包ipa文件
- BDtree记录1
- c++11新特性for循环
- Core Animation 浅析