java字符串基础知识整理

来源:互联网 发布:java web 图书馆管理 编辑:程序博客网 时间:2024/06/16 06:24

字符串基础知识整理

String类(字符串常量)

Java中将字符串作为String类型对象来处理。当创建一个String对象时,被创建的字符串是不能被改变的。每次需要改变字符串时都要创建一个新的String对象来保存新的内容,原始字符串不变。之所以采取这种方法是因为实现固定,不可变的字符串比实现可变的字符串更高效。而StringBuffer是一个可变的字符串,它的对象在创建之后是可以改变的。

将字符串作为内置的对象处理允许Java提供十分丰富的功能特性以方便处理字符串。如比较两个字符串,搜索子串,连接字符串以及改变字符串中的字母的大小写。而且String类型提供多种的构造方法,我们可以根据不同的需要来得到字符串对象。

String类和StringBuffer类都在java.lang中定义。因此它们可以自动的被所有程序使用。两者均被说明为final,这意味着两者均不含子类。

String构造函数

(1)String(),默认构造函数,无参数

String s1 = new String();

(2)String(char chars[]),传入字符数组

char[] myChar = {‘a’,’b’,’c’};

String s2 = newString(myChar);//使用字符串“abc”初始化s2

(3)String( char chars[], int startIndex,int numChars) ,传入一个字符数组,从指定下标位置开始获取指定个数的字符,用这些字符来初始化字符串变量。

char[] myChars={'h', 'e','l', 'l', 'o'};

String s3 = newString(myChars,1,3); //使用字符串“ell”初始化s3

(4)String(String strObj),传入另一个字符串对象,用该字符串对象的内容初始化

String s4= newString(s3); // 这是s4也是“ell”了。

字符串操作

1、调用字符串的length.()方法可以得到该字符串的长度(字符个数);

2、前面说明了如何使用new运算符创建一个字符串实例。对于程序中的每一个字符串常量,Java会自动创建String对象。因此,可以使用字符串常量初始化String对象。例如:

String s5 = “abc”;

Int i = s5.length();//可以将字符串作为对象来进行操作

3、可以使用“+”运算符来将两个字符串连接起来产生一个新的String对象。只要+运算符有一个运算数是字符串(String)实例时,编译器就会将另一个运算数转换为它的字符串形式。这种操作是通过调用一个由String类定义的字符串转换方法valueOf()来完成的。对于简单类型,valueOf()方法返回一个字符串,该字符串包含了该类型的值的字符串。对于对象,valueOf()方法调用toString()方法。每一个类都执行toString()方法,因为它是由Object定义的。toString()方法返回一个String对象(即字符串)。该对象一般是对类的一个描述。

4、substring() 

它有两种形式,第一种是:

String substring(int startIndex) 

第二种是:

String substring(int startIndex,int endIndex)

5、字符截取

char charAt(int where) ,注意,这里返回一个char字符例如:

      char a ;

a="abcde".charAt(2); //将索引为2 ,即第三个字符赋给a

6、字符串比较

    * boolean equals(Object str) 比较两个字符串对象是否相等,

   boolean equalsIgnoreCaseJ(Stringstr) 比较两个字符串对象,且忽略字符的大小写

7、int compareTo(String str) 方法用于比较两个字符串的大小。字符串比较的结果及其含义:

含义

小于0

调用此方法的字符串小于参数str

大于0

调用此方法的字符串大于参数str

等于0

两个字符串相等

8、搜索字符串:

int indexOf( int ch)

int lastIndexOf( intch)

int indexOf(Stringstr)//查找字符或者子串第一次出现的地方

int lastIndexOf(Stringstr)//查找字符或者子串是最后一次出现的地方

指定搜索的起始点:

int indexOf( int ch,int startIndex)

Int lastIndexOf( intch ,int startIndex)

int indexOf(Stringstr ,int startIndex)

int lastIndexOf(Stringstr, int startIndex)

 9、使用substring()截取子字符串:

      String substring(int startIndex)    注意substring中string没有大写,截取指定位置后的子字符串。

      String substring(int startIndex,int endIndex) 截取指定起始位置和结束位置的子字符串。注意截取的字字符串不包括结束位置的字符。

10、concat() 连接连个字符串,与+ 运算符执行相同功能。

   String concat(String str); 

    这个方法会创建一个新的对象,这个对象包含调用字符串,str的内容跟在调用字符串的后面,与+运算符有相同的效果。 

String s1 = "one"; 

String s2 = s1.concat("two"); 

