字符串
字符串可以分为两大类
• String类
创建之后不会再做修改和变动,即 immutable
• StringBuffer、StringBuilder类
创建之后允许再做更改和变化
其中 StringBuilder是JDK1.5增加的,它是非线程安全的
特别注意
在循环中使用String的+=可能会带来效率问题
示例:StringAndStringBuffer.java
import java.util.*;
class StringAndStringBuffer
{
public static void main(String[] args)
{
String a = "a";
String s = "";
StringBuffer sb = new StringBuffer();
final int N = 10000;
long t0 = System.currentTimeMillis();//记录时间
for( int i=0; i<N; i++) s+=a; //每一步都要生成String对象和StringBuilder对象。效率比较低。
long t1 = System.currentTimeMillis();
for( int i=0; i<N; i++) sb.append(a);
long t2 = System.currentTimeMillis();
System.out.println(t1-t0);
System.out.println(t2-t1);
}
}
运行结果(可能不同):
73
0
String类
String类对象保存不可修改的Unicode字符序列
String类的下述方法能创建并返回一个新的String对象实例:
concat(连接), replace(替换),replaceAll(替换全部), substring, toLowerCase(变小写), toUpperCase(变大写), trim(去前后空格),toString.
查找: endsWith(是否以...结尾), startsWith(是否以...开头), indexOf(查找字符串位置),lastIndexOf(查找最后一次出现的位置).
比较: equals, equalsIgnoreCase(忽略大小写比较)
字符及长度: charAt(第几个位置的字符),length.
Jdk1.5 增加了format函数
%1$,8.5f %序号$ 标识 宽度及精度 转换方式。%后面数表示第几个参数,逗号表示显示千分位,8.5表示宽度8,小数位数后面占5位小数,f表示实数。
例:TestStringMethod.java
class TestStringMethod
{
public static void main(String[] args)
{
String s = new String( "Hello World" );
System.out.println( s.length() );
System.out.println( s.indexOf('o') );
System.out.println( s.indexOf("He") );
System.out.println( s.startsWith("He") );
System.out.println( s.equals("Hello world") );
System.out.println( s.equalsIgnoreCase("Hello world") );
System.out.println( s.compareTo("Hello Java") );
System.out.println( s.charAt(1) );
System.out.println( s.substring(0,2) );
System.out.println( s.substring(2) );
System.out.println( s.concat("!!!") );
System.out.println( s.trim() );
System.out.println( s.toUpperCase() );
System.out.println( s.toLowerCase() );
System.out.println( s.replace('o', 'x' ) );
System.out.println( s ); //注意,s本身没有改变
}
}
运行结果:
11
4
0
true
false
true
13
e
He
llo World
Hello World!!!
Hello World
HELLO WORLD
hello world
Hellx Wxrld
Hello World
字符串常量
除了immutable特点外,还要注意String常量的内部化(interned)问题,即同样的字符串常量是合并的(是指向同一个引用的),以保证 “abc”==“abc”。
但是 “abc” != new String(“abc”)
StringBuffer类
• StringBuffer类对象保存可修改的Unicode字符序列:
• StringBuilder类似,它效率更高,不考虑线程安全性
• 构造方法
StringBuffer()
StringBuffer(int capacity)
StringBuffer(String initialString)
• 实现修改操作的方法:
append追加,insert插入, reverse反转, setCharAt修改其中一个字符, setLength设定字符串的长度。
和String不同的是它返回的是本身,String是产生一个新的。
字符串的分割
• java.util.StringTokenizer类提供了对字符串进行分割的功能。
• 构造
StringTokenizer(String str, String delim);
• 该类的重要方法有:
public int countTokens();// 分割串的个数
public boolean hasMoreTokens();// 是否还有分割串
public String nextToken();// 得到下一分割串
例:TestStringTokenizer.java
import java.util.*;
class TestStringTokenizer
{
public static void main(String[] args)
{
StringTokenizer st = new StringTokenizer("this is a test", " ");//按空格分割
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());//显示每个分割
}
st = new StringTokenizer("253,197,546", ",");//按逗号分割
double sum = 0;
while (st.hasMoreTokens()) {
sum += Double.parseDouble(st.nextToken());//每部分解析成double求和
}
System.out.println( sum );
}
}
运行结果:
this
is
a
test
996.0