1.String类
String类是Java中最常用的对象之一,下面分析下String对象。
String对象底层是一个fina类型的char数组,如下:
private final char value[];
1.由于 String本质上是fina类型的字符数组,因此String是不可变对象。
每次new一个String对象,或者在任何情况下给String赋值、做字符串拼接、运算,得到的都是一个新的对象。(不要和常量池混淆)
2.由于java中的字符char是基于unicode编码(占2个字节),因此Java String是字节无关的。
如果将String对象转换成字节,则需要指定编码,如
String s = "abc";
byte[] bs = s.getBytes("UTF-8");
如果不指定编码,则使用平台的默认编码。
同样,由字节转数组化成String对象需要指定编码,否则使用平台的默认编码。
2.StringBuffer类String类区别
StringBuffer类内部维护了一个可变的成员变量char[] value;因此是可变的。
StringBuffer优于String对象主要在于:字符串连接操作中StringBuffer的效率要比String高。
但是对于String的字符串拼接,即+操作,jvm会自动将String转化成StringBuffer以提升效率。
但以下情况最好使用StringBuffer:
String[] elem = ...;
String str = "";
for(int i = 0;i < elem.length;i++){
str +=elem[i];
}
因为jvm会将该代码编译成:
</pre><pre>
String[] elem = ...;
String str = "";
for(int i = 0;i < elem.length;i++){
StringBuffer sb = new StringBuffer(str);
sb.append(elem[i]);
str = sb.toString();
}
多次new StringBuffer对象,效率低下,应改为:
String[] elem = ...;
String str = "";
StringBuffer sb = new StringBuffer(str);
for(int i = 0;i < elem.length;i++){
sb.append(elem[i]);
}
str = sb.toString();
3.StringBuffer类StringBuider类区别
StringBuffer 字符串变量(线程安全),append等方法为synchronize方法
StringBuilder 字符串变量(非线程安全)。
在单线程中,做字符串操作时,StringBuilder性能高于StringBuffer。
对于三者使用的总结:
1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer