字符串(String/StringBuffer/StringBuilder)

字符串比较:

  • ‘==’比较的是字符串的计算机存储位置是否同一个。
  • ‘equal’比较字符串值是否相等。
        String s1 = "TestString1";
        String s2 = "TeseString2";
        s1 = "TeseString2";
        //s1和s2都指向同一个地址空间,s1原来字符串丢失
        System.out.println(s1 == s2);  //true

        s1 = new String("TeseString2");
        //new操作是开辟一个新的地址空间,虽然内容一样,但是两个不同的字符串
        System.out.println(s1 == s2);  //false

字符串API:

int length();
char charAt(intdex);                  //返回指定字符串的下标
Boolean equals(String);
Boolean equalsIgnoreCase(String s);  //与equals作用相同,但不考虑字符串大小写
int compareTo(String s);             //如果该字符串与s相同则返回0,在字典序上小于s则返回-1,否则返回大于0
Boolean startsWith(String prefix);   //判读字符串是否以prefix开始
Boolean endsWith(String suffix);     //判读字符串是否以su结尾ffix
int indexOf(Strin4g str);             //返回str在字符串首次出现的位置,否则返回-1
String substring(int begin,int end); //返回begin到end-1中间字符串
String replace(char old,char new);   //new字符串替换old字符串
String t        String startString = "abcdefg";
     String reverseString = "";
     for(int i=startString.length()-1;i>=0;i--){
         reverseString+=startString.charAt(i);
     }
     System.out.println(reverseString);oLowerCase();
String toUpperCase();
String trime();                      //该字符串开头和结尾去点空格 
		//字符串返序
        String startString = "abcdefg";
        String reverseString = "";
        for(int i=startString.length()-1;i>=0;i--){
            reverseString+=startString.charAt(i);
        }
        System.out.println(reverseString);

格式化字符串

语法:str.format(String format,Object...args);

日期和时间格式化:

public class Test {
    public static void main(String[] args) {
        Date date = new Date();
        //将date进行格式化
        String year = String.format("%tY",date);  //4位年份
        String month = String.format("%tB",date); //指定语言环境的月份全称
        String day = String.format("%td",date);   //一个月的第几天
        System.out.println("今年是:"+year);
        System.out.println("现在是:"+month);
        System.out.println("今天是:"+day);
    }
}

常用日期格式化转换符:

时间格式化转换符:

常规转换符:

StringBuffer类

StringBuffer是个可变的字符串序列,他的长度和组成元素是可变的。

//初始化一个StringBuffer
StringBuffer bs = new StringBuffer("Stringbuffer");

//实际上String + 是用StringBuffer实现的
String first = "比尔";
String last = "盖茨";
String name = first + " " + last;

//相当于
StringBuffer tempbf = new StringBuffer(first);
tempsf.append(last);
String name = tempsf.toString();

StringBuffer(StringBuilder)常用API

Append(type t);
Insert(int pos,type t);				//pos出插入t,t可以为任何类型
delete(int start,int end);
deleteCharAt(int pos);
setCharAt(int pos,char ch);			//设置pos出的字符串为ch
replace(int start,int end, String str);   
int length();
String toString();                        //将StringBuffer作为字符串返回

字符串生成器

String对象其长度是固定的,内容不可改变,虽然使用“+”可以附加新字符串,但是新生成的字符串都会在内存创建新的字符串对象。如果重复对字符串进行修改,将极大的增加系统开销。这个时候考虑用可变字符序列StringBuilder。

验证String和Stringbuilder的效率问题:

public class Test {
    public static void main(String[] args) {
        String str = "";
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            str = str + i;                  //每追加一个字符串就是在内存新创建一个字符串对象
        }
        long endTime = System.currentTimeMillis();
        long time = endTime - startTime;    //执行的时间差,即时间开销
        System.out.println("String 消耗的时间是:" + time);

        StringBuilder builder = new StringBuilder("");
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            builder.append(i);             //循环追加字符串,都是同一个字符串对象
        }
        endTime = System.currentTimeMillis();
        time = endTime - startTime;        //StringBuilder的时间开销
        System.out.println("StringBuilder消耗的时间是:" + time);
    }
}

String 消耗的时间是:7
StringBuilder消耗的时间是:0

两次操作的操作存在一定的差距(jdk1.8 String相加得到了优化,如例所示,1000次相加差距也并不大),如果在程序中频繁的附加字符串,可以使用StringBuilder。新创建的StringBuilder对象初始容量是16个字符,可以自行指定初始长度。如果附加的字符超过可容纳的长度,则StringBuilder将自动增加长度以容纳附加的字符。若要输出字符串结果可以使用toString()方法。

什么时候用?

String包含的字符串是不能改变的,StringBuffer(StringBuilder)类型变量是可变的,所以使用遵循原则:

  • 如果需要对字符串进行添加或删除工作,选择StringBuffer类。
  • 如果要保证字符串稳定,选择String类。

StringBuffer 和 StringBuilder 的区别

都是继承 AbstractStringBuilder ,StringBuffer 的方法都是有关键字 synchronized修饰,所以是线程线程安全的,StringBuilder是非线程安全

原文地址:https://www.cnblogs.com/sanzashu/p/11156132.html