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

我们知道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 是线程安全的,适合用于多线程操作大量数据时使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值