zoukankan      html  css  js  c++  java
  • Java

    StringBuilder

    一、 

    1.所属的包:java.lang包
    2.继承AbstractStringBuilder,间接继承Object 
        实现接口Serializable,CharSequence,Appendable
        StringBuffer/StringBuilder没有compareTo方法
        StringBuffer/StringBuilder含有一个String没有的方法:append(),用来拼接
     3.特性
        是一个可变字符串   char[] value(String 是不可变的  private final char[] value), 可以进行动态扩容

       如果返回类型为StringBuilder则不需要新建一个 来接收结果

    4.对象的构建

    public class TestStringBuilder {
        public static void main(String[] args){
            //无参数构造方法,构建一个默认长度16个空间的对象  char[]
            StringBuilder stringBuilder = new StringBuilder();
            //带String类型参数的构造方法,构建一个默认长度为   字符串长+16  的空间的对象
            StringBuilder stringBuilder1 = new StringBuilder("abc");
            //利用给定的参数 构建一个自定义长度空间的对象 char[]
            StringBuilder stringBuilder2 = new StringBuilder(4);
        }
    }

    5.StringBuilder常用的方法

    (1)  StringBuilder = append();//拼接字符串  频繁的拼接字符串的时候使用此方法  效率远远高于 “+” 与 concat()

    public class TestStringBuilder {
        public static void main(String[] args){
            String str = "a";
            long time1 = System.currentTimeMillis();
            for(int i=1;i<=100000;i++){
                str = str.concat("a"); //2242ms
            }
            long time2 = System.currentTimeMillis();
            System.out.println(time2-time1);
    
            StringBuilder builder = new StringBuilder("a");//17
            long time3 = System.currentTimeMillis();
            for(int i=1;i<=100000;i++){
                 builder.append("a");//因为返回类型为StringBuilder 所以可以不用接返回值
                //4ms
            }
            long time4 = System.currentTimeMillis();
            System.out.println(time4-time3);
        }
    }

    (2)  int  =  capacity();   // 获取字符串char[]的容量空间  

        int = length();  //获取字符串有效元素个数

       void = setLength(int newLength);  //设置字符串有效元素个数

    public class TestStringBuilder {
        public static void main(String[] args){
            StringBuilder stringBuilder = new StringBuilder("abc");//总长度为3+16 有效元素为3个
            System.out.println(stringBuilder.length());//3
            System.out.println(stringBuilder.capacity());//19
            stringBuilder.setLength(4);//设置有效元素为4个
            System.out.println(stringBuilder.length());//4
            System.out.println(stringBuilder.capacity());//19
        }
    }
    输出结果:
    3
    19
    4
    19

    (3)    char = charAt(int index);  //获取索引位置的字符

       int = codePointAt(int index); //获取索引位置字符的code码

        setCharAt(int index, char ch) //将index位置的字符改成给定的value

    (4)    StringBuilder = delete(int start, int end);   //StringBuilder类中独有的方法,删除start至end之间的字符,不用接受返回值

       StringBuilder = deleteCharAt(int index);  //StringBuilder类中独有的方法,将给定的index位置的字符删除

    public class TestStringBuilder {
        public static void main(String[] args){
                StringBuilder stringBuilder = new StringBuilder("0123456");
                stringBuilder.delete(0,3);//删除[0,3)索引位置元素  不需要接收返回值
                System.out.println(stringBuilder);
            StringBuilder stringBuilder1 = new StringBuilder("0123456");
            stringBuilder1.deleteCharAt(0);//删除0索引位置元素   不需要接收返回值
            System.out.println(stringBuilder1);
        }
    }
    输出结果:
    3456
    123456

    (5)  int = indexOf(String str);    int = indexOf(String str, int fromIndex);   //找寻给定的str在字符串中第一次出现的索引位置

          int = lastIndexOf(String str);     int = lastIndexOf(String str, int fromIndex);   //从后向前找寻

    public class TestStringBuilder {
        public static void main(String[] args){
            StringBuilder stringBuilder = new StringBuilder("012343210");
            System.out.println(stringBuilder.indexOf("1"));//1
            System.out.println(stringBuilder.indexOf("1",2));//7
            System.out.println(stringBuilder.lastIndexOf("1"));//7
            System.out.println(stringBuilder.lastIndexOf("1",6));//1
        }
    }
    输出结果:
    1
    7
    7
    1

    (6)  StringBuilder  =  reverse();  //字符串反转

    public class TestStringBuilder {
        public static void main(String[] args){
                StringBuilder stringBuilder = new StringBuilder("nba");
                stringBuilder.reverse();
            System.out.println(stringBuilder);
        }
    }
    输出结果
    abn

    (7)  StringBuilder  = insert(int offset, char c); //将给定字符插在offset索引位置  

    public class TestStringBuilder {
        public static void main(String[] args){
                StringBuilder stringBuilder = new StringBuilder("nba");
                stringBuilder.insert(0,"NBA");
            System.out.println(stringBuilder);
        }
    }
    输出结果
    NBAnba

    (8)  StringBuilder = replace(int start, int end, String str);  //将 [start,end)位置替换为str

    public class TestStringBuilder {
        public static void main(String[] args){
                StringBuilder stringBuilder = new StringBuilder("NBA");
                stringBuilder.replace(0,1,"CBA");
            System.out.println(stringBuilder);
        }
    }
    输出结果:
    CBABA

    (9)   String = substring(int start); String = substring(int start, int end)  //截取索引 [start,end) 的字符

    public class TestStringBuilder {
        public static void main(String[] args){
            StringBuilder stringBuilder = new StringBuilder("0123456");
            System.out.println(stringBuilder.substring(2));
            System.out.println(stringBuilder.substring(2,4));
        }
    }
    输出结果:
    23456
    23

    (10)  String = toString(); //将StringBuilder对象 构建成一个string对象 返回

    (11)  trimToSize(); //将数组中无用的容量去掉  变成length长度的数组

    public class TestStringBuilder {
        public static void main(String[] args){
            StringBuilder stringBuilder = new StringBuilder("012345");
            System.out.println(stringBuilder.length());//6
            System.out.println(stringBuilder.capacity());//22
            stringBuilder.append(" ");
            stringBuilder.trimToSize();//012345" "
            System.out.println(stringBuilder.length()); //7
            System.out.println(stringBuilder.capacity());//7
        }
    }
    输出结果:
    6
    22
    7
    7

    二、总结:

    1.StringBuilder类不一定需要   是为了避免String频繁拼接修改字符串信息的时候才用的
        底层数组是可变的  提高了性能
     2.常用方法
        与String类不同的独有方法
          append()  insert()  delete()  deleteCharAt()  reverse()
        与String类相同的方法
          length() charAt() codePointAt() indexOf() lastIndexOf()
          substring() replace()名字相同 用法不一致
        不是很常用的方法
          ensureCapacity() capacity() setLength() trimToSize(); setCharAt();
     3.String家族笔试中经常容易考察的知识点
        1.String所属的包 继承关系 实现接口
           java.lang 继承Object 接口Serializable,CharSequence,Comparable
        2.String构建方式
           常量  构造方法 
        3.String对象内存结构
           字符串常量区  new堆内存对象
           ==  equals()区别
           "a"+"b"+"c"
        4.String不可变特性
           长度及内容
        5.String中的常用方法---与StringBuilder的区别
           concat();  toUpperCase();
        6.String和StringBuilder区别   |   String和StringBuffer区别
           String不可变字符串
                 JDK1.0
                 有一个接口Comparable
                 不可变体现在长度及内容
                 有一些方法StringBuilder没有 concat  compareTo  toUpperCase
           StringBuilder可变字符串
                JDK1.5
               有一个接口Appendable
              可变字符串  没有final修饰  底层可以进行数组扩容
              有一些方法String没有  append() insert() delete() reverse()
      7.StringBuffer和StringBuilder的不同
         StringBuffer早期版本1.0
         StringBuilder后来的版本1.5
         早期版本  线程同步       安全性比较高  执行效率相对较低
         后期版本  线程非同步    安全性比较低  执行效率相对较高

  • 相关阅读:
    2015第18周日
    CreateProcess的使用方法
    A ResourcePool could not acquire a resource from its primary factory or source
    ThreadPool.QueueUserWorkItem的性能问题
    Cucumber 入门一
    菜鸟版JAVA设计模式-从抽象与实现说桥接模式
    ServiceStack.Hello——跨平台.net REST api服务搭建
    android看不见main函数怎么办?程序异常了,能够不提示“xxx软件停止执行”吗?
    深入探讨this指针
    问卷星调查学生对《算法》教学的建议与反馈
  • 原文地址:https://www.cnblogs.com/yyanghang/p/11183979.html
Copyright © 2011-2022 走看看