奋斗黑马程序员----Java之StringBuffer与StringBuilder

来源:互联网 发布:java多线程处理高并发 编辑:程序博客网 时间:2024/04/29 18:26
----------android培训java培训、期待与您交流! ----------
/**java之StringBuffer与StringBuilder *  *//**1,StringBuffer简介: *  public final class StringBuffer --extends Object  implements Serializable, * CharSequence线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能 * 修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改 * 变该序列的长度和内容。 *  * buffer:缓冲区的意思 * StringBuffer是字符串缓冲区 * String的对象一旦初始化就不能被改变,而StringBuffer可以用于对字符串进行修改的。  *  * StringBuffer: * 1,是一个容器,而且长度是可变化的。(数据的长度是固定的) * 2,可以直接操作多个数据类型。(数组一次只能操作一个) * 3,最终会通过toString方法变成字符串。 *  *  * StringBuilder(1.5以后出现) *    public final class StringBuilder extends Object implements Serializable,  * CharSequence,一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但 * 不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被 * 单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大 * 多数实现中,它比 StringBuffer 要快。  *  *   StringBuffer是线程同步,更安全,单线程,用StringBuffer效率低,因为用 * 一次就要判断锁。 *   StringBuilder是线程不同步,但毕老师选择用StringBuilder,因为是后出的。 * ????不需要判断锁,快捷,效率高。 *  将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则 * 建议使用 StringBuffer。  *  * 以后开发建议使用StringBuilder *  * java的升级无外乎三个: * 1,提高效率,最重要。 * 2,简化书写 * 3,提高安全性 *  *//**2,StringBuffer可以看成是一个容器 * 容器的特点:CURD(create,update,read,delete) * 1,存储; * StringBuffer append();将指定的数据作为参数添加到已有数据的结尾处。 * StringBuffer insert(int offset,任意类型数据);可以将数据插入到指 * 定offset位置,有角标越位的限制。 * 2,删除; * StringBuffer delete(start,end);删除缓冲区的数据,包含start,不包 * 含end。(是按角标说的,非长度变量) * StringBuffer deleteChar(index);删除指定位置的字符 * 3,获取; * char charAt(int index);获取指定位置的字符 * int indexOf(String str);根据字符串获取位置。 * int lastIndexOf(String str); * int length(); * String substring(int start); * String substring(int start, int end); *  * 4,修改;也可以理解为“替换” * StringBuffer replace(int start, int end, String str);包含头,不包含尾  * void setCharAt(int index, char ch);单个字符的替换,将指定位置替换为ch字符 *  * 5,反转: * StringBuffer reverse();反转 *  * 6, void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin); *  后面的dst数组有越界的限制,将缓冲中的指定数据存储到指定数组中。(包含头,不包含尾) *  *  * 面盆理论: * StringBuffer就是一个面盆,而里面的东西无论怎么换,也无论原料怎么更改, * 怎么添加和减少,这儿面盆都是一直不变的。 *  */class StringBufferDemo{public static void main(String[] args){//method_add();//method_delete();method_update();//StringBuffer sb = new StringBuffer("abcdefg");//StringBufferStringBuilder sb = new StringBuilder("abcdefg");//StringBuilderchar[] cha = new char[5];sb.getChars(1,4,cha,1);for(int x=0;x<cha.length;x++){sop("cha["+x+"]="+cha[x]+";");}}/**添加数据的方法 *  */public static void method_add(){StringBuffer sb = new StringBuffer();sb.append("abc").append(true).append(32);//方法调用链:方法返回的还是本类对象,还可以调用本类方法sb.insert(1,"qq");// StringBuffer sb1 = sb.append(32);// sop("sb==sb1:"+(sb==sb1));/* * String toString() Returns a string representing the data in this sequence. */sop(sb.toString());//输出:abctrue32// sop(sb1.toString());}/** * 删除操作 */public static void method_delete(){/* StringBuffer delete(int start, int end)  * Removes the characters in a substring of this sequence. * 包含首,不包含尾  *  */StringBuffer sb = new StringBuffer("abcde");//sb.delete(1,3);//bc就被删除了//清空缓冲区。//sb = new StringBuffer();//这么做也可以,但是相当于把面盆扔了,有点败家,相当于又重新开辟一个缓冲区//sb.delete(0,sb.length());//清空操作//sb.delete(2,3);//删除csb.deleteCharAt(2);//也是删除c,但是比上面的更方便,删除指定位置的字符。sop(sb.toString());}public static void method_update(){StringBuffer sb = new StringBuffer("abcde");sb.replace(1,4,"java");//输出:ajavaesb.setCharAt(2,'B');sop(sb.toString());}public static void sop(String str){System.out.println(str);}}/** * StringBuilder在操作上和StringBuffer基本相同,但StringBuilder是线程 * 不安全的。 */public class StringBuilderDemo {public static void main(String[] args) {method_add();}public static void method_add(){StringBuilder sb = new StringBuilder();sb.append("adddddd");sb.append("bcccccc");System.out.println(sb.length());System.out.println(sb.toString());}}/**3,基本数据类型对象包装类: *  * 基本数据类型(类,引用数据类型) * byte,Byte * shortShort * intInteger * longLong * booleanBoolean * floatFloat * doubleDouble * charCharacter *  *    基本数据类型对象包装类的最常见作用,就是用于基本数据类 * 型和字符串类型之间做转换。 *  * 那么怎么转呢? * 1.基本数据类型转成字符串, * 方法:基本数据类型+"" * 基本数据类型.toString(基本数据类型值); * 如:Integer.toString(32);//将32变成字符串"32" * 2.字符串转成基本数据类型。(静态调用方式) * xxx a = Xxx.parseXxx(String); * 如:int a = Integer.parseInt("234"); * double b = Double.parseDouble("3234.34"); *  * 但是: * boolean b = Boolean.parseBoolean("true"); * 对于char类型的,由于字符是字符串的最小单位, * 所以不用转,可以直接操作。 *  *  * 十进制转成其他进制: * toBinaryString(); * toHexString(); * toOctalString(); * 其他进制转成十进制: *   static int parseInt(String s, int radix);使用第二个参 * 数指定的基数,将s转成指定进制radix的数。 *  如:parseInt("-FF", 16) 返回 -255 *     parseInt("1100110", 2) 返回 102 *  * 对象调用方式: * Integer i = new Integer("234"); * int num = i.intValue();//非静态的 *  */public class IntegerDemo {public static void main(String[] args) {//整数类型的最大值sop("Integer max value"+Integer.MAX_VALUE);//将一个字符串转成整数:int num = Integer.parseInt("12891");sop("num="+num);Long x = Long.parseLong("8938982838924");sop("x = "+x);/* *   static String toBinaryString(int i) 以二进制 * (基数 2)无符号整数形式返回一个整数参数的字符 * 串表示形式。  */String s1 = Integer.toBinaryString(-7);String s2 = Integer.toBinaryString(8);sop("s1 = "+s1);//s1 = 11111111111111111111111111111001sop("s2 = "+s2);//8的二进制表示: 1000//sop(Integer.toHexString(60));//int t = Integer.parseInt("120",10);//转成十进制的120//int t = Integer.parseInt("110",2);//转成2进制的6int t = Integer.parseInt("3c",16);//转成十六进制的60sop("t="+t);}public static void sop(Object obj){System.out.println(obj);}}/**4,JDK1.5版本以后出现的新特性. *  *    装箱:把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。 * int包装成Integer、float包装成Float *    拆箱:和装箱相反,将引用类型的对象简化成值类型的数据 *  Integer a = 100;   这是自动装箱  (编译器调用的是static Integer valueOf(int i)) *  int     b = new Integer(100); 这是自动拆箱 *  */class IntegerDemo1 {public static void main(String[] args) {Integer x = new Integer(5);Integer y = 5;//自动装箱,相当于new Integer(5);简化书写·y是一个对象y = y+2;//y+2,进行了自动拆箱,变成了int类型,和2进行加法运算。再将和进行装箱赋给y//拆箱原理:y+2y进行了y.intValue();操作Integer m = 128;Integer n = 128;sop("m==n:"+(m==n));//m==n:false/**byte能最大识别:-128~127,如果不超过这个范围,则系统不会在内存中开辟空间,直接拿来使用,如果超过了这个范围,则系统会开辟空间,也就造成了m和n不相等的原因。*/Integer a = 127;Integer b = 127;sop("a==b:"+(a==b));/*a==b:true,因为a和b指向了同一个Integer对象,因为当数值在byte范围内,对于新特性,如果该数值已经存在, *则不会再开辟新的空间。  */Integer a2 = new Integer(128);Integer a3 = new Integer(128);System.out.println("a2 == a3 : "+(a2 == a3));//a2 == a3 : falseSystem.out.println("a2.equals(a3) = "+a2.equals(a3));//a2.equals(a3) = true}public static void method(){// Integer x = new Integer("123");Integer y = new Integer(123);/**Integer本身复写了Object中的equals方法,比较的是数值是否相同。*/sop("x==y:"+(x==y));sop("x.equals(y):"+x.equals(y));}public static void sop(String str){System.out.println(str);}}

----------android培训java培训、期待与您交流!----------

  详细请查看:http://edu.csdn.net/heima/

原创粉丝点击