Java中的String,StringBuilder,StringBuffer三者的区别

  • String
    Java中的String,StringBuilder,StringBuffer三者的区别_第1张图片
    通过api可以看到String是字符串常量,常量是不可以被修改的,所以String对象一旦被创建是不能改变的,但是下面的代码明明改变了,其实这只是一种假象。jvm实际上是这样解析的:先在字符串常量池创建一个对象str赋值asd,然后在创建个对象赋值asdas第一个str就会垃圾回收机制回收,所以String对象一旦被创建是不能改变,java String对象实际上是一个不断被创建然后被回收的过程。所以其执行速度是最慢的,但是不可变也注定其线程是安全的。
package demo3;

public class StringDemo {

    public static void main(String[] args) {
        String str = "asd";
        System.out.println(str);
        str = str+"as";
        System.out.println(str);
    }
}

package demo3;


public class StringBufferDemo {
    public static void main(String[] args) {
      String str = "hello,world";
      StringBuffer sb = new StringBuffer("你好,世界");
      str.replace('h','H');
      System.out.println(str);

    sb.replace(0,2,"hello");
        System.out.println(sb);
        
    }
}

通过代可以直观的看出String为常量

  • StringBuilder和StringBuffer
    StringBulider和StringBuffer的对象是变量,对变量进行操作就是直接改变变量的值,而不进行创建回收,所以速度要比String快的多。
    二者之间的区别就在于线程安全上:
    StringBuffer:线程安全的可以被多个线程安全使用,其方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,
    StringBuilder:线程不安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。 因此其速度也是最快的

总结:

  1. 三者在执行速度方面的比较:StringBuilder > StringBuffer > String
  2. String:字符串常量 如果要操作少量的数据用 = String
  3. StringBuffer:字符串变量 如果要操作少量的数据用 = String
  4. StringBuilder:字符串变量 如果要操作少量的数据用 = String

String方法使用

package demo3;

public class StringDemo {

    public static void main(String[] args) {

        //String类的构造方法
        byte[] a = {'1','2','3'};
        char[] c = {'1','2'};
        String c1 = new String(c);      //将字符数组转换成字符串
        String a1 = new String(a);      //将byte数组转换成字符串
        String s1 = new String(new StringBuffer("wwe"));//将StringBuffer或StringBuilder转换成字符串

        //具体方法

        System.out.println(a1.charAt(1));  //返回字符串指定索引出的值
        System.out.println(a1.compareTo("a"));//按照按字典顺序比较两个字符串。返回两个字符串中第一个不同的字符的ascII码差值。 不同于equals
        System.out.println(a1.concat("232")); //jiang指定的字符串连接到字符串的尾部
        System.out.println(a1.contains("123"));//判断是否含指定的字符串
        System.out.println(a1.endsWith("23")); //测试字符串是否已指定的字符结尾
        System.out.println(a1.equals("123"));  //将此字符串与指定对象进行比较。

        System.out.println(String.format("%s",a1));//类似于c语言 将字符串进行格式化

        char[] c4 = new char[12];
        a1.getChars(1,3,c4,0);  //将此字符串中的字符复制到目标字符数组中
        for (char c0:c4) {
            System.out.println(c0);
        }

        System.out.println(a1.length());//返回指定字符串的长度、

        System.out.println(a1.replaceAll(a1,"dfg")); //替换字符串中的值
        System.out.println(a1.replace('1','0'));//替换指定字符
        String sp = "a|b|c";
        for (String s : sp.split("\\|")) {   //字符分割 注意特殊字符转义
            System.out.println(s);
        }

        char[] c5 = a1.toCharArray(); //将字符串转换成数组
        a1.toUpperCase(); //转换成大写
        a1.trim(); //去掉空格
        String.valueOf(1); //将参数转换为字符串
        
    }
}

StringBuffer

package demo3;


public class StringBufferDemo {
    public static void main(String[] args) {
        StringBuffer stringBuffer = new StringBuffer("梵蒂冈"); //初始容量为16个字符
        System.out.println(stringBuffer);
        System.out.println(stringBuffer.capacity());  //所以这里输出的是19
        System.out.println(stringBuffer.append("fds"));
        System.out.println(stringBuffer.delete(3,4)); //删除此序列的子字符串中的字符。
        System.out.println(stringBuffer.insert(3,"f")); //将字符串插入到此字符序列中
        System.out.println(stringBuffer.reverse());//反转
        stringBuffer.setCharAt(0,'x');//设置指定索引出的值
        System.out.println(stringBuffer);
    }
}

你可能感兴趣的:(基础语法)