字符串相关类
#String
在Java中,我们经常使用字符串,所有的字符串值的类型均为String
,它不属于基本类型,它的全名为java.lang.String
,我们有必要在这里学习掌握一些它的基本使用方法。
-
字符串常量:在Java中所有的字符串常量均是以双引号括起来的,比如:
"abc"
等。因为它的类型是String
类型,自然,每个字符串常量均为String
的对象,也自然可以调用String
中的public
(所谓public就是全部开放给程序员使用的方法、属性或者类)方法。比如:"abc".indexof('b')
,它的意义就是在"abc"
中,'a'
第一次出现的位置(从0开始),它的结果就是1。 -
字符串比较:
-
==
和!=
在比较引用类型的数据时是比较引用是不是相同,而不是比较对象中的内容。比如:"abc" == "abc"
结果是什么?答案是true
,这意味着什么?意味着==
左右的这两个常量其实是同一个对象,并不是两个不同的具有相同字符组合的对象。所以,在你的程序中,不管你写多少个"abc"
,这些"abc"
都是同一个字符串。 -
那么如何比较两个字符串的内容是否一样呢?我们使用
String中equals()
方法,比如:比较"abc"
和"abd"
的内容,我们可以这么写:"abc".equals("abd") 或者 "abd".equals("abc")
-
-
字符串变量的初始化:所谓初始化就是获得第一个值。因为
String
类的构造方法有好几个,所以字符串变量的初始化也会有相应的几个形式,我们这里只了解常用的方式,其他方式,大家自己查看JDK说明书进行了解。-
第一种形式:
String s = "asdf";
我们在学习Java的时候,一定要知道原理,不要只知其一不知其二。这条语句的含义是什么呢?我们知道字符串常量也是对象,所以它的意义就是把
"asdf"
的引用放入s这个变量中,那么s == "asdf"
的结果呢?自然也是true
。 -
第二种形式:
String s = new String("asdf");
大家可以看到这种形式是标准的生成类对象的形式,那么这条语句执行以后,
s == "asdf"
的结果呢?此时,就不再是true
,而是false
,它说明s引用的"asdf"
和作为参数传递给String构造方法的"asdf"
是两个不同的字符串了。这条语句的含义就是以"asdf"
为模板,再创建一个内容为asdf
的字符串对象。但是,s.equals("asdf")
的值呢?因为这两个字符串的字符序列是一致的,所以,结果为true
。
-
-
常用方法表
方法首部 | 方法功能 | 可能抛出的异常 |
---|---|---|
public char charAt(int index) | 返回指定索引处的 char 值。索引范围为从 0 到 length() - 1。序列的第一个 char 值位于索引 0 处,第二个位于索引 1 处,依此类推,这类似于数组索引。 | index的值如果不在字符串长度范围内,会产生IndexOutOfBoundsException ,该异常可以不进行捕获。 |
public boolean contains(CharSequence s) | 当且仅当此字符串包含指定的s字符序列时,返回 true。 | NullPointerException - 如果 s 为 null,该异常可以不进行捕获 |
public boolean equals(Object anObject) | 将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。 | 无 |
public boolean equalsIgnoreCase(String anotherString) | 将此 String 与另一个 String 比较,不考虑大小写。如果两个字符串的长度相同,并且其中的相应字符都相等(忽略大小写),则认为这两个字符串是相等的。 | 无 |
public int compareTo(String anotherString) | 如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。 | 无 |
public int compareToIgnoreCase(String str) | 按字典顺序比较两个字符串,不考虑大小写。根据指定 String 大于、等于还是小于此 String(不考虑大小写),分别返回一个负整数、0 或一个正整数。 | 无 |
public int indexOf(int ch) | 在此对象表示的字符序列中第一次出现该字符的索引;如果未出现该字符,则返回 -1。 | 无 |
public int indexOf(int ch,int fromIndex) | 从指定的索引(含)开始搜索,返回在此字符串中第一次出现指定字符处的索引,否则返回 -1。 | 无 |
public int indexOf(String str) | 如果字符串参数作为一个子字符串在此对象中出现,则返回第一个这种子字符串的第一个字符的索引;如果它不作为一个子字符串出现,则返回 -1。 | 无 |
public int indexOf(String str,int fromIndex) | 从指定的索引开始,返回指定子字符串在此字符串中第一次出现处的索引,否则返回 -1。 | 无 |
public boolean isEmpty() | 如果 length() 为 0,则返回 true;否则返回 false。 | 无 |
public int lastIndexOf(int ch) | 在此字符序列中最后一次出现该字符的索引;如果未出现该字符,则返回 -1。 | 无 |
public int lastIndexOf(int ch,int fromIndex) | 从指定的索引处开始进行反向搜索,返回指定字符在此字符串中最后一次出现处的索引。如果在该点之前未出现该字符,则返回 -1。 | 无 |
public int lastIndexOf(String str) | 如果字符串参数作为一个子字符串在此对象中出现一次或多次,则返回最后一个这种子字符串的第一个字符。如果它不作为一个子字符串出现,则返回 -1。 | 无 |
public int lastIndexOf(String str,int fromIndex) | 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。如果在该点之前未出现该字符串,则返回 -1。 | 无 |
public int length() | 返回此字符串的长度。 | 无 |
public String replace(char oldChar,char newChar) | 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 | 无 |
public String replace(CharSequence target,CharSequence replacement) | 使用指定的replacement替换此字符串所有匹配target的子字符串。该替换从字符串的开头朝末尾执行,例如,用 “b” 替换字符串 “aaa” 中的 “aa” 将生成 “ba” 而不是 “ab”。 | NullPointerException - 如果 target 或 replacement 为 null。。该异常不必捕获。 |
public String substring(int beginIndex) | 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处(含)的字符开始,直到此字符串末尾。示例: “unhappy”.substring(2) 返回 “happy” | IndexOutOfBoundsException - 如果 beginIndex 为负或大于此 String 对象的长度。该异常不必捕获。 |
public String substring(int beginIndex,int endIndex) | 返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。示例: “hamburger”.substring(4, 8) returns “urge” | IndexOutOfBoundsException - 如果 beginIndex 为负,或 endIndex 大于此 String 对象的长度,或 beginIndex 大于 endIndex。该异常不必捕获。 |
public String toLowerCase() | 使用默认语言环境的规则将此 String 中的所有字符都转换为小写。 | 无 |
public String toUpperCase() | 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。 | 无 |
public String trim() | 返回字符串的副本,忽略前导空白和尾部空白。 | 无 |
public static String valueOf(boolean b) | 如果参数为 true,则返回一个等于 “true” 的字符串;否则,返回一个等于 “false” 的字符串。 | 无 |
public static String valueOf(char c) | 返回 char 参数的字符串表示形式。例如:String.valueOf(‘a’)的值为"a" | 无 |
public static String valueOf(char[] data) | 一个新分配的字符串,它表示包含在字符数组参数中的相同字符序列。 | 无 |
public static String valueOf(char[] data,int offset,int count) | 返回由data数组中从offset开始的count个数组元素组成字符串 | IndexOutOfBoundsException - 如果 offset 为负,count 为负,或者 offset+count 大于 data.length。该异常可以不捕获。 |
public static String valueOf(double d) | 返回 double 参数的字符串表示形式。同单参数的 Double.toString 方法返回的结果一致。 | 无 |
public static String valueOf(float f) | 返回 float 参数的字符串表示形式。 同单参数的 Float.toString 方法返回的结果一致。 | 无 |
public static String valueOf(int i) | 返回 int 参数的字符串表示形式。 同单参数的 Integer.toString 方法返回的结果一致。 | 无 |
public static String valueOf(long l) | 返回 long 参数的字符串表示形式。 同单参数的 Long.toString 方法返回的结果一致。 | 无 |
public static String valueOf(Object obj) | 如果参数为 null,则字符串等于 “null”;否则,返回 obj.toString() 的值。 | 无 |
- 补充解释
- 从上面的方法列表,我们看到有些方法名字相同,但是参数不同的情况,这种情况为方法的重载(overload),比如
valueOf
方法。所谓重载,是在同一个类中,同名但参数表不同的方法的多次定义,这些重载的方法在被调用时,Java会根据实参的不同而决定调用不同的重载方法。Java是根据什么区分不同的参数的呢?是根据对应位置参数的类型来区分的。 - 有些方法的前面带有static这个修饰词,那么这种方法,我们称之为静态方法,这种方法是通过类名直接调用,而不必通过对象来调用。例如上表中
valueOf
这个方法,调用的时候,形如:String.valueOf(123)
。 - 前表中,我们看到所有的方法前面都有个public,类对外提供服务的方法,都是通过public这个修饰词进行标识的。我们在定义类的方法时,不是所有的方法都是
public
的,有些方法只供类(或包内、或子类可用)内部使用,这就好比大家在超市结账的时候,只需要把货物和钱款交给收银员就行了,至于收银员在随后如何盘存,都是超市内部的机制,我们无需关注一样。 - 有些方法,如:
charAt
可能会抛出异常,但是这些异常在程序中又不必捕获,也不必声明,这是什么情况?我们可以看看这些异常都继承自哪个类:java.lang.RuntimeException
。我们这里说:凡继承自这个类的异常子类在你的程序中可以不进行捕获,也不进行声明,但是一旦发生这种类型的异常,你的程序会被毫不犹豫的中断,由系统对该异常进行处理,而系统处理的很简单,只是打印出出错栈信息,然后中断掉你的程序。所以,如果从你的程序的健壮性考虑,我们最好还是进行捕获并进行处理。
- 从上面的方法列表,我们看到有些方法名字相同,但是参数不同的情况,这种情况为方法的重载(overload),比如
#StringBuffer和StringBuilder
String对象一旦创建,它的内容是不能改变的,大家可能说String的replace
方法不是在替换子字符串吗?我们要明确,replace
得到的是一个新的字符串,对原字符串没有任何影响。有时候,我们需要在原有字符串的基础上操作,这个时候就需要使用StringBuffer
或者StringBuilder
了。
StringBuffer
用于多线程环境,StringBuilder
用于单线程环境。这两个类中提供public方法
是一致的。在这两个类上的主要操作是 append
和 insert
方法,这两个方法以各种类型重载,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。append
方法始终将这些字符添加到生成器的末端;而 insert
方法则在指定的点添加字符。其他还有一些方法,大家可以参考JDk说明书。
我们在生成这两种类的对象时,如果不带参数,比如:StringBuffer sb = new StringBuffer()
,它会构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。 但是如果使用的是带参数构造方法,比如:StringBuffer sb = new StringBuffer("abc");
它会构造一个字符串缓冲区,并将其内容初始化为 abc 。该字符串的初始容量为 16 加上字符串参数的长度,既是19。也可以在创建对象的时候,通过传递一个数值来设置字符串缓冲区的大小,比如:StringBuffer sb = new StringBuffer(20);
,这里20就是字符串缓冲区的大小。