java字符串String(一)

一、字符串连接:
四种方式,比较性能高低:
例子:abc和100000个def进行连接
用来测试运行时间:

long time1=System.currentTimeMillis();
……(运行程序)
long time2=System.currentTimeMillis();
System.out.println("the cost is "+(time2-time1));

显然后两者的效率就要高很多
1.直观了当的 ”+”

      String a="abc";
        for(int i=0;i<100000;i++){
            a=a+"def";
        }

一条语句中,可以放心使用+号连接,不会影响性能。

String a = "a" + "a";  
String s = "a" + "b" + a + "c" + 5 +"d"; 

编译器自动处理成:

String s = new StringBuilder("ab").append(a).append("c").append(5).append("d").toString();  

但是在多次循环连接中用这种方式是极低效的

2.concat

        for(int i=0;i<100000;i++){
            a.concat("def");
        }   

+号和concat()方法使用了StringBuilder,他们的性能应该和StringBuilder的一样好,但是由于额外的创建StringBuilder和做.append(str).append(str).toString()的操作,使得他们的性能会受到一些影响,尤其在多次循环创建下。

3.StringBuilder,append

        StringBuilder sb=new StringBuilder("abc");
        for(int i=0;i<100000;i++){
        sb.append("def");
        }

4.StringBuffer,append

    StringBuffer sbf=new StringBuffer("abc");
        for(int i=0;i<10000000;i++){
            sbf.append("def");
        }

StringBuffer和StringBuilder基本一样,区别就是:
StringBuffer是线程安全的;
StringBuilder不是线程安全的,但性能稍好一些,在不需要线程安全的字符串连接,尽量使用StringBuilder。(大部分情况下都不需要线程安全)

二、字符串匹配
Java中字符串中子串的查找共有四种方法,如下:
1、int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引。
2、int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引。
3、int lastIndexOf(String str) :返回在此字符串中最右边出现的指定子字符串的索引。
4、int lastIndexOf(String str, int startIndex) :从指定的索引处开始向后搜索,返回在此字符串中最后一次出现的指定子字符串的索引。

        //字符串匹配的实现
        String str1 = "abcdefghijklmnabc"; 
        // 从头开始查找是否存在指定的字符 
        System.out.println(str1.indexOf("c")); 
        // 从第四个字符位置开始往后继续查找 
        System.out.println(str1.indexOf("c", 3)); 
        //若指定字符串中没有该字符则系统返回-1 
        System.out.println(str1.indexOf("x")); 

三、String中==和equal()的区别
1.“==”的含义:
基本数据类型 :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
复合数据类型(类,比如String):当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。
(除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。)
2.equals
JAVA当中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被复写了,如String、Integer、Date。在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。
String类中被复写的equals()方法其实是比较两个字符串的内容。

猜你喜欢

转载自blog.csdn.net/Findingxu/article/details/51838217