等同于: 

String s1 = "one"; 

String s2 = s1+"two";

 11、replace() 用另一个字符取代指定字符串中指定字符:

String replace(char original,char replacement)    例如:

       String s=”Hello”.replace(‘l’,’w’); //执行后 s =”Hewwo”;

 12、trim() 返回一个字符串,该字符串是删除调用字符串前后的空白符所得的字符串

 13、改变字符串内字符的大小写

 String toLowerCase() 返回一个所有字母都是小写的字符串

       String toUpperCase()返回一个所有字母都是大写的字符串

14、使用 valueOf()方法实现数据转换

         例如:

String str =String.valueOf(3) ; //将int类型转换成字符串类型,其他基本数据类型和任何类的对象也可作为参数。

15、startsWith()和endsWith() 

startsWith():方法决定是否以特定字符串开始

endWith():方法决定是否以特定字符串结束

StringBuffer类(多线程,同步)

简介

StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。

所以在实际使用时,如果需要经常对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。

在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是一样的。但是有一个显著的区别在于,对于StringBuffer对象的每一次修改都会改变对象自身,这点和String类最大的区别。

同时,StringBuffer是线程安全的。

StringBuffer对象的初始化

   StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。

    例如:

        StringBuffer s = new StringBuffer();

    这样初始化出的StringBuffer对象是一个空的对象。

    如果需要创建带有内容的StringBuffer对象,则可以使用:

        StringBuffer s = new StringBuffer(“abc”);

这样初始化出的StringBuffer对象的内容就是字符串”abc”。

 

    需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:

        StringBuffer s = “abc”;              //赋值类型不匹配

        StringBuffer s = (StringBuffer)”abc”;    //不存在继承关系,无法进行强转

 

   StringBuffer对象和String对象之间的互转的代码如下:

        String s = “abc”;

        StringBuffer sb1 = new StringBuffer(“123”);

        StringBuffer sb2 = new StringBuffer(s);   //String转换为StringBuffer

        String s1 =sb1.toString();             //StringBuffer转换为String

StringBuffer的常用方法

   StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。

1、Append方法

    public StringBuffer append(boolean b)

    该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:

                 StringBuffer sb = newStringBuffer(“abc”);

                  sb.append(true);

         则对象sb的值将变成”abctrue”。

2、使用该方法进行字符串连接,将比String更加节约内容,例如应用于数据库SQL语句的连接,例如:

StringBuffersb = new StringBuffer();

                  String user = “test”;

                  String pwd = “123”;

                  sb.append(“select * from userInfo where username=“)

                   .append(user)

                   .append(“ and pwd=”)

                   .append(pwd);

         这样对象sb的值就是字符串“select * from userInfo where username=test andpwd=123”。

 

 

3、deleteCharAt方法

 publicStringBuffer deleteCharAt(int index)

该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:

        StringBuffer sb = new StringBuffer(“Test”);

        sb. deleteCharAt(1);

该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象sb的值变为”Tst”

还存在一个功能类似的delete方法:

        public StringBuffer delete(int start,int end)

该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:

        StringBuffer sb = new StringBuffer(“TestString”);

        sb. delete (1,4);

该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”

 

4、insert方法

   public StringBuffer insert(intoffset, boolean b)

      该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:

                                    StringBuffer sb = new StringBuffer(“TestString”);

                                    sb.insert(4,false);

该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”

 

5、reverse方法

  public StringBuffer reverse()

该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:

        StringBuffer sb = new StringBuffer(“abc”);

        sb.reverse();

经过反转以后,对象sb中的内容将变为”cba”

6、setCharAt方法

 public void setCharAt(int index, char ch)

                            该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:

                                    StringBuffer sb = new StringBuffer(“abc”);

                                    sb.setCharAt(1,’D’);

                            则对象sb的值将变成”aDc”

 

7、trimToSize方法

   public void trimToSize()

    该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。

         总之,在实际使用时,String和StringBuffer各有优势和不足,可以根据具体的使用环境,选择对应的类型进行使用。

常用操作

StringBuffer定义了下面三个构造函数:

StringBuffer()  //默认构造函数

StringBuffer(intsize)   //设置指定缓冲区大小

StringBuffer(Stringstr)   //设置StringBuffer对象初始化的内容

1、调用length()方法可以得到StringBuffer对象的长度,调用capacity()可以得到总的分配容量。两个方法都是返回一个int类型的值。

    一个StringBuffer当前长度可通过length()方法得到,而整个可分配空间通过capacity()方法得到。

