java 中操作String、StringBuffer、StringBuilder字符串类都有哪些类?它们之间有什么区别?

操作字符串的类有:String、StringBuffer、StringBuilder都是final修饰的

 String 类是不可变的类,就是说String对象声明后不能修改,,如对字符串修改都会创建新的对象

 ==:在基本数据类型比较的是值,在引用类型比较的是内存地址

String s1 = "abc";
s1 = "def";
s1 = "123";
s1 = "456";
System.out.println(s1);
//s1无论赋值多少次,就取最后的那个值为最终结果
System.out.println(s1==s1);
//无论是==还是equals都是s1本事所以都是true
//equals:比较的是里面的内容
System.out.println(s1.equals(s1));
String s2 = "hi";
String s3 = "hi";
//值是一样的,字符串是一样,
// hashcode是根据字符串的内容去计算的,字符串是一样,计算出来也是一样的,
// equals也是字符串里面的内容,也是一样
System.out.println(("s2==s3 :")+(s2==s3));// true
System.out.println(("s2= ")+(s2.hashCode()));//s2= 3329
System.out.println(("s3= ")+(s3.hashCode()));//s3= 3329
System.out.println(("s2:s3 ")+(s2.equals(s3)));// true

String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象

StringBuffer、StringBuilder 可以在原有对象的基础上进行操作

经常改变字符串内容的情况下最好不要使用 String。 

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的

StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer

在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer

---------------------------------------------------------String举例------------------------------------------------------------------------------------

String s6 = "aaa";
String s7 = "bbb";
String s8 = s6 + s7;
System.out.println(("s6+s7: ")+(s6.equals(s7)));//false
System.out.println(s6==s7);//fa;se
System.out.println(s6.hashCode());//96321
System.out.println(s7.hashCode());//97314
//以下程序在执行的时候在字符串常量池中会创建一个字符串对象
System.out.println(("s8: ")+(s8));//s8: aaabbb

String s9 = "abc";
String s10 = "a";
String s11 = "bc";
String s12 = s10 + s11;
System.out.println(s12);//abc
System.out.println(s9.equals(s12));//true
//只要采用双引号复制字符串,在编译器确定将会放在方法区,若运行时对字符串变量相加会放在堆区
System.out.println(s9 == s12);//false--->>>>若运行时对字符串变量相加会放在堆区
System.out.println(s9 == ("a" + "bc"));//true

----------------------StringBuffer-----------------------------
/*
字符串缓冲区:工作原理,先申请一块内存,存放字符串序列如满,
就会重新改变缓存区的大小,容纳更多字符序列
是可变对象,这个是与String最大的不同
*/
public class StringBufferD {
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer();
for (int i=0;i<100;i++) {
buffer.append(i);
//System.out.println( buffer.append(i));
buffer.append(",");
//System.out.println( buffer.append(","));
//buffer.append(i).append(",");
//System.out.println( buffer.append(i).append(","));
//拼串去掉逗号
buffer.append(i);
if (i != 99) {
// buffer.append(",");
//System.out.println(buffer.append(i));
}
//System.out.println(buffer);
//System.out.println("");
//System.out.println(buffer.toString());
System.out.println(buffer.toString().substring(0, buffer.toString().length() - 1));

}


}
}----------------------运行结果-------------------

0,
0,01,
0,01,12,
0,01,12,23,
0,01,12,23,34,
0,01,12,23,34,45,
0,01,12,23,34,45,56,
0,01,12,23,34,45,56,67,
0,01,12,23,34,45,56,67,78,
........运行完为止:工作原理,先申请一块内存,存放字符串序列如满,就会重新改变缓存区的大小,容纳更多字符序列是可变对象

 

-----------------StringBuilder---------------------------

/*StringBuilder与StringBuffer用法相同
区别:StringBuffer中所有方法都是同步,是线程安全的
底层代码方法是synchronized修饰

列子:
@Override
public synchronized int length() {
return count;
}

StringBuilder速度快,不是线程安全的
两个类都有相同的方法集:append:添加在尾部 insert:插入 replace:替换字符串
indexOf/lastIndexOf:返回子串的位置索引
substring:取子字符串序列
toString:转换为String对象
*/
-----------------StringBuffer字符串翻转reverse()方法--------------------------------------------
public class StringBufferD {
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer();

//字符串翻转reverse()方法
buffer.append("abcdefg");
System.out.println(buffer.reverse());//gfedcba

}
}
-----------------StringBuilder字符串翻转reverse()方法--------------------------------------------
public class StringBuilderD {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("123");
builder.append("123456789");//987654321321
System.out.println(builder.reverse());

}
}

10. String 类的常用方法都有那些?

 

  • indexOf():返回指定字符的索引。

  • charAt():返回指定索引处的字符。

  • replace():字符串替换。

  • trim():去除字符串两端空白。

  • split():分割字符串,返回一个分割后的字符串数组。

  • getBytes():返回字符串的 byte 类型数组。

  • length():返回字符串长度。

  • toLowerCase():将字符串转成小写字母。

  • toUpperCase():将字符串转成大写字符。

  • substring():截取字符串。

  • equals():字符串比较。





posted @ 2020-08-07 23:53  Monica_维维  阅读(347)  评论(0编辑  收藏  举报