zoukankan      html  css  js  c++  java
  • JavaSE学习笔记(十三)—— StringBuffer

    一、StringBuffer概述

      String和StringBuffer他们都可以存储和操作字符串,即包含多个字符的字符串数据。不同的是String类是字符串常量,是不可更改的常量,这时因为String底层使用了一个不可变的字符数组(final char[])。

      

      而StringBuffer是字符串变量,它的对象是可以扩充和修改的,因为它底层使用的是可变的字符数组(char[] value;)

      由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作使用StringBuffer要更加适合一些。  

      在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。

      另外由于StringBuffer是线程安全的,关于线程的概念后续有专门的章节进行介绍,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。

    二、StringBuffer的构造方法

    • public StringBuffer():无参构造方法,其初始容量为 16 个字符。
    • public StringBuffer(int capacity):指定容量的字符串缓冲区对象
    • public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
    public class StringBufferDemo {
        public static void main(String[] args) {
            // public StringBuffer():无参构造方法
            StringBuffer sb = new StringBuffer();
            System.out.println("sb:" + sb);
            // public int capacity():返回当前容量。    理论值
            System.out.println("sb.capacity():" + sb.capacity());//16
            // public int length():返回长度(字符数)。 实际值
            System.out.println("sb.length():" + sb.length());//0
            System.out.println("-----------------");
    
            // public StringBuffer(int capacity):指定容量的字符串缓冲区对象
            StringBuffer sb2 = new StringBuffer(50);
            System.out.println("sb2:"+sb2);
            System.out.println("sb2.capacity:" + sb2.capacity());//50
            System.out.println("sb2.length():" + sb2.length());//0
            System.out.println("---------------");
    
            // public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
            StringBuffer sb3 = new StringBuffer("hello");
            System.out.println("sb3:" + sb3);//hello
            System.out.println("sb3.capacity:" + sb3.capacity());//21
            System.out.println("sb3.length:" + sb3.length());//5
        }
    }

    三、StringBuffer的添加功能

    • public StringBuffer append(String str):可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
    • public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
    public class StringBufferDemo {
        public static void main(String[] args) {
            // 创建字符串缓冲区对象
            StringBuffer sb = new StringBuffer();
            // public StringBuffer append(String str)
            // StringBuffer sb2 = sb.append("hello");
            // System.out.println("sb:" + sb);//hello
            // System.out.println("sb2:" + sb2);//hello
            // StringBuffer在进行字符串处理时,不生成新的对象
            // System.out.println(sb == sb2);//true
    
            // 一步一步的添加数据
            // sb.append("hello");
            // sb.append(true);
            // sb.append(12);
            // sb.append(34.56);
    
            // 链式编程
            sb.append("hello").append(true).append(12).append(34.56);
            System.out.println("sb:" + sb);//hellotrue1234.56
    
            // public StringBuffer insert(int offset,String str):
            // 在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
            sb.insert(5, "word");
            System.out.println("sb:" + sb);//hellowordtrue1234.56
        }
    }

    四、StringBuffer的删除功能

    • public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
    • public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身
    public class StringBufferDemo {
        public static void main(String[] args) {
            // 创建对象
            StringBuffer sb = new StringBuffer();
    
            // 添加功能
            sb.append("hello").append("word").append("java");
            System.out.println("sb:" + sb);
    
            // public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
            // 需求:我要删除e这个字符,肿么办?
            // sb.deleteCharAt(1);
    
            // public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身
            // 需求:我要删除world这个字符串,肿么办?
            // sb.delete(5, 10);
    
            // 需求:我要删除所有的数据
            sb.delete(0, sb.length());
    
            System.out.println("sb:" + sb);
        }
    }

    五、StringBuffer的替换功能

      public StringBuffer replace(int start,int end,String str):从start开始到end用str替换

    public class StringBufferDemo {
        public static void main(String[] args) {
            // 创建字符串缓冲区对象
            StringBuffer sb = new StringBuffer();
    
            // 添加数据
            sb.append("hello").append("word").append("java");
            System.out.println("sb:" + sb);
    
            // public StringBuffer replace(int start,int end,String str):从start开始到end用str替换
            // 需求:我要把world这个数据替换为"节日快乐"
            sb.replace(5, 10, "节日快乐");
            System.out.println("sb:" + sb);
        }
    }

    六、StringBuffer的反转功能

      public StringBuffer reverse():将此字符序列用其反转形式取代

    public class StringBufferDemo {
        public static void main(String[] args) {
            // 创建字符串缓冲区对象
            StringBuffer sb = new StringBuffer();
    
            // 添加数据
            sb.append("霞青林爱我");
            System.out.println("sb:" + sb);
    
            // public StringBuffer reverse()
            sb.reverse();
            System.out.println("sb:" + sb);
        }
    }

    七、StringBuffer的截取功能

    • public String substring(int start):返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
    • public String substring(int start,int end):返回一个新的 String,它包含此序列当前所包含的字符子序列。

      注意:返回值类型不再是StringBuffer本身了

    public class StringBufferDemo {
        public static void main(String[] args) {
            // 创建字符串缓冲区对象
            StringBuffer sb = new StringBuffer();
    
            // 添加数据
            sb.append("hello").append("world").append("java");
            System.out.println("sb:" + sb);//helloworldjava
    
            // 截取功能
            // public String substring(int start)
            String s = sb.substring(5);
            System.out.println("s:" + s);//worldjava
            System.out.println("sb:" + sb);//helloworldjava
    
            // public String substring(int start,int end)
            String ss = sb.substring(5, 10);
            System.out.println("ss:" + ss);//world
            System.out.println("sb:" + sb);//helloworldjava
        }
    }

    八、String和StringBuffer的相互转换

      为什么我们要讲解类之间的转换?

      A -- B的转换:我们把A转换为B,其实是为了使用B的功能。

      B -- A的转换:我们把B重新转回来A,因为我们可能要的结果是A类型,所以还得转回来。

    public class StringBufferTest {
        public static void main(String[] args) {
            // String → StringBuffer
            String s = "hello";
            // 注意:不能把字符串的值直接赋值给StringBuffer
            // StringBuffer sb = "hello";
            // StringBuffer sb = s;
    
            // 方式1:通过构造方法
            StringBuffer sb = new StringBuffer(s);
    
            // 方式2:通过append()方法
            StringBuffer sb2 = new StringBuffer();
            sb2.append(s);
            System.out.println("sb:" + sb);//hello
            System.out.println("sb2:" + sb2);//hello
            System.out.println("-----------");
    
            // StringBuffer → String
            StringBuffer buffer = new StringBuffer("java");
            // String(StringBuffer buffer)
            // 方式1:通过构造方法
            String str = new String(buffer);
    
            // 方式2:通过toString()方法
            String str2 = buffer.toString();
            System.out.println("str:" + str);//java
            System.out.println("str:" + str2);//java
        }
    }

    【练习】

      把数组拼接成一个字符串

    public class StringBufferTest2 {
        public static void main(String[] args) {
            // 定义一个数组
            int[] arr = { 44, 33, 55, 11, 22 };
    
            // 定义功能
            // 方式1:用String做拼接的方式
            String s1 = arrayToString(arr);
            System.out.println(s1);
    
            // 方式2:用StringBuffer做拼接的方式
            String s2 = arrayToString2(arr);
            System.out.println(s2);
        }
    
        /**
         * 用StringBuffer做拼接的方式
         * @param arr
         * @return
         */
        public static String arrayToString2(int[] arr) {
            StringBuffer sb = new StringBuffer();
            sb.append("[");
            for (int x = 0; x < arr.length; x++) {
                if (x == arr.length - 1) {
                    sb.append(arr[x]);
                } else {
                    sb.append(arr[x]).append(",");
                }
            }
            sb.append("]");
            return sb.toString();
        }
    
    
        /**
         * 用String做拼接的方式
         * 这种方式会浪费很多常量字符串值,效率会很低
         * @param arr
         * @return
         */
        public static String arrayToString(int[] arr) {
            String s = "";
            s += "[";
            for (int x = 0; x < arr.length; x++) {
                if (x == arr.length - 1) {
                    s += arr[x];
                } else {
                    s += arr[x];
                    s += ",";
                }
            }
            s += "]";
            return s;
        }
    }

      把字符串反转

    public class StringBufferTest3 {
        public static void main(String[] args) {
            // 键盘录入数据
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入数据:");
            String s = sc.nextLine();
    
            // 方式1:用String做拼接
            String s1 = myReverse(s);
            System.out.println("s1:" + s1);
    
            // 方式2:用StringBuffer的reverse()功能
            String s2 = myReverse2(s);
            System.out.println("s2:" + s2);
    
        }
    
        /**
         * 用StringBuffer的reverse()功能
         * @param s
         * @return
         */
        public static String myReverse2(String s) {
            return new StringBuffer(s).reverse().toString();
        }
    
        /**
         * 用String做拼接
         * @param s
         * @return
         */
        public static String myReverse(String s) {
            String result = "";
    
            char[] chs = s.toCharArray();
            for (int x = chs.length - 1; x >= 0; x--) {
                result += chs[x];
            }
    
            return result;
        }
    }

      判断一个字符串是否是对称字符串。例如"abc"不是对称字符串,"aba"、"abba"、"aaa"、"mnanm"是对称字符串

    public class StringBufferTest4 {
        public static void main(String[] args) {
            // 创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入一个字符串:");
            String s = sc.nextLine();
    
            // 一个一个的比较
            boolean b = isSame(s);
            System.out.println("b:" + b);
    
            //用字符串缓冲区的反转功能
            boolean b2 = isSame2(s);
            System.out.println("b2:" + b2);
        }
    
        public static boolean isSame2(String s) {
            return new StringBuffer(s).reverse().toString().equals(s);
        }
    
        public static boolean isSame(String s) {
            boolean flag = true;
    
            // 把字符串转成字符数组
            char[] chs = s.toCharArray();
            for (int start = 0, end = chs.length - 1; start <= end; start++, end--) {
                if (chs[start] != chs[end]) {
                    flag = false;
                    break;
                }
            }
            return flag;
        }
    }

    九、常见问题

    【String、StringBuffer、StringBuilder的区别】

      String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的。

      StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高

    【StringBuffer和数组的区别】

      二者都可以看出是一个容器,装其他的数据。但是呢,StringBuffer的数据最终是一个字符串数据。而数组可以放置多种数据,但必须是同一种数据类型的。

    【String和StringBuffer作形式参数】

      基本类型:形式参数的改变不影响实际参数
      引用类型:形式参数的改变直接影响实际参数

    public class StringBufferDemo {
        public static void main(String[] args) {
            String s1 = "hello";
            String s2 = "world";
            System.out.println(s1 + "---" + s2);// hello---world
            change(s1, s2);
            System.out.println(s1 + "---" + s2);// hello---world
    
            StringBuffer sb1 = new StringBuffer("hello");
            StringBuffer sb2 = new StringBuffer("world");
            System.out.println(sb1 + "---" + sb2);// hello---world
            change(sb1, sb2);
            System.out.println(sb1 + "---" + sb2);// hello---worldworld
        }
    
        public static void change(StringBuffer sb1, StringBuffer sb2) {
            sb1 = sb2;
            sb2.append(sb1);
        }
    
        public static void change(String s1, String s2) {
            s1 = s2;
            s2 = s1 + s2;
        }
    }

      注意:

      String作为参数传递,效果和基本类型作为参数传递是一样的。因为字符串是常量值。

      StingBuffer作为参数传递时,在方法中直接赋值不改变实际结果,如果是调用方法操作内容时,结果会发生变化。

  • 相关阅读:
    Trachtenberg(特拉亨伯格)速算系统
    English Conversations You Can Download for Free (Spoken English MP3/Audio Files)
    rel=nofollow 是什么意思
    移动端 触摸事件 ontouchstart、ontouchmove、ontouchend、ontouchcancel
    <mate name="viewport">移动端设置详解
    jquery简单实现tab选项卡效果
    PHP new StdClass()创建空对象
    PHP可变函数
    jQuery中this与$(this)的区别实例
    jQuery给动态添加的元素绑定事件的方法
  • 原文地址:https://www.cnblogs.com/yft-javaNotes/p/10849433.html
Copyright © 2011-2022 走看看