String、StringBuffer、StringBuilder的区别

String:字符串常量 。
StringBuffer 与 StringBuilder是字符缓冲变量。
StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer中的方法大都采用了synchronized 关键字进行修饰,因此是线程安全的,而StringBuilder没有这个修饰,可以被认为是线程不安全的。StringBuilder 是在JDK1.5才加入的。jdk的实现中StringBuffer与StringBuilder都继承自AbstractStringBuilder。

 1、String类型的字符串对象是不可变的,一旦String对象创建后,包含在这个对象中的字符系列是不可以改变的,直到这个对象被销毁。

 2、StringBuilder和StringBuffer类型的字符串是可变的,不同的是StringBuffer类型的是线程安全的,而StringBuilder不是线程安全的

 3、如果是多线程环境下涉及到共享变量的插入和删除操作,StringBuffer则是首选。如果是非多线程操作并且有大量的字符串拼接,插入,删除操作则StringBuilder是首选。毕竟String类是通过创建临时变量来实现字符串拼接的,耗内存还效率不高,怎么说StringBuilder是通过JNI方式实现终极操作的。

 4、StringBuilder和StringBuffer的“可变”特性总结如下:
     (1)append,insert,delete方法最根本上都是调用System.arraycopy()这个方法来达到目的
     (2)substring(int, int)方法是通过重新new String(value, start, end - start)的方式来达到目的。因此,在执行substring操作时,StringBuilder和String基本上没什么区别。

总的来说,三者在执行速度方面的比较:StringBuilder > StringBuffer > String。
1.使用String类的场景:在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算。
2.使用StringBuffer类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。
3.使用StringBuilder类的场景:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,如SQL语句的拼装、JSON封装等。

StringBuilder是一个类,可以用来处理字符串,最简单的用法:

StringBuilder sb=new StringBuilder();
sb.Append("123");
sb.Append("456");
string str=sb.ToString();

最后得到的str字符串的值就是"123456",这种用法要比直接字符串相加效率高,比如:

string s1=“123”;
string s2=“456”;
string str=s1+s2;

得到的结果相同,但在处理大规模的字符串的时候第二种方法效率会变低。

String的substring方法

public String substring(int beginIndex)返回该字符串从beginIndex开始到结尾的子字符串
public String substring(int beginIndex, int endIndex)返回该字符串从beginIndex到endIndex结尾的子字符串

import java.util.*;
import java.lang.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String s = sc.nextLine();
            StringBuilder sb = new StringBuilder();
            sb.append(s);
            int size = s.length();
            int addZero = 8 - size % 8;
            while ((addZero > 0) && (addZero < 8)) {
                sb.append("0");
                addZero--;
            }
            String str1 = sb.toString();
            while(str1.length() > 0){
                System.out.println(str1.substring(0,8));
                str1 = str1.substring(8);
            }
        }
    }
}