2、void ensureCapacity(intcapacity)

    如果想在构造StringBuffer对象后为某些字符预分配空间,可以使用ensureCapacity()方法,设置缓冲区的大小,这在事先已知要在StringBuffer上追加大量小字符串的情况下是有用的。ensureCapcity()方法具有如下的一般形式: void ensureCapacity(intcapacity)

3、void setLength(int len)

    使用setLength()方法可以设置StringBuffer对象的长度,它的一般形式如下:

void setLength(intlen)    如果len大于StringBuffer对象当前的length()值的话,那么会在StringBuffer对象后面加上空字符;如果比length()小的话,则len后面的字符串会丢失。

4、append()

    Append()方法将任一其他类型数据的字符串形式连接到调用StringBuffer对象的后面,对所有内置的类型和Object,它都有重载形式。下面是几种形式:

StringBuffer append(Stringstr)

StringBuffer append(intnum)

StringBuffer append(Objectobj)

5、 insert()

       Insert()方法将一个字符串插入另一个字符串中。下面是它的几种形式:

 StringBufferinsert(int index,String str)

 StringBufferinsert(int index,char ch)

 StringBufferinsert(int index,Object obj)

 6、reverse()            // StringBuffer reverse()

        例子:

StringBuffer strbf=newStringBuffer(“ABCDEFG”);

       strbf.reverse(); 

       System.out.println(strbf); //输出GFEDCBA

7、StringBuffer delete(intstartIndex,int endIndex)

        StringBufferdeleteCharAt(int loc)

       删除指定位置的字符串和指定位置的字符。例如删除第一个字符后的所有字符:

       strbf.delete(1,strbf.length());

例子:

StringBuffer delete(int startIndex,int endIndex) 

StringBuffer deleteCharAt(int loc)

 8、replace()   

        它完成在StringBuffer内部用一个字符串代替另一个指定起始位置和结束位置的字符串的功能,注意的是,被代替的字符不包括结束位置上的字符,它的一般形式是,:

       StringBuffer replace(int startIndex, int endIndex,String str)

 9、substring() 返回StringBuffer的一部分值

        Stringsubstring(int startIndex)

        Stringsubstring(int startIndex, int endIndex)

StringBuilder(非同步)

概念

StringBuilder是一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。

简介

如果可能,建议优先采用StringBuilder类,因为在大多数实现中,它比StringBuffer要快。在StringBuilder上的主要操作是append和insert方法。每个方法都能有效地将给定的数据转换为字符串,然后将该字符串添加或插入到字符串生成器中。

append方法始终将这些字符添加到生成器的末端;而insert方法则在指定的点添加字符。例如:如果z引用一个当前内容为“start”的字符串生成器对象,则该方法调用z.append(“le”)将使字符串生成器包含“startle”,而z.insert(4,”le”)将更改字符串生成器,使之包含“starlet”。通常,如果n引用StringBuilder的实例(StringBuildern = new StringBuilder();),则n.append(x)和n.insert(n.length(),x)具有相同的效果。

每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓存。如果内部缓冲区溢出,则此容量自动增大。将StringBuilder的实例用于多个线程是不安全的,如果需要同步,则建议使用StringBuffer。StringBuilder类可以用于无需创建一个新的字符串对象情况下修改字符串。StringBuilder不是线程安全的,而StringBuffer是线程安全的。但是StringBuilder在单线程中的性能比StringBuffer高。

String/StringBuffer/StringBuilder三者比较

String 字符串常量

StringBuffer 字符串变量(线程安全)

StringBuilder 字符串变量(非线程安全)

简要的说,String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下,String对象的字符串拼接其实是被 JVM 解释成了StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:

String S1 = “This is only a” + “ simple” + “ test”;

StringBuffer Sb = new StringBuilder(“This is onlya”).append(“ simple”).append(“ test”);
    
你会很惊讶的发现,生成 StringS1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
 String S1 = “This is only a” + “ simple” + “test”; 其实就是:
 String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
    String S2 = “This is only a”;
    String S3 = “ simple”;
    String S4 = “ test”;
    String S1 = S2 +S3 + S4;
    这时候 JVM 会规规矩矩的按照原来的方式去做。

一、    在大部分情况下 StringBuffer > String

StringBuffer

Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
    可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

StringBuffer 上的主要操作是 append和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。

二、在大部分情况下StringBuilder > StringBuffer

java.lang.StringBuilde

java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

0 0
原创粉丝点击