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要快。