zoukankan      html  css  js  c++  java
  • String、StringBuilder与StringBuffer的区别

    1.String类是public、final修饰的。

    在Java中,被final修饰的类是不允许被继承的,并且String它的成员方法都默认为final方法。

    查看源码得知,String类其实是通过char数组来保存字符串的。

    对所有的String对象操作都不是在原有的字符串上进行的,而是重新生成了一个新的字符串对象。

    也就是说进行这些操作后,最原始的字符串并没有被改变,String类是不可变类

    如果我们用String来操作字符串的时候,一旦我们字符串的值改变,就会在内存创建多一个空间来保存新的字符串,因此频繁操作String效率会很低

    对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象。

     1 package com.rong.se;
     2 
     3 public class UseString {
     4 
     5     /**
     6      * String操作
     7      * @author 容杰龙
     8      */
     9     public static void main(String[] args) {
    10         String string="rong-jie-long";
    11         //String重载很多构造方法,不列举。。。
    12         String str=new String("abc well");
    13         
    14         char ch = str.charAt(0);
    15         System.out.println(ch);
    16         int codePointAt = str.codePointAt(1);
    17         System.out.println(codePointAt);
    18         int codePointBefore = str.codePointBefore(1);
    19         System.out.println(codePointBefore);
    20         //相等返回0  比较大小
    21         int compareTo = str.compareTo("abc well");
    22         System.out.println(compareTo);
    23         int compareToIgnoreCase = str.compareToIgnoreCase("ABC WELL");
    24         System.out.println(compareToIgnoreCase);
    25         //类似+
    26         String concat = str.concat(string);
    27         System.out.println(concat);
    28         //以什么开始
    29         boolean endsWith = str.endsWith("ll");
    30         System.out.println(endsWith);
    31         boolean startsWith = str.startsWith("abc");
    32         System.out.println(startsWith);
    33         //包括索引位置为5的字符
    34         String substring = string.substring(5);
    35         System.out.println(substring);
    36         String[] split = string.split("-");
    37         for (String string2 : split) {
    38             System.out.println(string2);
    39         }
    40         //限制最多分成几段
    41         String[] split2 = string.split("-", 3);
    42         for (String string2 : split2) {
    43             System.out.println(string2);
    44         }
    45         //比较是否相等,区分大小写
    46         boolean equals = str.equals(string);
    47         System.out.println(equals);
    48         //比较是否相等,不区分大小写
    49         boolean equalsIgnoreCase = str.equalsIgnoreCase(string);
    50         System.out.println(equalsIgnoreCase);
    51         int length = str.length();
    52         System.out.println(length);
    53         // 。。。。。。。。。。。。。。。。。。
    54     }
    55 
    56 }

    2.StringBuilder不支持并发操作,线程不安全的,不适合多线程中使用,但其在单线程中的性能比StringBuffer高,是可变类

    任何对它所指代的字符串的改变都不会产生新的对象。

     1 package com.rong.se;
     2 
     3 public class TestStringBuilder {
     4 
     5     public static void main(String[] args) {
     6         //创建StringBuilder对象
     7         StringBuilder sb=new StringBuilder();
     8         StringBuilder stringBuilder=new StringBuilder("abcdefg");
     9         sb.append(123);
    10         sb.append("hhh");
    11         sb.append(3.14159265354);
    12         System.out.println(sb.toString());
    13         //////////////////////////////
    14         System.out.println(sb.charAt(3));
    15         //可变类, 操作后仍然是同一个对象,只是内容不一样
    16         sb.delete(0, 10);//左闭右开,可返回对象,同一个对象
    17         System.out.println(sb);
    18         //删除索引位置字符,可返回对象,同一个对象
    19         StringBuilder deleteCharAt = sb.deleteCharAt(0);
    20         System.out.println(sb);
    21         //true,同一个对象
    22         boolean b = sb.equals(deleteCharAt);
    23         System.out.println(b);
    24         //获取字符串首次出现的索引位置
    25         int indexOf = sb.indexOf("53");
    26         System.out.println(indexOf);
    27         //从索引位置第几个开始插入字符串,可插入多种类型数据
    28         sb.insert(3, "www");
    29         sb.insert(3, 123.123);
    30         System.out.println(sb.toString());
    31         int lastIndexOf = sb.lastIndexOf("12", 6);
    32         System.out.println(lastIndexOf);
    33         System.out.println(sb.length());
    34         //替换。左闭右开原则。
    35         StringBuilder replace = sb.replace(0, 3, "r");
    36         System.out.println(replace);
    37         //反转
    38         sb.reverse();
    39         System.out.println(sb);
    40         // 从索引位置第n个起(包含n),截取字符串,生成新的字符串!!!
    41         String substring = sb.substring(10);
    42         System.out.println(substring);
    43         //转成String
    44         String string = sb.toString();
    45         System.out.println(string);
    46         
    47         
    48     }
    49 
    50 }

    3.StringBuffer则是可变类是线程安全的,任何对它所指代的字符串的改变都不会产生新的对象。

     StringBuffer的操作与StringBuilder操作类似,基本相同。略。。。。。。

    总结:

    可变与不可变、线程安全与不安全、执行效率

    String直接相加字符串,效率很高,因为在编译器便确定了它的值,形如"a"+"b"+"c"; 的字符串相加,在编译期间便被优化;对于间接相加(包含字符串引用),形如s1+s2+s3; 效率要比直接相加低,因为在编译器不会对引用变量进行优化

    String、StringBuilder、StringBuffer三者的执行效率:StringBuilder > StringBuffer > String(相对而言)

         当字符串相加操作或者改动较少的情况下:String 

      当字符串相加操作较多的情况下:StringBuilder

      当程序采用了多线程:StringBuffer

  • 相关阅读:
    计算机注销、热启动、冷启动
    从高处理解android与服务器交互(看懂了做开发就会非常的容易)
    Android—Work—1day
    软件需求分析方法
    Android 常用控件的介绍
    android中Json的一些应用
    java数据传递例子+内存分析
    android中MVP模式
    android的四层体系结构,基于mvc三层结构浅析
    java
  • 原文地址:https://www.cnblogs.com/57rongjielong/p/7795139.html
Copyright © 2011-2022 走看看