Java中的String、StringBuffer以及StringBuilder的用法和区别

时间:2024-07-18 23:33:38

String

  String的构造方式有n种(据说n==11),常见的例举一二:

String s1 = "hello world";

String s2 = new String("hello world");

char[] a = {'h', 'e', 'l', 'l', 'o'};
String s3 = new String(a, 1, 3);  // start length 

String s4 = "hello world";
String s5 = new String(s4);  // clone
String s6 = s4; // reference

  String类常用方法:

String s = "hello world";

// toArray
char[] a = s.toCharArray();

// charAt
char b = s.charAt(0);

// get length
int len = s.length();

// compare
int c = s.compareTo("hello");  // 返回字符差
boolean f = s.equals("hello");
boolean g = s == "hello"; // 地址层面的比较

// move blank
String h = s.trim();

// cut and add
String d = s.concat(" i love you"); // hello world i love you
String j = s + " i love you";
String e = s.substring(1, 3); //out el startIndex endIndex
// int(or other types) -> String
int a = 100;
String s = String.valueOf(a);

StringBuffer & StringBuilder

  因为String对象是不可变的,每次操作都会生成一个新的String对象,所以如果要修改字符串,就要用StringBuffer和StringBuilder。

StringBuffer s = new StringBuffer("hello world");

// delete
s.delete(0, 6); // world start end

// reverse
s.reverse();  // dlrow

// append
s.append(" world"); // dlrow world

// insert
s.insert(0, 100); // 100dlrow world

// replace
s.replace(0, 3, "hello"); // hellodlrow world

// setCharAt
s.setCharAt(0, 'd');  // dellodlrow world

// String <-> StringBuffer
String a = s.toString();
StringBuffer b = new StringBuffer(a);

高级比较

  String和StringBuffer以及StringBuilder最主要的区别当然不是能不能修改那么简单。

  既然已经有了String类,为什么还要StringBuffer和StringBuilder?

  String是字符串常量,但是它具有不可变性,就是一旦创建,对它进行的任何修改操作都会创建一个新的字符串对象。StringBuffer 字符串可变量,是线程安全的,和StringBuilder类提供的方法完全相同。如果查看java的源代码(即java安装目录的src.zip文件),就会发现它和StringBuilder类的方法的区别就是,在每个方法前面添加了"synchronized",保证其是线程安全的。StringBuilder 字符串可变量,是线程不安全的。在java API中指明:这个类是在JDK 5才开始加入的,是StringBuffer的单线程等价类。(其他两个String和StringBuffer类,都是JDK 1.0开始)

  多线程的情况下才需要考虑线程安全问题。比如一个 StringBuilder ,可能被多个线程访问,那么如果没有 synchronized 的话,第一个线程改变了其值,之后又有第二个线程改变了它的值。当切换回第一个线程时,读到的就是第二个线程修改后的值了。 如果不考虑多线程,StringBuilder 比StringBuffer要快。