天天看点

Java基础 (3)字符串操作

一个字符串就是一个字符序列,字符串被广泛应用于 Java 编程。

Java语言将字符串作为<code>String</code>类型的对象进行处理。<code>String</code>类放在<code>java.lang</code>包中,不需要<code>import</code>就能直接使用。

<code>String</code>并不是基本的数据类型,是一个对象,并且是一个不可变的对象,在初始化前一个<code>String</code>对象的值为<code>null</code>。

最常用的创建字符串对象的方法如下:

它等价于:

当使用一个数组创建一个<code>String</code>对象时,数组的内容将被复制。在String被创建之后,如果改变数组的内容,<code>String</code>将不会随之改变。

我们来比较以下三个字符串:

<code>str1</code>的值为null,表示没有指向任何字符串对象;<code>str2</code>已经指向了一个字符串对象,这个对象的字符序列内容为空;<code>str3</code>是显式地调用构造函数创建字符串对象,该对象的字符序列内容为空,与第二行代码是基本一样的。

字符串可以通过<code>+</code>和<code>+=</code>操作符进行拼接,比如:

最后<code>str1</code>和<code>str2</code>所指向的字符串内容为"abcdef"。

String的比较

判断内容是否相同 boolean equals(Object anObject)

判断内容是否相同,在比较时忽略大小写 boolean equalsIgnoreCase()

比较两个字符串的字典顺序 int compareTo (String anotherString)

比较两个字符串的字典顺序,在比较式忽略字母大小写 int compareToIgnoreCase(String anotherString)

比较两个引用,是否指向同一个String对象 ==

equals()与==的区别

如果两个字符串变量指向的字符串序列内容完全一样,equals()返回true;如果两个字符串变量指向同一个对象,==返回true。

以上代码,第一个输出为<code>false</code>,第二个输出为<code>true</code>。

String的查找

返回指定索引index位置上的字符,索引范围从0开始  char charAt(int index)

从字符串开始检索str,并返回第一次出现的位置,未出现返回-1 int indexOf(String str)

从字符串的第fromIndex个字符开始检索str int indexOf(String str,int fromindex)

查找最后一次出现的位置 int lastIndexOf(String str)

从字符串的第fromIndex个字符查找最后一次出现的位置 int lastIndexOf(String str,int fromIndex)

测试此字符串从指定索引开始的子字符串是否以指定前缀开始 boolean startsWith(String prefix,inttoffset)

测试此字符串是否以指定的前缀开始 boolean startsWith(String prefix)

测试此字符串是否以指定的后缀结束 boolean endsWith(String suffix)

String的替换

string的替换涉及到string对象的修改。注意每一个修改string对象的操作,都会创建一个新的string的对象,这个对象包含了修改后的字符串内容。最初的string对象则未发生任何变化。

把原来的oldCHar字符替换为newChar字符,返回新串 String replace(char oldChar,char newChar)

把原来的target子序列替换为replacement序列,返回新串 String replace(CharSequence targrt,CharSequence replacement)

注意这里的CharSequence类是String类的父类,我们可以传入String类型的参数。

执行后,<code>str2</code>所指向的字符串内容为"xxxxyz"。

String的截取

返回一个新的字符串,它是此字符串的一个子字符串 String subString(int beginindex)

返回一个新的字符串,它从下标beginIndex开始,到endIndex-1的子串 String subString(int beginIndex,int endIndex)

StringBuffer

<code>StringBuffer</code>表示表示可变长的和可修改的字符序列。我们可以<code>StringBuffer</code>进行插入或者追加字符序列、翻转字符序列等操作。

<code>StringBuffer</code>必须通过构造函数进行初始化,它有三个构造方法:

<code>StringBuffer()</code>:默认的构造方法预留16个字符的空间

<code>StringBuffer(int size)</code>:第二种形式接收一个整数参数,显示的设置缓冲区的大小

<code>StringBuffer(String str)</code>:第三种形式接收一个<code>String</code>参数,设置<code>StringBuffer</code>对象的初始内容,同时多预留16个字符的空间

<code>StringBuffer</code>的许多方法和<code>String</code>类都差不多,功能几乎一模一样。

<code>String</code>类型和<code>StringBuffer</code>类型的主要区别其实在于<code>String</code>是不可变的对象, 因此在每次对<code>String</code>对象进行改变的时候其实都会生成一个新的<code>String</code>对象。所以经常改变内容的字符串最好不要用<code>String</code> ,因为每次生成对象都会对系统性能产生影响。

使用<code>StringBuffer</code>类则会对<code>StringBuffer</code>对象本身进行操作,而不是生成新的对象。所以在一般情况下我们推荐使用<code>StringBuffer</code>,特别是字符串对象经常改变的情况下。<code>StringBuffer</code>类的操作性能要优于<code>String</code>。

了解了这个区别,我们也应该比较明确两者的使用场景了。

使用<code>String</code>的场景:在字符串不经常变化的场景中可以使用<code>String</code>类,例如常量的声明、少量的变量运算。

使用<code>StringBuffer</code>类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用<code>StringBuffer</code>,例如XML解析、HTTP参数解析和封装。

StringBuffer 的常用操作

得到当前StringBuffer的长度  int length()

得到总的分配容量 int capacity()

为构造好的StringBuffer预分配空间,设置缓冲区的大小,在已知需要追加大量的字符的情况下很有用  void ensureCapacity(int capacity)

在StringBuffer对象内设置缓冲区的大小 void setLength(int len)

从StringBuffer对象中得到单个字符 char charAt(int index)

将StringBuffer的index位的字符置为ch void setCharAt(int index,char ch)

将StringBuffer的子字符串复制给数组 void getChars(int sourceStart,intsourceEnd,char target[],int targetStart)

将其他类型数据的字符串形式拼接到StringBuffer对象后面 StringBuffer append(Object obj)

将String类型的字符串拼接到StringBuffer对象后面 StringBuffer append(String str)

将StringBuffer类型的字符串拼接到StringBuffer对象后面 StringBuffer append(StringBuffer str)

将字符数组类型的字符串拼接到StringBuffer对象后面 StrignBuffer append(char[] str)

在StringBuffer对象中插入内容  insert(int n,String str)

用于一处StringBuffer对象中,删除这个序列的一个子字符串中的字符。子字符串的开始在指定的start和延伸处的字符索引end - 1或结束的序列  delete(int start,int end)