这是个被说烂了的话题,我在这里走个流水账,仍然希望能对大家有所帮助。

String:

1. 字符串是常量;
2. 它们的值在创建之后不能更改;
3. 因为 String 对象是不可变的,所以可以共享;
4. Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持(String的”+”与“+=”是java中仅有的两个重载过的操作符,java程序员不允许重载任何操作符);

5. String 表示一个 UTF-16 格式的字符串,其中的增补字符代理项对 表示;
6. String解析成StringBuilder(编译器自作主张,源代码看不到)。

 

方法:

用到了正则表达式:

matches(String regex) 告知此字符串是否匹配给定的正则表达式
replaceFirst(String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串
replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
replace(CharSequence target, CharSequence replacement) 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串。
split(String regex) 根据给定正则表达式的匹配拆分此字符串。

注意这个方法没有用正则表达式:

replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 采用了
new String(…)

 

1.6增加了几个方法 

String(byte[] bytes, int offset, int length,Charset charset) 通过使用指定的 charset 解码指定的 byte 子数组,构造一个新的 String。
String(byte[] bytes, Charset charset) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
isEmpty() 当且仅当 length() 为 0 时返回 true。
getBytes(Charset charset) 使用给定的charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。

 关于字符编码问题,小提一下:

String[] encodes = {"ISO-8859-1","utf-8","gbk","utf-16"}; String[] decodes= encodes;

public void testGetBytes(){         String s = "你好51CTO";         testByteString(s);         printlns("@分割------");         println(Charset.defaultCharset());     }

public void testByteString(String s) {         try {             for(int i=0;i<encodes.length;i++) {                 for(int j=0;j<decodes.length;j++) {                     print("@encode:"+encodes[i]+"----@decode:"+decodes[j]+":");                     println(new String(s.getBytes(encodes[i]),decodes[j]));
                }             }
        } catch (UnsupportedEncodingException e) {             e.printStackTrace();         }
   }

中文编码问题一直会伴随大家,在String这里粗略提一下,希望在以后有时间专门对字符讲解

StringBuffer/StringBuilder

简而言之:都继承了AbstractStringBuilder,但是StringBuffer在方法都做了线程安全(synchronized)。

以实例名StringBuilder su = new StringBuilder();为例:

1. 初始分配空间是16,此后到达16后增加空间为:(su.length()+1)*2;

2. su.append(x) 和 su.insert(su.length(), x) 具有相同的效果,但insert可在su中插入字符,而且更改字符串生成器(借用jdk翻译)

3 trimToSize()  尝试减少用于字符序列的存储空间。

举例:

StringBuilder sb = new StringBuilder();

 

int size = 16*3;         int i = sb.capacity();         while(sb.length()<size) {             sb.append("acbdfeihkjmlpnqo");             if(i!=sb.capacity()) {
println(i);                 i = sb.capacity();             }         }         println(sb.length());         println(sb);         println(sb.capacity());         sb.trimToSize();
        println(sb.capacity());

我们曾经用StringBuilder做了日志记录行为,用枚举做级别配置,不妨试试自己写个 高效的log4j.

就写这些东西,小结:

1. 单线程之下,就用StringBuilder,考虑线程安全,再用StringBuffer

2. String的“+”号会把字符串变成常量,反复执行已经被优化,比StringBuilder快

3. 正则表达式会慢,但是如果不是高性能要求,用起来也很方便。

4. 考虑接触一下CharSet和Format,Pattern这些类,灵活玩转String.