String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?
没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为 String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
实际上,当我们需要一个字符串对象时,应该使用如下语法来创建String对象:
Sring s = "fkjava.org";
也就是直接使用字符串直接量的语法。而不是:
String s = new String("fkjava.org");
对于第二种语法而言,每次都会调用构造器生成新的String对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。
基于这样一种想法,Java提供了字符串缓存池来管理字符串直接量,当程序多次用到同一个字符串直接量时,系统会让它们都引用字符串缓存池中的同一个String对象。因此使用在程序中使用字符串直接量可以充分利用这个特性来降低系统内存开销,提高程序性能。
最新文章
- SpringMVC注解@RequestParam全面解析---打酱油的日子
- Objective C 快速入门学习四
- 1.python的第一步
- Speex for Android
- 小试牛刀——爬topit.me的图片,附github简易上传教程
- github fork, star and watch
- Virtual Box配置CentOS7网络
- java 数组排序方法整理,简单易懂,
- CRM客户关系管理系统(一)
- 算法学习之BFS、DFS入门
- C++ Primer 笔记——拷贝控制
- sql 中的null值
- html.EditorForModel自定义模版
- python-xlwt给excel添加样式
- vue-cli 安装失败Failed to download repo vuejs-templates/vuedemo: Response code 404 (Not Found)
- JavaEE笔记(三)
- P值解释和误区
- 团体程序设计天梯赛L1-025 正整数A+B 2017-03-23 22:47 61人阅读 评论(0) 收藏
- Swift 版本号非常好的卡片切换效果基于ZLSwipeableView(相似于[陌陌点点][探探])
- Nodejs 基础知识 浅析