您的位置:首页 > 产品设计 > UI/UE

String 的个人理解以及在栈堆的内存以及Stringbuilder和Stringbuffer

2016-07-15 18:27 831 查看
我们知道String类是不能继承的,因为该类是final型的。而我们经常碰见String的==与equal的问题。

String的“==”:该是比较两字符串的地址是否相等。

String的“equal”:是比较两字符串的值是否相等。

**

具体的原因:

**

new一个String和直接赋值是不一样的,new一个可能会创建两个值,一个是在常量区创建一个字符串,在堆内存创建一个字符串,在指向该内存的地址

,而直接赋值只创建一个字符串,即在字符常量区创建,若已存在则直接指向该区,没有就在该区创建该字符串,在指向他。

而==是指比较两字符串的地址,而equal则比较俩字符串的值。所以new一个字符串和直接赋值的地址是不相同的,但内容是相同的

还有就是字符串常量是地址相同的,不是常量的地址是无法判断,即是不相同的,如:

String a=”e”;

String b=”e1”;

String c=a+1;

判断(a==c)和a.equal(c);前面的一个为false,后面一个为true,因为a为变量,所以在运行的时候才能判断,所以为false,如果将

c改为”a”+1;即a==c就为true,因为”a”为常量,若不该的话,就必须将a改为final才可以。


Stringbuffer、StringBuilder 与String

三者都是用于操作字符串的,但是三者操作的速度不一样,即

在执行速度方面的比较:StringBuilder > StringBuffer >String

主要原因在于String(是字符串常量),而其他两个(是字符创变量);

何为字符串常量就是不能改变该对象,而后者是可是改变的字符串对象,他不像String一样,需要每次创建,后两者是在原有的字符串对象进行操作的。如:

StringBuilder sb=new StringBuilder(“gg”);

sb.append(“123”).append(“qwe”);

该是在字符串对象进行操作的,不需要一直创建对象。同理StringBUffer也是一样的。

而String是这样的:

String a=“123”;

String b=“阿斯顿”;

a=a+b;

他首先先创建一个“123”的字符串a对象,然后在创建一个“阿斯顿”的字符串b对象,最后又创建一个字符串a对象的“123阿斯顿”对象,可想而知这速度会很慢。而原来的“123”则会变成为垃圾。

注意:如果String a=“123”+“asd”+“请问”+“345”;

该字符串的速度会高于其他两种,原因其实就是该字符串a是直接为“123asdqw245”;所以速度优与其他两种。如果你的字符串是来自另外的String对象的话,速度就没那么快了如上面的一种。

StringBuilder 与 StringBuffer

StringBuilder 速度最快,但是线程不安全,适合用于单线程操作大量数据时使用。

StringBuffer 是线程安全的,适合用于多线程操作大量数据时使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息