StringBuffer

来源:互联网 发布:合约机划算吗 知乎 编辑:程序博客网 时间:2024/06/06 12:24
/* String类适用于描述字符串事物 那么它就提供了多个方法对字符串进行操作 常见的操作有哪些方法? "abcd" 1.获取 1.1 字符串中包含的字符数,也就是字符串的长度  int length();获取长度  1.2 根据位置获取位置上某个字符  char charAt(int index);  1.3根据字符串该字符在字符中第一次出现的位置  int indexOf(int ch):返回的是ch在字符串第一次出现的位置,没有找到返回-1  int indexOf(int ch,int formIndex):从formIndex指定位置开始,获取ch在字符串第一次出现的位置,没有找到返回-1  int indexOf(String str):返回的是字符串str在字符串第一次出现的位置,没有找到返回-1  int indexOf(String str,int formIndex):从formIndex指定位置开始,获取字符串str第一次出现的位置,没有找到返回-1  int lastOf(int ch):反向索引一个字符出现的位置,没有找到返回-1  int lastOf(int ch,int formIndex):反向索引formIndex开始,一个字符出现的位置,没有找到返回-1  int lastOf(String str):反向索引一个字符串出现的位置,没有找到返回-1  int lastOf(String str,int formIndex):反向索引formIndex开始,一个字符出现的位置,没有找到返回-1 2.判断  2.1 字符串中是否包含某一个子串   boolean contains(str)   特殊之处:indexOf(str):可以索引str第一次出现位置,如果返回-1,表示该字符str不在字符串中存在   所以,也可以用于对指定判断是否包含   if(str.indexOf("aa")!=-1)   而且该方法即可判断,有可以获取出现的位置  2.2 字符串是否有内容。  boolean isEmpty():原理就是判断长度是否为0  2.3 字符串是否是以指定内容开头   boolean startsWith(str)  2.4 字符串是否以指定内容结尾   boolean endWith(str)  2.5 判断字符串内容是否相同,复写了Object类中的equals方法  boolean equals(str);  2.6 判断内容是否相同 ,并忽略大小写  boolean equalsIgnoreCase();  3转换  3.1 将字符数组转换成字符串  构造函数:String(char[])     String(char[],offset,count):将字符数组中的一部分转换成字符串  静态方法  static String copyValue(char[]);  static String copyValueOf(char[] data,int offset,int count)  static String value(char[])  3.2 将字符串转换成字符数组  toCharArray(String str);  3.3 将字节数组转换成字符串  String(byte[])  String(byte[],offset,count):将字符数组中的一部分转换成字符串  3.4 将字符串转换成字节数组  byte[] getBytes  3.5 将基本数据类型转换成字符串.  static String valueOf(object)  字符中和字节数组转换过程中,是可以指定编码表的  4.替换  String replace(oldchar,newchar);  5.切割  String[] split(regex)  6.子串  substring(begin)  substring(begin,end)  7.转换,去除空格 ,比较  7.1将字符串转换成大写或小写  String toUpperCase();  String toLowerCase();  7.2将字符串两端的多个空格去除  String trim();  7.3对丙个字符串进行自然顺序的比较   int compareto(String) */public class StringMethodDemo {public static void method_7(){String s="    Hello Java";sop(s.toUpperCase());sop(s.toLowerCase());sop(s.trim());//用户登录时使用,注册邮件时用String s1="abc";String s2="aAA";sop(s1.compareTo(s2));}public static void method_sub(){String s="abcdef";sop(s.substring(2));//从指定位置开始到结尾,如果角标不存在,就会存在角标越界导常sop(s.substring(2, 4));//包含头,不包含尾s.substring(0,str.lentgh)}public static void method_split(){String s="zhangsha,lisi,wangwu";String [] arr=s.split(",");for(int i=0;i<arr.length;i++)sop(arr[i]);}public static void method_replace(){String str="100,000,000";sop(str.replace("", ""));String s="hello java";String s1=s.replace("java", "world");sop("s="+s);sop("s1="+s1);}public static void method_trans(){char[] arr={'a','b','c','d','e'};}public static void method_is(){String str="ArrayDemo.java";//判断文件名称是否是Array单词开头sop(str.startsWith("Array"));//判断文件名称是.java的文件sop(str.endsWith(".java"));//判断文件中是否包含Demosop(str.contains("Demo"));sop(str.equalsIgnoreCase("ARRAYDEMO.JAVA"));}public static void method_get(){String str="abcdefakf";//长度sop(str.length());//根据索引获取字符sop(str.charAt(4));//获取第一次出现位置sop(str.indexOf('a'));sop(str.indexOf('a',3));sop(str.indexOf("abc"));sop(str.indexOf("abc",3));sop(str.lastIndexOf("a"));sop(str.lastIndexOf("a",2));sop(str.lastIndexOf("abc"));sop(str.lastIndexOf("abc",2));}public static void main(String[] args) {method_get();method_is();method_replace();method_split();method_sub();method_7();}public static void sop(Object o){System.out.println(o);}}


StringBuffer是线程安全的,应用于线程安全,可变的,String是不可以变,是final类(每创建一个,或者增加一个字符,都会在内存开辟空间来存储,以传值的方式传地址),StringBuilder是非线程安全的

三者效率从高到低

StringBuilder>StringBuffer>String

StringBuilder

StringBuffer

String


String 
1,Stirng是对象不是基本数据类型 
2,String是final类,不能被继承。是不可变对象,一旦创建,就不能修改它的值。 
3,对于已经存在的Stirng对象,修改它的值,就是重新创建一个对象,然后将新值赋予这个对象 
StringBuffer 
1,一个类似于 String 的字符串缓冲区,对它的修改的不会像String那样重创建对象。 
2,使用append()方法修改Stringbuffer的值,使用toString()方法转换为字符串。 
Stringbuild 
是jdk1.5后用来替换stringBuffer的一个类,大多数时候可以替换StringBuffer。和StringBuffer的区别在于Stringbuild是一个单线程使用的类,不值执行线程同步所以比StringBuffer的速度快,效率高。是线程非安全的。 

使用举例 
String s1 = “hello”; 
s1=“world”; 
这个操作其实是:其实是创建了两个String对象。 
String s2 = "hello" 
s2 += "world"; 
这操作是:先创建一个String对象,在接下来进行字符串连接的时候,有创建了一个StringBuild(jdk1.5前是StringBuffer),然后调用append()方法,最后调用toString()方法。 
有此可以看出String对字符的操作比直接使用Stringbuffer(或者StringBuild)要多出附加的操作,而且String是不可变对象,使用String对字符串操作会产生大量的、多余java对象。所以结果是:影响性能,占用空间。 
程序举例: 

分别使用String和StringBuffer对字符串“0123456789”累加10000次,然后统计耗时多长 

public class StringDemo {public static void main(String[] args) {String str = "0123456789";String str2 = "";int count = 10000;long start = System.currentTimeMillis();for (int i = 0; i < count; i++) {str2 += str;}long end = System.currentTimeMillis();long time = (end - start);System.out.println("String cost:"+time+"ms");/**StringBuffer*/str = "0123456789"; StringBuffer sb = new StringBuffer();  start = System.currentTimeMillis(); for (int i = 0; i < count; i++) { sb.append(str); } str2 = sb.toString(); end = System.currentTimeMillis(); time = (end - start); System.out.println("StringBuffer cost:"+time+"ms"); }}
运行结果


结果非常明显了,如果使用StringBuild时间还会再减少,这里就不再测试了

1. String对象内容是不可改变的,StringBuffer是可以改变的,并且高效; 


2. String
String a = "123"; 
a = a + "456"; 
上面两句,虽然a的值最终改变了,但是实际上在编译的时候,第一句a是一个对象,被分配了一个地址,第二句执行时,原来的a被释放,然后重新分配。
a 原本指向一 String object instance ("123"), a + "456" 会造出另一新的 String object instance ("123456"), 然后 a 再指向这新的 String instance.


3. StringBuffer
StringBuffer b = new StringBuffer("asd"); 
b.append("fgh"); 
在这个过程中,只存在b这么一个对象,b 一直都指向一个 StringBuffer instance. append 也只是改变此 instance 的內容而已. 


说明:本人于ITEYE创建于2013年,现转移到CSDN

0 0
原创粉丝点击