您的位置:首页 > 编程语言 > Java开发

java字符串String(一)

2016-07-06 13:46 549 查看
一、字符串连接:

四种方式,比较性能高低:

例子: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()方法其实是比较两个字符串的内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: