1.1 String 类那些特点
(1)字符串常量就是String类的匿名对象,一旦字符串定义则不可改变;
(2)String类对象可以直接赋值或者构造方法实例化,前者可以自动入池,又不产生垃圾空间;
在实际的开发之中,肯定都要求使用到String类,可是String有一个天生的短板:不可改变,所以如果要想面对经常修改的环境下只能使用Stringbuffer类。
在String类中可以使用“+”来实现连接操作,而在StringBuffer中可以使用append()方法实现“+”的功能,次方法发定义如下:public StringBuffer append(数据类型 变量)
范例:利用StringBuffer修改字符串
package day2;
public class TestDemo {
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer();
buffer.append("旺财").append("是一条狗");//连接字符串
fun(buffer);//修改字符串内容
System.out.println(buffer);
}
public static void fun(StringBuffer temp){//引用传递
temp.append("n旺旺旺!!!");
}
}
旺财是一条狗
旺旺旺!!!
此时的执行结果之中发现字符串的内容已经得到了改变,所以StringBuffer适合于修改,而String不适合于修改。
原则:在开发之中95%的情况下都应该是String(String只是不适合于频繁修改),所以不可能使用循环操作String,但是如果真的进行链接操作,还建议使用“+”。如果真的是循环修改,肯定使用StringBuffer。
String、StringBuffer 两个类有什么关系?
通过观察两个类的继承结构:
String:public final class String extends Object implements Serializable, Comparable,CharSequence
StringBuffer:public final class StringBuffer extends Object
implements Serializable, CharSequence
发现String和StringBuffer类都是CharSequence接口的子类;所以String和StringBuffer都可以向上转型为CharSequence接口实例化。
package day2;
public class TestDemo {
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer();
buffer.append("旺财").append("是一条狗,你不要过来呀。》老树开花从年度计划的建设进度");//连接字符串
CharSequence charSequenceBuffer = buffer;
fun(buffer);//修改字符串内容
System.out.println(buffer);
System.out.println(charSequenceBuffer.length());
System.out.println(charSequenceBuffer.subSequence(5,19));
String str = "此时"+"的执行结果之中发现"+"字符串的内容已经得到了改变";
CharSequence charSequenceStr = str;
System.out.println(str);
System.out.println(charSequenceStr.length());
System.out.println(charSequenceStr.subSequence(5,12));
}
public static void fun(StringBuffer temp){//引用传递
temp.append("n旺旺旺!!!");
}
}
旺财是一条狗,你不要过来呀。》老树开花从年度计划的建设进度
旺旺旺!!!
36
狗,你不要过来呀。》老树开花
此时的执行结果之中发现字符串的内容已经得到了改变
24
结果之中发现字
String与StringBuffer类的对象相互转换
String转StringBuffer:
(1)利用StringBuffer类的构造方法:public StringBuffer(String str)
String str = "此时"+"的执行结果之中发现"+"字符串的内容已经得到了改变"; StringBuffer s = new StringBuffer(str); System.out.println(s);
(2)StringBuffer存在append()方法,public StringBuffer append(String str)
String str = "此时"+"的执行结果之中发现"+"字符串的内容已经得到了改变"; StringBuffer s = new StringBuffer(); System.out.println(s.append(str));
StringBuffer转String
(1)所有类都存在toString()方法,利用此方法可以将StringBuffer内容转成String内容
StringBuffer buffer = new StringBuffer();
buffer.append("旺财").append("是一条狗!");//连接字符串
System.out.println(buffer.toString());
(2)利用“+”实现所有数据类型想String的转换。
StringBuffer buffer = new StringBuffer("旺财");
String s = "" + buffer;
System.out.println(s);
虽然在开发中,要进行字符串的操作都是以String类为主,可是你永远不要忽略一点:StringBUffer类也提供了一下好的操作方法,方便用户开发代码。
范例1:在指定位置追加新的内容
方法:public StringBuffer insert(int offset,数据类型 变量)
public class TestDemo {
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer("旺财");
buffer.insert(0,"你好").insert(1,"特么");
System.out.println(buffer);
}
}
你特么好旺财
范例2:反转
方法:public StringBuffer reverse()
package day2;
public class TestDemo {
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer("Hello");
System.out.println(buffer.reverse());
}
}
olleH
范例3:删除指定范围内数据
方法:public StringBuffer delete(int start,int end)
package day2;
public class TestDemo {
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer("Hello");
System.out.println(buffer.delete(0,3));
}
}
lo
注:以上的三个操作方法是掌握StringBuffer类的主要操作。
StringBuffer类是在JDK1.0的时候提供的,而JDK1.5之后又提供有一个StringBuilder类,这两个类单看文档都是一个德行。StringBuffer属于线程安全的操作,但是性能不高,而StringBuilder属于非线程安全的操作,性能高。
面试题:请解释String、Stringbuffer、StringBuilder类的区别
(1)String、Stringbuffer、StringBuilder类都是CharSequence接口的子类;
(2)String类的内容一旦声明则不可改变,而StringBuilder、StringBuilder的内容可以改变;
(3)StringBuffer类是在JDK1.0的时候提供的,属于线程安全的操作,但是性能不高,而StringBuilder是JDK1.5之后提供的,属于非线程安全的操作,性能高。
总结:在开发之中多数情况下都应该是String类,可以改变的时候在选择StringBuilder、StringBuffer,多个线程访问同一资源时,使用StringBuffer。



