Java没有内置字符串类型,而是在标准Java类库中,提供了一个预定义类,很自然的叫做String。每个用双引号括起来的字符串都是String类的一个实例
字串
String类的substring
方法可以从一个较大的字符串提取出一个字串。
注释:类似于C/C++,Java字符串中的代码单元和代码点从0开始计数
示例:
String.substring(0,3);//返回一个字符串,为原字符串从0到3,但不包括3的子串
该方法可以较为容易的计算字串长度:例如:3-1=2
程序示例
public class FirstCode1 {
public static void main(String[] args) {
String greeting = "HelloWorld";
String greeter = greeting.substring(3,5);
System.out.println("greeter = "+greeter);
}
}
运行结果
greeter = lo
字符串拼接
Java语言允许使用+号连接(拼接)两个字符串。
当将一个字符串与一个非字符串进行拼接时,后者会转换成字符串(任何一个Java对象都可以转换成字符串)
这种特性通常运用在输出语句中
示例:
System.out.println("Hello"+3+"World");
如果需要把多个字符串放在一起,用一个界定符分隔,可以使用静态join方法:
示例:
String all = String.join("\\","S","Hello","World");
在Java11中还有一个repeat方法
示例:
String repeater = "java".repeat(2);//javajava
程序实例
public class FirstCode1 {
public static void main(String[] args) {
//+号字符串连接
String greeting1 = "Hello";
String greeting2 = "World";
System.out.println("greeting3+greeting2 = "+ (greeting1+greeting2));
//join方法
String all = String.join("!","Hello","World","The","China","xiao");
System.out.println("all = "+all);
}
}
运行结果
greeting3+greeting2 = HelloWorld
all = Hello!World!The!China!xiao
不可变字符串
Java中字符串是不可变的
Java的设计者任务共享带来的高效率远远胜过于提取字串,拼接字符串所带来的低效率。
大多数情况下都不会修改字符串,而只是需要对字符串进行比较(有一种例外情况,将来自于文件或键盘的单个字符或较短的字符串组装成字符串)
Java中的字符串,类似于C/C++中的char指针。
检测字符串是否相等
equal方法
可以使用equals方法检测两个字符串是否相等
示例:
s.equals(t);
如果两字符串相等,返回true,如果两字符串不相等,返回false。
equalsIgnoreCase
方法
该方法检测两个字符串是否相等(不区分大小写的情况下)
示例:
s.equalsIgnoreCase(t);
如果两字符串相等,返回true,如果两字符串不相等,返回false。
利用==
检验字符串相等性的缺点
使用==
只能检验出,存储在同一位置的字符串。如果两个字符串相同,但是没有存储在同一为止,那么使用==
检测,他就是错误的。
千万不要使用==运算符测试字符串的相等性,以免在程序中出现最糟糕的bug,看起来这种bug就像是随机产生的间歇性错误。
程序实例
public class FirstCode1 {
public static void main(String[] args) {
//equals方法使用
String greet1 = "Hello";
String greet2 = "World";
String greet3 = "Wor"+"ld";
if (greet3.equals(greet2)){
System.out.println("greet2 等于 greet3");
}else {
System.out.println("greet2 不等于 greet3");
}
//equalsIgnoreCase方法使用
String greet4 = "HelloWorld";
String greet5 = "helloworld";
String greet6 = "helloWorld";
if (greet4.equalsIgnoreCase(greet5)){
System.out.println("greet4 等于 greet5");
}else {
System.out.println("greet4 不等于 greet5");
}
if (greet4.equalsIgnoreCase(greet6)){
System.out.println("greet4 等于 greet6");
}else {
System.out.println("greet4 不等于 greet6");
}
if (greet5.equalsIgnoreCase(greet6)){
System.out.println("greet5 等于 greet6");
}else {
System.out.println("greet5 不等于 greet6");
}
//使用“==”检测字符串是否相等
String greeting1 = "helloworld";
String greeting2 = "hello"+"wor"+"ld";
if (greeting1 == greeting2){
System.out.println("greeting1 等于 greeting2");
}else {
System.out.println("greeting1 不等于 greeting2");
}
}
}
运行结果
greet2 等于 greet3
greet4 等于 greet5
greet4 等于 greet6
greet5 等于 greet6
greeting1 等于 greeting2
空串与Null串
空串
空串“”是长度为0的字符串。可以调用以下代码检查一个字符串是否为空:
if(str.length() == 0)
//或者
if(str.equals(""))
空串是一个Java对象,有自己的长度和内容。
null
String变量还可以放一个特殊的值,null,表示目前该变量没有与任何对象关联。
判断一个字符串是否为null
if(str == null)
判断一个字符串既不是空串也不是null
if(str != null && str.length() != 0)
注意:在null上调用方法会出现错误
程序示例
public class FirstCode1 {
public static void main(String[] args) {
//检验字符串是否为空
String a1 = "";
if(a1.length() == 0){
System.out.println("a1是空串");
}else {
System.out.println("a1不是空串");
}
if(a1.equals("")){
System.out.println("a1是空串");
}else {
System.out.println("a1不是空串");
}
//检验字符串是否为null
String b1 = null;
if (b1 == null){
System.out.println("b1 = null");
}else {
System.out.println("b1 != null");
}
//检验字符串不为空且不为null
String c1 = "Hello";
if (c1 != null && c1.length() != 0){
System.out.println("字符串c1既不是空串,也不是null");
}else {
System.out.println("字符串c1可能是空串,也可能是null");
}
}
}
运行结果
a1是空串
a1是空串
b1 = null
字符串c1既不是空串,也不是null
阅读联机API文档
可以从Oracle上下载API文档,并保存在本地。
也可以在浏览器上访问:http://docs.oracle.com/javase/9/docs/api
构建字符串
有时候需要有较短的字符串拼接成较长的字符串,当数据较多的时候,使用+的效率就有点低了,每次拼接字符串都既浪费空间,又浪费时间。
如果需要用许多小段字符串来构建一个字符串,那么应该按照下列步骤进行
-
构建一个空的字符串构建器:
StringBuilder builder = new StringBuilder();
-
每次需要添加一部分内容时,就调用append方法
builder.append(ch);
-
在字符串构建完成时,调用toString方法,接可以得到一个String字符串,其中包含了构建其中的
String buder = builder.toString();
注释
StringBuilder类在Java5中引入,这个类的前身是StringBuffer,它的效率稍微有些低,但是允许采用多线程的方式添加或删除字符串。如果所有字符串编辑操作都在单个线程中执行(通常是这样),则应该使用StringBuilder
程序示例
public class FirstCode1 {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder();
builder.append("He");
builder.append("llo");
builder.append(",Wor");
builder.append("ld!");
String b1 = builder.toString();
System.out.println(b1);
}
}
运行结果
Hello,World!