Java对象创建方式及JVM对字符串处理
作者:网络转载 发布时间:[ 2013/4/26 10:57:39 ] 推荐标签:
我们可以看到两个的值是不一样的,所以此处说明String是典型的不可变类,上述代码之后代码中的内存分配情况是
或许你看了之后会说,没关系啊,这个java会自动进行垃圾回收,到时候回收行了,到这里,我得补充一下前面没有说到的问题了:
java为了节省内存,提高资源的复用,才引入了字符串缓存池的概念,而且,在缓存池中的字符串是不会被垃圾回收机制回收的,基本都是常驻内存,所以过多使用String类,可能会出现内存溢出。
所以前面的代码中,对String对象进行操作后,其返回的是一个新的对象,之前那个对象是没有改变的,改变的是name这个引用所指的对象,这时候的对象已经是新的对象,然而之前那个对象被废弃了,但是他存在缓存池,因此不会被垃圾回收机制回收,所以这里会容易出现内存泄漏,所以如果要操作字符串,尽量不用String而改为使用StringBuffer或者StringBuilder。
2)StringBuilder和StringBuffer:可变的字符串
之所以说他们会改变的原因是:StringBuilder和StringBuffer在进行字符串操作的时候不会去创建一个新出现的对象,引用的都是同一个对象,减少了String带来的弊端。
public class Test{
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("小学徒");
System.out.println(System.identityHashCode(sb));
sb.append("的成长历程");
System.out.println(System.identityHashCode(sb));
}
}
运行结果:
那么StringBuilder和StringBuffer这两个类有什么区别呢?
他们之间的区别在于StringBuffer是线程安全的,也是说StringBuffer类里绝大部分方法都增加了synchronized修饰符,这样降低了该方法的执行效率,所以在没有多线程的环境下,推荐使用StringBuilder。
StringBuffer的源代码:
StringBuilder的源代码:
本文转载自:http://www.cnblogs.com/xiaoxuetu/
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11