Java字符串相关类

字符串相关类


#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 。我们这里说:凡继承自这个类的异常子类在你的程序中可以不进行捕获,也不进行声明,但是一旦发生这种类型的异常,你的程序会被毫不犹豫的中断,由系统对该异常进行处理,而系统处理的很简单,只是打印出出错栈信息,然后中断掉你的程序。所以,如果从你的程序的健壮性考虑,我们最好还是进行捕获并进行处理。

#StringBuffer和StringBuilder

String对象一旦创建,它的内容是不能改变的,大家可能说String的replace方法不是在替换子字符串吗?我们要明确,replace得到的是一个新的字符串,对原字符串没有任何影响。有时候,我们需要在原有字符串的基础上操作,这个时候就需要使用StringBuffer或者StringBuilder了。

StringBuffer用于多线程环境,StringBuilder用于单线程环境。这两个类中提供public方法是一致的。在这两个类上的主要操作是 appendinsert 方法,这两个方法以各种类型重载,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。其他还有一些方法,大家可以参考JDk说明书。

我们在生成这两种类的对象时,如果不带参数,比如:StringBuffer sb = new StringBuffer(),它会构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。 但是如果使用的是带参数构造方法,比如:StringBuffer sb = new StringBuffer("abc");它会构造一个字符串缓冲区,并将其内容初始化为 abc 。该字符串的初始容量为 16 加上字符串参数的长度,既是19。也可以在创建对象的时候,通过传递一个数值来设置字符串缓冲区的大小,比如:StringBuffer sb = new StringBuffer(20);,这里20就是字符串缓冲区的大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值