今天对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()方法是就将对象里面的对象进行入池操作,进而释放不必要的空间。