3.String, StringBuffer
3.1 基本用法
String可以说是我们最常用的一个类, 熟练掌握它的一些基本用法是很有用的。
String是由一组字符组成的字符串, 下标由0开始。 一旦有必要改变原来的内容, 每个String方法都有返回了一个新的String对象。
Ø char charAt(int index) 返回指定位置的字符。
Ø int compareTo(Object o)
int compareTo(String anotherString)
与另外一个对象进行比较。
Ø int compareToIgnoreCase(String str) 与另一个String进行比较, 不区分大小写
Ø String concat(String str) 连接两字符串, 可以直接用+, 因为Java给String覆盖了+
Ø static String copyValueOf(char[] data)
static String copyValueOf(char[] data, int offset, int count)
将data数组转换至String
Ø boolean endsWith(String suffix) 测试此String是否以suffix结尾。
boolean startsWith(String prefix) 测试此String是否以prefix开头。
Ø boolean equals(Object anObject)
boolean equalsIgnoreCase(String anotherString)
比较两字符串的值。 不相等则返回false
Ø byte[] getBytes() 根据缺省的字符编码将String转换成字节数组。
byte[] getBytes(String enc) 根据指定的编码将String转换为字节数组。
Ø void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 拷贝字符至一数组中
Ø int indexOf(int ch) 从字串的起始位置查找字符ch第一次出现的位置
int indexOf(int ch, int fromIndex) 从指定的fromIndex位置向后查找第一次出现ch的位置,
int indexOf(String str)
int indexOf(String str, int fromIndex)
如果不存在ch或str都返回-1
Ø int lastIndexOf(int ch) 从字串的最终位置往前查找第一次出现ch的位置
int lastIndexOf(int ch, int fromIndex) 从指定的位置往前查找第一次出现ch的位置,
int lastIndexOf(String str)
int lastIndexOf(String str, int fromIndex)
如果不存在则返回-1
Ø int length() 该字符串的字符长度(一个全角的汉字长度为1)
Ø String replace(char oldChar, char newChar) 将字符oldChar全部替换为newChar, 返回一个新的字符串。
Ø String substring(int beginIndex) 返回从beginIndex开始的字符串子集
String substring(int beginIndex, int endIndex) 返回从beginIndex至endIndex结束的字符串的子集。 其中endIndex – beginIndex等于子集的字符串长度
Ø char[] toCharArray() 返回该字符串的内部字符数组
Ø String toLowerCase() 转换至小写字母的字符串
String toLowerCase(Locale locale)
String toUpperCase() 转换至大写字母的字符串
String toUpperCase(Locale locale)
Ø String toString() 覆盖了Object的toString方法, 返回本身。
Ø String trim() 将字符串两边的半角空白字符去掉, 如果需要去掉全角的空白字符得要自己写。
Ø static String valueOf(primitive p) 将其它的简单类型的值转换为一个String
StingBuffer是一个可变的字符串,它可以被更改。同时StringBuffer是Thread safe的, 你可以放心的使用, 常用的方法如下:
Ø StringBuffer append(param) 在StringBuffer对象之后追加param(可以为所有的简单类型和Object) 返回追加后的StringBuffer, 与原来的对象是同一份。
Ø char charAt(int index) 返回指定位置index的字符。
Ø StringBuffer delete(int start, int end) 删除指定区域start~end的字符。
Ø StringBuffer deleteCharAt(int index) 删除指定位置index的字符。
Ø void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 同String的getChars方法
Ø StringBuffer insert(int offset, boolean b) 在指定位置offset插入param(为所有的简单类型与Object)
Ø int length() 同String的length()
Ø StringBuffer replace(int start, int end, String str) 将指定区域start~end的字符串替换为str
Ø StringBuffer reverse() 反转字符的顺序
Ø void setCharAt(int index, char ch) 设置字符ch至index位置。
Ø String substring(int start)
Ø String substring(int start, int end) 同String的subString
Ø String toString() 返回一个String
大家可能已经注意到很多方法都返回了一个StringBuffer对象, 但返回的这个对象与String的方法返回的String不一样, 返回的StringBuffer对象与被操作的StringBuffer对象是同一份, 而String的方法返回的String则肯定是重新生成的一个String。
3.2性能对比
因为String被设计成一种安全的字符串, 避免了C/C++中的尴尬。因此在内部操作的时候会频繁的进行对象的交换, 因此它的效率不如StringBuffer。 如果需要频繁的进行字符串的增删操作的话最好用StringBuffer。 比如拼SQL文, 写共函。 另: 编绎器对String的+操作进行了一定的优化。
x = "a" + 4 + "c"
会被编绎成
x = new StringBuffer().append("a").append(4).append("c").toString()
但:
x = “a”;
x = x + 4;
x = x + “c”;
则不会被优化。 可以看出如果在一个表达式里面进行String的多次+操作会被优化, 而多个表达式的+操作不会被优化。
3.3技巧
1. 在Servlet2.3与JSP1.1以前画面post到后台的数据是通过ISO88591格式进行编码的, 则当遇到全角日文字的时候, 在后台request得到的数据可能就是乱码, 这个时候就得自己进行编码转换, 通过String.getBytes(String enc)方法得到一个字节流, 然后通过String(byte[] bytes, String enc)这个构造函数得到一个用新的编码生成的字符串. 例如将ISO88591的字符串转换成Shift_JIS的字符串, 方法如下:
public static String convertString(String str) {
if (str == null) {
return null;
}
try {
byte[] buf = str.getBytes("ISO8859_1");
return new String(buf, "Shift_JIS");
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
不过在最新的Servlet2.3与Jsp1.2中可以通过request.setCharacterEncoding来进行设置取值的码制, 不需要自己再做转换。
2.因为Java在计算String的长度是以字符为单位的, 因此一个全角与半角的字符长度是一样的, 但是DB中往往是根据字节来计算长度的, 因此我们在做Check的时候得要判断String的字节长, 可以用以下的方法:
public static String length(String str) {
if (str == null) {
return 0;
}
return str.getBytes().length;
}