java可变字符串类详细解析

java可变字符串类详细解析

可变字符串类(重点)

基本概念

  • 由于String类描述的字符串内容是个常量不可改变,当需要在Java代码中描述大量类似的字符串 时,只能单独申请和存储,此时会造成内存空间的浪费。
  • 为了解决上述问题,可以使用java.lang.StringBuilder类和java.lang.StringBuffer类来描述字符序 列可以改变的字符串,如:“ab”。
  • StringBuffer类是从jdk1.0开始存在,属于线程安全的类,因此效率比较低。
  • StringBuilder类是从jdk1.5开始存在,属于非线程安全的类,效率比较高。

StringBuilder类常用的构造方法

方法声明 功能介绍
StringBuilder() 使用无参方式构造对象,容量为16
StringBuilder(int capacity) 根据参数指定的容量来构造对象,容量为参数指定大小
StringBuilder(String str) 根据参数指定的字符串来构造对象,容量为:16+字符串长度
  • 构造方法的使用

    // 1.StringBuilder的常用构造方法
            // 2.无参构造
            StringBuilder sb = new StringBuilder();
            // 打印无参构造中 可变字符串的长度
            System.out.println("sb = " + sb); // sb =
            System.out.println("字符串的长度是 " + sb.length()); // 0
            System.out.println("容量是 " + sb.capacity()); // 默认为 16
    
            // 3.传入一个整数类型的数据
            sb = new StringBuilder(32);
            System.out.println("sb = " + sb); // sb =
            System.out.println("字符串的长度是 " + sb.length()); // 0
            System.out.println("容量是 " + sb.capacity()); // 32
    
            // 4.传入字符串类型 并打印容量
            sb = new StringBuilder("hello world    ");
            System.out.println("sb = " + sb); // hello world
            System.out.println("字符串的长度是 " + sb.length()); // 15
            System.out.println("容量是 " + sb.capacity()); // 15 + 16 = 31
        }
    

StringBuilder类常用的成员方法

方法声明 功能介绍
int capacity() 用于返回调用对象的容量
int length() 用于返回字符串的长度,也就是字符的个数
StringBuilder insert(int offset, String str) 插入字符串并返回调用对象的引用,就是自 己。
StringBuilder append(String str 追加字符串
StringBuilder deleteCharAt(int index) 将当前字符串中下标为index位置的单个字符 删除
StringBuilder delete(int start,int end) 删除字符串
StringBuilder replace(int start,int end, String str) 替换字符串
StringBuilder reverse() 字符串反转
  • 常用方法演示

    public static void main(String[] args) {
          
          
        	StringBuilder sb = new StringBuilder("hello world ");
    		// 5.StingBuilder 常用方法 以下方法的返回值均是StingBuilder的类型
            sb.insert(0, "hello ");
            System.out.println(sb); // hello hello world
            System.out.println(sb.length());  // 18
            System.out.println(sb.capacity()); // 28
            // 6.向StingBuilder 追加 java
            sb.append(" java");
            System.out.println(sb);
            System.out.println(sb.length()); // 23
            System.out.println(sb.capacity()); // 28
    
            // 7.删除StingBuilder中 hello 字符串
            sb.delete(0,"hello ".length());
            System.out.println(sb); // hello world  java
            System.out.println(sb.length()); // 17
            System.out.println(sb.capacity()); // 28
    
            // 8.删除StingBuilder中 h 字符
            int pos = sb.indexOf("h");
            sb.deleteCharAt(pos);
            System.out.println(sb);
            System.out.println(sb.length()); // 16
            System.out.println(sb.capacity()); // 28
            
            // 9.替换字符串 将ello 替换为 hello
            sb.replace(sb.indexOf("e"),"ello".length(),"hello");
            System.out.println(sb);
            System.out.println(sb.length()); // 17
            System.out.println(sb.capacity()); // 28
            // 10.字符串倒置
            sb.reverse();
            System.out.println(sb); // avaj  dlrow olleh
            System.out.println(sb.length()); // 17
            System.out.println(sb.capacity()); // 28
    }
    
  • 注意

    1. 作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder会改变其值。

    2. 自动扩容算法是 原始容量 * 2 + 2 = 扩容容量 源码内有移位运算符 >> 1 相当于 除 2 << 1 相当于乘 2

    3. 考点三:String、StringBuilder、StringBuffer之间效率谁高?排列如何?

      String < StringBuffer < StringBuilder

返回值的设计

  • StringBuilder的很多方法的返回值均为StringBuilder类型。这些方法的返回语句均为:return this。
  • 由此可见,这些方法在对StringBuilder所封装的字符序列进行改变后又返回了该对象的引用。基 于这样设计的目的在于可以连续调用。

Guess you like

Origin blog.csdn.net/Junsunnyl/article/details/119769885