java--03--Sting和StringBuilder与StringBuffer

图片摘自:http://www.cnblogs.com/lzq198754/p/5787241.html
这里写图片描述
大神原文:http://blog.csdn.NET/qq_35101189/article/details/54692617?ref=myread
这里写图片描述
String被final修饰,不可被继承,不可被修改。

String str1="123";

直接用如上的方式创建String 变量,会去常量池中查看是否是该字符串,如果存在,则返回常量池中的地址,如果不存在,则在常量池中创建,同样返回常量池中的地址,这样可以重复复用字符串,如下:
在这里插入图片描述
图片摘自架构师社区

String str1="123";
        String str3="123";
        //true
        System.out.println(str1==str3);
 String str2=new String("123");

采用构造方法创建对象,如果常量池中不存在,先会去常量池中创建,然后在堆中创建对象。如下中,因为指向的是不同的内存空间,str1指向的是常量池中123字符串的地址,而str2指向的是堆内存中的123.所以下面将会返回false。

String str1="123";
        String str2=new String("123");
        System.out.println(str1==str2);

https://mp.weixin.qq.com/s/fOvraM-2tTaNSIgNhtEoRw

String提供的工具方法

		String setSql = String.format("%s = %s + %d", " field1"," field1",1 );
		System.out.println(setSql);

输出:

 field1 =  field1 + 1

4 StringBuilder
这里写图片描述
从 JDK 5.0 开始,为StringBuffer类增添了一个单个线程使用的等价类,即 StringBuilder
StringBuilder被final修饰,不能被继承,继承自AbstractStringBuilder类,实现Serializable和CharSequence接口。

public StringBuilder delete(int i, int j);
删除指定区间的字符,i为起始位置,j为终止位置。执行父类AbstractStringBuilder中的相关方法,核心代码为调用System的arrayCopy静态方法 。将j后面的字符放在从i开始的位置

int len = end - start;
        if (len > 0) {
            System.arraycopy(value, start+len, value, start, count-end);
            count -= len;
        }

StringBuilder中的其他方法均是调用System的arrayCopy静态方法
5 StringBuffer
这里写图片描述
StringBuffer同StringBuilder一样也继承自AbstractStringBuilder,
实现Serializable, CharSequence接口。不可被继承,被final修饰。
该类中各个方法同StringBuilder中的方法一样,均是调用父类的方法。
StringBuffer中的方法均被synchronized修饰,为线程安全。

6String StringBuffer StringBuilder区别:
参考博客:
http://www.cnblogs.com/xudong-bupt/p/3961159.html
6.1可变与不可变
  String类中使用字符数组保存字符串,因为有“final”修饰符,所以可以知道string对象是不可变。
这里写图片描述
  
  StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
这里写图片描述
6.2 是否线程安全
  String中的对象是不可变的,也就可以理解为常量,显然线程安全。
  StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:
这里写图片描述
复制代码
  StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
这里写图片描述
6.3 StringBuilder与StringBuffer共同点
StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(…)。只是StringBuffer会在方法上加synchronized关键字,进行同步。
如果可能,建议优先采用StringBuilder,因为在大多数实现中,它不执行同步,它比 StringBuffer 要快。两者的方法基本相同。

速度从慢到快:String < StringBuffer < StringBuilder 。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值