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

Java中的String

2016-06-01 18:41 357 查看


一、: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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java String