Java中字符串探索—-String ,StringBuffer ,StringBuilder及字符串缓存池
来源:互联网 发布:js判断滚动条是否滚动 编辑:程序博客网 时间:2024/05/16 19:54
转载来自:http://www.xuebuyuan.com/403602.html
字符串是编程中应用到最多的一个数据类型,简单实用,但是深入理解它们,会给我们带来更多好处。
字符串缓存池:
为了节省内存,提高资源的复用,java中引入了字符串缓存池的概念。
缓存池中的字符串是不可回收的:
在缓存池中的字符串是不会被垃圾回收机制回收的,基本都是常驻内存,所以过多食用String类,可能会出现内存溢出(下面会讲)。
怎么样才会存进缓存池:
- 直接量赋值创建对象
在Java,基本包装类型String,Long,Float,Boolean.......都可以利用直接量创建对象。
String用直接量进行创建对象的时候,会先在缓存池找到字符串相同的对象,然后指向缓存池中该对象,这样就避免了重新为该对象分配内存,从而提高了复用,所以建议多用直接量去创建对象,这个也是上篇博文所推荐的。 - 调用构造器创建对象
这种方法调用构造器,凡是new出来的对象都要进行内存分配,所以是不会指向缓存池之前已有的对象,这样就导致缓存池里面可能有多个值相同的String对象。
结果:看出str1 和str2都是指向同一个对象 而str3和str4就不是同一个对象了。
怎么样才能指向缓存池已有的对象:
要指向缓存池对象,改对象必须是直接赋直接量,也可以是多个直接量的运算值,而不能调用方法或者其他变量,但是被final修饰的可以进行宏替换的常量也可以看成直接赋值,因为以上这一些都能在加在类的时候,就被虚拟机计算出来其值。所以能指向缓存池。
上面的代码中 String str2 = "c" + "c" + "f";一共创建了几个对象?????
可能有人会说n个,但是其实只有一个,因为虚拟机对他们进行直接的计算,不需要创建对象,这也是使用直接量的好处。
关于String的不可变问题:
String
String
} 类是个不可变的类,创建对象后,不可以改变对象,但是日常代码经常对String进行操作,这对于String不可变这一说法是不是相悖了?看下这段代码:
得出一些结论:对String对象进行操作后,其返回的是一个新的对象,之前那个对象是没有改变的,改变的是str这个引用所指的对象,这时候的对象已经是新的对象,然而之前那个对象被废弃了,但是他存在缓存池,因此不会被垃圾回收机制回收,所以这里会出现内存泄漏,所以操作字符串,尽量不用String。
但是StringBuffer和StringBuilder进行字符串操作的时候,就不会去new出现对象,引用的都是同一个对象,就可以减少String带来的弊端。
public void testStringBuilder() { StringBuilder builder = new StringBuilder("Hello"); System.out.println("ID=" + System.identityHashCode(builder)); builder.append(" ccf!"); System.out.println("ID=" + System.identityHashCode(builder)); System.out.println(builder); } 结果:ID=854453928ID=854453928Hello ccf!
0 0
- Java中字符串探索—-String ,StringBuffer ,StringBuilder及字符串缓存池
- Java中字符串探索----String ,StringBuffer ,StringBuilder及字符串缓存池
- 字符串(String、StringBuffer、StringBuilder)
- 字符串String,StringBuffer,StringBuilder
- Java中字符串对象String、StringBuffer、StringBuilder的比较
- Java中的字符串 String, StringBuffer和StringBuilder
- Java字符串之String、StringBuilder、StringBuffer
- java字符串连接String、StringBuffer和StringBuilder
- Java- 字符串(String,StringBuffer,StringBuilder类)
- java字符串(String,StringBuffer,StringBuilder,StringTokenizer)
- Java 字符串(String, StringBuffer, StringBuilder,StringTonkenizer)
- 浅谈 Java 字符串(String, StringBuffer, StringBuilder)
- Java字符串:String、StringBuilder、StringBuffer区别
- Java字符串连接效率 String、StringBuilder、StringBuffer
- java字符串处理--String,StringBuffer,StringBuilder类
- 浅谈 Java 字符串(String, StringBuffer, StringBuilder)
- java字符串 -- String,StringBuffer,StringBuilder的区别
- java - 字符串处理 - String|StringBuffer|StringBuilder
- eclipse Generating Getters and Setters Failed
- openwrt手动恢复出厂设置
- go-redis in golang
- Android Studio中使用AIDL以及couldn't find import for class问题的处理
- [LeetCode]N-Queens II
- Java中字符串探索—-String ,StringBuffer ,StringBuilder及字符串缓存池
- UIWebView 的使用
- 堆和栈的区别(转过无数次的文章)
- iOS进阶路线以及进阶书籍
- Android 教你打造炫酷的ViewPagerIndicator 不仅仅是高仿MIUI
- 第十一届湖南省省赛 - Internet of Lights and Switches(二分 + 位运算)
- PHP Cache缓存机制与文件缓存原理
- python安装MySQLdb
- 单身青年,那又如何?【Economist】