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

为什么Java的string类要设成immutable(不可变的)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

http://www.matrixq.net/2011/12/10469.html

 

最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类型?

不可变对象,顾名思义就是创建后不可以改变的对象,典型的例子就是Java中的String类,

String s = "ABC";
s.toLowerCase();

.toLowerCase()并没有改变“ABC”的值,而是创建了一个新的String类”abc”,然后将新的实例的指向变量s。

相对于可变对象,不可变对象有很多优势。

1)不可变对象可以提高String Pool的效率和安全性。如果你知道一个对象是不可变的,那么需要拷贝这个对象的内容时,就不用复制它的本身而只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存效率也很高。对于同时引用这个“ABC”的其他变量也不会造成影响。 2)不可变对象对于多线程是安全的,因为在多线程同时进行的情况下,一个可变对象的值很可能被其他进程改变,这样会造成不可预期的结果,而使用不可变对象就可以避免这种情况。

当然也有其他方面原因,但是最Java把String设成immutable最大的原因应该就是效率和安全的。

 

转载于:https://my.oschina.net/hanruikai/blog/158029

相关文章:

  • C++ STL算法系列1---count函数
  • C++静态变量内存分配,编译阶段,解密
  • zabbix +监控ftp+邮件报警
  • [ZT] 浙江大学校长杨卫院士:研究生导师“十戒”
  • Liferay 中部署portlet的细节窥探
  • 解决思科认证学员与高校网络及信息安全专业实验限制的解决方案
  • WPF 4 Ribbon 开发 之 快捷工具栏(Quick Access Toolbar)
  • HDU 3920 Clear All of Them I(DP + 状态压缩 + 贪心)
  • 美化代码的15个代码语法高亮工具
  • 异常的概念和Java异常体系结构
  • 解决ftp不支持软连接
  • Entity Framework做IN查询
  • cocos2d-x 向android移植问题汇总
  • http Post 请求一网络资源返回字符串
  • GOOGLE PROTOBUF开发者指南
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 03Go 类型总结
  • PaddlePaddle-GitHub的正确打开姿势
  • SpriteKit 技巧之添加背景图片
  • webpack+react项目初体验——记录我的webpack环境配置
  • 区块链共识机制优缺点对比都是什么
  • 由插件封装引出的一丢丢思考
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • #mysql 8.0 踩坑日记
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三)mysql_MYSQL(三)
  • (一)WLAN定义和基本架构转
  • (转)详解PHP处理密码的几种方式
  • .NET Core 中插件式开发实现
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net 获取url的方法
  • .NET 中让 Task 支持带超时的异步等待
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .net流程开发平台的一些难点(1)
  • .net专家(高海东的专栏)
  • @angular/cli项目构建--Dynamic.Form
  • @AutoConfigurationPackage的使用
  • @ModelAttribute注解使用
  • [ linux ] linux 命令英文全称及解释
  • [100天算法】-二叉树剪枝(day 48)
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [codevs 2822] 爱在心中 【tarjan 算法】
  • [CSS3备忘] transform animation 等
  • [leetcode]Symmetric Tree
  • [No000010F]Git8/9-使用GitHub
  • [noip模拟]计蒜姬BFS
  • [NowCoder]牛客OI周赛3
  • [Oh My C++ Diary]operator++()和operator++(int)的区别
  • [PHP源码阅读]empty和isset函数