[drp 2]String、StringBuffer和StringBuilder的区别

导读:在实际运用了,我们会频繁的用到string、stringBuffer和stringBuilder这三个东西,那么,他们之间的区别是什么呢。本文主要是从拼写SQL语句的角度,来阐释他们之间的区别!


一、整体观摩

最近,在写SQL语句的时候,常常会用到3种写法,一种是直接用string写,一种是用StringBuffer,一种是用StringBuilder,先来看看其具体使用。

1.1,String

<span style="font-family:KaiTi_GB2312;font-size:18px;">String sql="update t_client set is_leaf=? where id=?";</span>

1.2,StingBuffer

<span style="font-family:KaiTi_GB2312;font-size:18px;">StringBuffer sbSql = new StringBuffer();
		sbSql.append("select a.id, a.pid, a.name, a.client_id, a.client_level_id, ")
			.append("b.name as client_level_name, a.bank_acct_no, a.contact_tel, a.address, a.zip_code, ")
			.append("a.is_client, a.is_leaf ")
			.append("from t_client a left join t_data_dict b on a.client_level_id=b.id where a.id=?");</span>

1.3,StringBuilder

<span style="font-family:KaiTi_GB2312;font-size:18px;">StringBuilder sbSql=new StringBuilder();
		sbSql.append("update t_user ")
		.append("set    user_name   = ?, ")
		       .append("password    = ?, ")
		       .append("contact_tel = ?, ")
		       .append("email       = ? ") 
		.append("where  user_id     = ? ");</span>

从上面的例子,可以看出,尤其是StringBuffer和StringBuilder之间,除了实例化的类不一样,其余使用都一样,那么这三者之间的区别是什么呢?


二、细节探究

2.1,String

C++、java等编程语言中的字符串。 在java、C#中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。 String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。

简单说来:如果定义一个String变量:String strTest="a", 然后我们将这个变量重新赋值:strTest="b",事实上,内存中,有两个string对象。它为b值重新分配了一个空间。


2.2,StringBuffer

String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。

StringBuffer类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用StringBuffer类的append方法追加字符 比 String使用 + 操作符添加字符 到 一个已经存在的字符串后面有效率得多。因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这无凝是一个非常消耗时间的操作。添加多个字符也就意味着要一次又一次的对字符串重新分配内存。使用StringBuffer类就避免了这个问题。


2.3,StringBuilder

一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。

线程安全:线程安全就是说多线程访问同一代码,不会产生不确定的结果。编写线程安全的代码是低靠线程同步。


三、总结

总体说来,String和其他两者之间的区别,事实上也是一个常量和变量的区别。

String是一个常量式的定义,它不可以更改,所以在后续的线程安全上来说,String是一个线程安全的。

对于Buffer和Builder来说,Buffer是一个线程安全的类,不过,虽然 他是线程安全,但如果不是多线程的话,那么还是不用buffer,因为从速度上来看:StringBuilder〉StringBuffer〉String。  

那么从拼写SQL语句方面来说:

确定SQL语句长度的,直接用String。不确定的用Buffer或者builder。多线程同步的,用buffer。如果说在增删改查上面的话:我感觉在查询上应该用buffer,以确保查询结果是符合逻辑一致的。

原文地址:https://www.cnblogs.com/hhx626/p/6010342.html