Java 常用API的运用,效率及技巧三

本文详细介绍了Java中String和StringBuffer类的基本用法及性能对比,并提供了编码转换和字节长度检查等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3String, 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) 连接两字符串, 可以直接用+ 因为JavaString覆盖了+

Ø  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)
如果不存在chstr都返回-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)
返回从beginIndexendIndex结束的字符串的子集。 其中endIndex – beginIndex等于子集的字符串长度

Ø  char[] toCharArray() 返回该字符串的内部字符数组

Ø  String toLowerCase() 转换至小写字母的字符串
String toLowerCase(Locale locale)
String toUpperCase()
转换至大写字母的字符串
String toUpperCase(Locale locale)

Ø  String toString() 覆盖了ObjecttoString方法, 返回本身。

Ø  String trim() 将字符串两边的半角空白字符去掉, 如果需要去掉全角的空白字符得要自己写。

Ø  static String valueOf(primitive p) 将其它的简单类型的值转换为一个String

 

StingBuffer是一个可变的字符串,它可以被更改。同时StringBufferThread 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) StringgetChars方法

Ø  StringBuffer insert(int offset, boolean b) 在指定位置offset插入param(为所有的简单类型与Object)

Ø  int length() Stringlength()

Ø  StringBuffer replace(int start, int end, String str) 将指定区域start~end的字符串替换为str

Ø  StringBuffer reverse() 反转字符的顺序

Ø  void setCharAt(int index, char ch) 设置字符chindex位置。

Ø  String substring(int start)

Ø  String substring(int start, int end) StringsubString

Ø  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.3JSP1.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.3Jsp1.2中可以通过request.setCharacterEncoding来进行设置取值的码制, 不需要自己再做转换。

 

2.因为Java在计算String的长度是以字符为单位的, 因此一个全角与半角的字符长度是一样的, 但是DB中往往是根据字节来计算长度的, 因此我们在做Check的时候得要判断String的字节长, 可以用以下的方法:

 

 

 

public static String length(String str) {
	
	if (str == null) {
		return 0;
	}
	
	return str.getBytes().length;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值