JAVA中的String类

来源:互联网 发布:linux基本命令 编辑:程序博客网 时间:2024/06/14 05:28

Java中有一个很特殊的类,String类,用来存储字符串。


有一个很经典的问题,

String string = new String("abcdefg");String string = "abcdefg";
这两种创建方式有什么不同?


首先,我们要明确,对象的创建都是在JVM的堆中的。同时,JVM为了优化字符串的存储,还在方法区中开辟了一块字符串常量池,避免相同字符串对象的重复创建。

字符串常量池中存放这大量指向堆中String对象的引用。

看上图,在使用new String构造方法创建实例时,必定会在堆中创建一个String对象,由引用指向;同时,若字符串常量池中没有内容与该String对象内容相等的String对象,就会在堆中再创建一个String对象,由字符串常量池中的引用指向。此时,常量池中的引用与程序中的引用指向的对象并不同。

而使用=""赋值法创建实例,会直接在字符串常量池中查找,若引用引用了同等内容的String对象,则不再创建新的String对象,直接引用;若不存在,则在堆中创建一个String对象,由字符串常量池中的引用和程序中的引用共同引用它。

right,在同等情况下,第一种创建方式总会比第二种多创建一个对象。如果你想新建一个String对象,就要使用new通过构造方法构造一个。如果你只是想使用一下字符串的值,那只需要用=赋值就好了。


String类有大量的API,方便了我们的使用,这个大家可以自行到API网上查阅。

StringBuffer和StringBuilder

由于我们每次使用String,都有可能创建一个新的对象,尤其在进行字符串拼接的时候。在Java中,我们还有一种更好的方式,进行字符串的拼接。那就是使用StringBuffer和StringBuilder,调用它们的append方法即可。


StringBuffer和StringBuilder有什么不同呢?

StringBuilder在Java5.0后才引入的,此前只有String和StringBuffer。那么Java中为何还要再引入StringBuilder呢?

因为StringBuffer是线程安全的,在单线程或不需要考虑线程安全的情况下,其效果有些差强人意。所以,Java引入了StringBuilder,在单线程或不用考虑线程安全时,提高运行的效率。

0 0
原创粉丝点击