Java之你真的了解String吗?--内存分析

今天对String类进行了相应的复习,才发现原来String的运用会决定你代码的质量。
众所周知,String修饰的字符串是不可已进行修改的,那么它所进行字符串的拼接的时候需要再重新进行创建对象进行赋值。

   String str1 ="abc";
   String str2 = "def"; 
   String str3 = str1 + str2;

对于上述简单的字符串拼接,在jvm里面做了哪些动作,控制台对Java代码进行反汇编
进入class文件中,控制台输入javap -c demo.class 由下图可见 在常量区创建两个对象abc,def 同时创建stringbuilder对象,并对引用类型的变量进行append操作,对引用类型进行拼接操作。而调用方法是要消耗时间性能的,因此这样的代码就是垃圾。
在这里插入图片描述
由此可见,上述为创建str3进行创建了两个对象,一个是StringBuilder对象,一个是String对象。由此可见这就是垃圾中的代码

String str3 = "abc"+"def";

反汇编得到
在这里插入图片描述
可见只在常量区创建了"abcdef",代表的意思就是栈中的str3直接指向编译时已经创建的abcdef,这样进行拼接字符串时,在编译期间就已经将字符串个拼接起来了,而不需要嗲用方法进行拼接。

那么在底层到底是如何进行拼接的哪
在这里插入图片描述
如何进行判断相同常量在内存中只有一个位置

String str = "abc";
String str2 = "abc"

在这里插入图片描述

intern 方法手动入池

String str = "abc";
String str2 = new String("abc");
System.out.println(str2.intern()==str);//直接不调用方法肯定不相等。

上述比较是true; 原本String在堆里面创建一个对象占用一块空间,这时创建的对象中的常量字符串"abc"的地址和str的地址是一样的。
在这里插入图片描述
因此在调用intern()方法是就将对象里面的对象进行入池操作,进而释放不必要的空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值