1 字符串

java.lang.String类代表字符串,Java程序中的每个用双引号括起来的字符串都被看做是这个类的实例,即便没有new这个关键字,也一样是String类的对象。需要注意的是,在字符串类型中必须注意转义字符,比如:字符串”Java\u2122“,是由5个Unicode字符组成的。

Java字符串中的代码单元和代码点从0开始计数。

1.1 子串

String类的substring方法可以从一个较大的字符串中提取出来一个子串。

public String substring(int beginIndex,int endIndex)

参数:beginIndex:复制开始的索引;endIndex:不想复制的第一个位置的索引。

结果:返回一个字符串,该字符串是此字符串的子字符串。 子串开始于指定beginIndex并延伸到字符索引endIndex - 1 。 因此,子串的长度为endIndex-beginIndex

关于参数和结果等知识,详情可以看Java方法有关的章节

String str = "Hello,World";
String s = str.substring(1,4);

/*	创建一个由字符"ell"组成的字符串,第一个参数是复制开始的位置,第二个参数是不想复制的第一个位置。
	因此这里要复制的是位于1,2,3这三个位置上的字符。

1.2 拼接

Java语言允许使用+号对两个字符串进行拼接。

String str1 = "Hello";
String str2 = "World";
String str3 = str1 + str2;			//str3="HelloWorld"

可以看出+号完全按照给定的次序将两个字符串拼接起来。


当将一个字符串与一个非字符串的值进行拼接,后者会转化成字符串,这个特性经常会用在输出语句中。

int x = 2 ;
 String y = "AD";
System.out.println(x+y);		//打印结果是2AD

如果想把多个字符串放在一起,并用一个符号分割,可以使用join方法:

public static String join(CharSequence delimiter,CharSequence... elements)

参数:delimiter:分割每个元素的分隔符;elements:要加入的元素。

结果:返回一个字符串,这个字符串由delimiter分割elements。

String date = String.join("-","2020","1","31");
System.out.println(date);			//打印输出的结果是2020-1-31

1.3 不可变字符串

String类中没有提供修改某个字符的方法,如果想要修改字符串中的内容,不能直接修改字符串,但是可以提取想要保留的字符串,然后与希望替换的字串拼接。

//把"HelloWorld"替换为”Helwer“

String greeting = "HelloWorld";
System.out.println(greeting.substring(0,3)+"we"+greeting.substring(7,8));

从上述代码中我们可以看出通过获取子串和拼接我们能够获得哟个我们想要的字符串。因为Java不能修改单个字符,所以String类的对象是不可变的。但是,我们可以修改字符串变量,让它指向另一个字符串。这样做有一个好处,编译器可以让字符串共享。

所以不可变字符串有以下特点:

  1. 字符串的内容永不可变;

java字符串第i个字符 java字符串第几个字符_子串

  1. 因为字符串是不可变的,所以可以被共享;

java字符串第i个字符 java字符串第几个字符_字符串_02

  1. 用substring和+拼接得到的字符串不会被共享。

字符串常量池:字符串常量池在堆中,存放的是程序中直接写上双引号的字符串,new出来的字符串不在常量池中。

注意:对于引用数据类型,不能直接比较大小,"=="进行的是地址值的比较。

java字符串第i个字符 java字符串第几个字符_Java_03

此处打印结果为true是因为创建了一个字符串同时共享给两个变量,这两个变量存放的地址值相同。

1.4 检测字符串是否相等

可以使用equals方法检测字符串是否相等:

public boolean equals(Object anObject)

参数:需要对比的对象,可以是字符串变量,也可以是字符串常量。

结果:如果返回true,说明两个字符串对应字符包括大小写严格相等,否则返回值位false。

String greeting = "HelloWorld";
String greeting1 = "helloworld";
boolean b1 = greeting.equals("HelloWorld");		//b1 = true
boolean b2 = "HelloWorld".equals(greeting1);	//b2 = false

如果想检查两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法:

public boolean equalsIgnoreCase(String anotherString)

将此String与其他String比较,如果两个字符串的长度相同,并且两个字符串中的相应字忽略大小写依然相等,则两个字符串被认为是相等的。

参数:需要与给定字符串比较的字符串;

结果:如果返回true,说明两个字符串对应字符忽略大小写相等,否则返回false。


一定不能用==判断两个字符串是否相等,实际上,这个运算符只能判断两个字符串是否放在同一位置,即检测的是两个字符串的地址值。

1.5 空串与Null串

空串""是指长度为0的字符串,可以使用以下代码检测一个字符串是否为空:

if(str.length()==0)或者str.equals("")

空串是一个Java对象,有自己的长度(0),和内容(空)。


String变量还可以存放一个特殊的值:null,表示目前没有任何对象与该变量关联,可以用以下代码检测一个字符串是否为null:

if(str==null)


如果想要检查一个字符串既不是null,也不是空串,可以用以下条件:

if(str != null && str.lrngth() != 0)

1.6 构建字符串

有时候需要用较短的字符串构建字符串,例如按键或者文件中的单词。采用字符串拼接的方式达到这个目的,效率会比较低。这时可以用StringBuilder类就可以避免这个问题:

//首先生成一个空的字符串构建器

StringBuilder builder = new StringBuilder();

//每次需要添加新内容,调用它的append方法

builder.append("Hello");
builder.append("World");

//构建完成调用toString方法就可以得到包含了所有输入字符串的字符串序列

String str = builder.toString();		//str = "HelloWorld"

1.7 API文档

String类库中包含了50多个方法,这里只是列举出一些常用方法,作为介绍,具体其他的方法请参阅API文档。