Java中的String

来源:互联网 发布:淘宝whoo小样是真的吗 编辑:程序博客网 时间:2024/06/05 20:47

一、:String的性质

1.1.String的创建


Java中的String是属于对象的的,这也符合Java中一切皆对象的原理,String 类位于 java.lang 包中。默认情况下,该包被自动导入所有的程序。

String类常见的构造方法有:

        1)String(String original):创建一个String对象为original的拷贝;

        2)String(char[] value):用一个字符数组创建一个String对象;

        3)String(char[] value,int offset,int count):用一个字符数组从offset项开始的count个字符序列创建一个String对象;

1.2.字符串池的属性

       在字符串中存在一个非常特殊的地方,那就是字符串池。每当我们创建一个字符串对象时,首先就会检查字符串池中是否存在面值相等的字符串,如果有,则不再创建,直接放回字符串池中对该对象的引用,若没有则创建然后放入到字符串池中并且返回新建对象的引用。这个机制是非常有用的,因为可以提高效率,减少了内存空间的占用。
如:String str1 = "Hello World";
       String str2 = "Hello World"; 其实是指向同一块内存空间

1.3.String创建之后就不能修改

String类是不可改变的,所以你一旦创建了String对象,那它的值就无法改变了。 String 对象创建后则不能

被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同。如果需要对字符串做很多修改,

那么应该选择使用StringBuffer类或StringBuilder 类。


二、:String的方法

2.1.字符串的比较

         equals() ------判断内容是否相同。

         compareTo() ------判断字符串的大小关系。

         compareToIgnoreCase(String int) ------在比较时忽略字母大小写。

         == ------判断内容与地址是否相同。

         equalsIgnoreCase() ------忽略大小写的情况下判断内容是否相同。

         reagionMatches() ------对字符串中的部分内容是否相同进行比较

2.2.字符串的连接


对于字符串而言我们经常是要对其进行拼装处理的,在java中提高了三种拼装的方法:+、concat()以及append()方法。
下面借用大神chenssy的例子来说明一下三种方式的效率的不同
public class StringTest {      /** 使用+、concat()、append()方法循环10W次      */      public static void main(String[] args) {          //+          long start_01 = System.currentTimeMillis();          String a = "a";          for(int i = 0 ; i < 100000 ; i++){              a += "b";          }          long end_01 = System.currentTimeMillis();          System.out.println("  +   所消耗的时间:" + (end_01 - start_01) + "毫米");                    //concat()          long start_02 = System.currentTimeMillis();          String c = "c";          for(int i = 0 ; i < 100000 ; i++){              c = c.concat("d");          }          long end_02 = System.currentTimeMillis();          System.out.println("concat所消耗的时间:" + (end_02 - start_02) + "毫米");                    //append          long start_03 = System.currentTimeMillis();          StringBuffer e = new StringBuffer("e");          for(int i = 0 ; i < 100000 ; i++){              e.append("d");          }          long end_03 = System.currentTimeMillis();          System.out.println("append所消耗的时间:" + (end_03 - start_03) + "毫米");      }  }   ------------  Output:    +   所消耗的时间:19080毫米  concat所消耗的时间:9089毫米  append所消耗的时间:10毫米  
通过以上可以看出append的效率是最高的,为什么最高呢,这要看源代码了,但是我现在的水平太低了,根据大神的分析因为append没有创建新的对象所以比较快,其他的两个都是通过创建新对象的方式。

2.3.字符串的查找

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

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

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

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

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

starWith(String prefix,int toffset)-----测试此字符串从指定索引开始的子字符串是否以指定前缀开始。

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

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

<span style="font-size:18px;">package TwoWeek;public class StringManager {public static void main(String args[]){String str1 = "Hello World";System.out.println(str1.charAt(1));  //eSystem.out.println(str1.indexOf("e")); //1System.out.println(str1.indexOf("o", 2));System.out.println(str1.lastIndexOf("o"));//7System.out.println(str1.startsWith("Hello"));//true}}</span>

三、:String、StringBuffer和StringBuilder

3.1.StringBuffer

StringBuffer和String一样都是用来存储字符串的,只不过由于他们内部的实现方式不同,导致他们所使用的范围不同,对于StringBuffer而言,他在处理字符串时,若是对其进行修改操作,它并不会产生一个新的字符串对象,所以说在内存使用方面它是优于String的。
总而言之,就是它更加侧重于对字符串的变化,例如追加、修改、删除,相对应的方法append(), insert(), delete()等。

3.2.StringBuilder

StringBuilder也是一个可变的字符串对象,他与StringBuffer不同之处就在于它是线程不安全的,基于这点,它的速度一般都比StringBuffer快。

3.3.小总结

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

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

3、StringBuilder:在频繁进行字符串的运算(拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用StringBuffer,如SQL语句的拼装、JSON封装等(貌似这两个我也是使用|StringBuffer)。


1 0
原创粉丝点击