Java中的String

原创 2016年06月01日 18:41:51

一、: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));  //e
		System.out.println(str1.indexOf("e")); //1
		System.out.println(str1.indexOf("o", 2));
		System.out.println(str1.lastIndexOf("o"));//7
		System.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)。


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)