Java中的String浅析

来源:互联网 发布:将军在上 原著 知乎 编辑:程序博客网 时间:2024/05/30 05:23

Java的String类型的存储有两种情况 ,存储在字符串池pool中或者是存储在堆heap中,下面就几种不同的字符串的创建方式来进行分析;

字符串的创建方式有以下几种:

1、String str = new String();

2、String str = "abc";

3、String str = new String("abc");

4、String str = "ab"+"c";

5、String a = "a";  String str = a + "bc";

6、int a = 10;   String str = a + "abc"; 

这三种情况下,同样是建立字符串但是他们的含义是不同,依次来看一下吧,

1、String str = new String();这种情况下:建立字符串的过程是在程序运行的时候才能生成的这样的话,生成的字符串是在存储在heap中,而且在生成内容一样的时候也不会进行优化而是从新生成一个字符串对象。

例如:String str1 = new String("abc"); String str2 = new String("abc");及时这样的情况的话依然生成的还是两个字符串,通过str1 == str2进行判断返回  false;

2、String str = "abc";这种情况下,字符串生成的过程是在程序编译的时候进行的,生成以后存储在pool中最终成为常量池的一部分。这种情况下当生成字符的时候会首先去pool中检索,如果找到同样的字符串的内容的时候会直接将变量指向那个内容,没有的话就在pool中建立新的字符串并指向这里,因此String s1 = "as";String s2 = "as";  s1 == s2返回true;

3、String str = new String("abc");这种情况相当于是前两种情况的结合体这个创建过程是首先字pool中检索如果有"abc"这个字符串的话那么直接将这个字符串复制到heap中然后如果pool中的这个字符串没有被引用的话就被垃圾回收机制回收,否则的话就不回收,如果pool中没有的话那么就在pool中建立建立这样的字符串,然后就在pool中建立这样的一个字符串中然后再复制到heap中,最后如果pool的这个字符串没有被引用的话就会被垃圾回收机制回收,否则不回首。不推荐使用这种方式因为这种方式的话首先来说效率低下其次的话还有可能导致内存泄露的情况。

4、String str = "ab"+"c";这种情况下生成字符串的过的过程是在程序编译的是时候生成的因此生成的字符串是在pool中的。

5、String a = "a"; String str = a + "bc";这种情况下看起来和4很像但是处理原理却完全不同,因为a是一个变量因此字符串str生成的过程只能在程序运行的时候进行,因此最终str字符串是存储在heap中的;

6、int a = 10; String str = a + "abc"; 这个和5是相似的唯一不同的就是在运行过程中涉及到了一个类型升级的问题整形a在和字符串相加的时候自动升级成了字符串类型。

0 0