字符串(String/StringBuffer/StringBuilder)

本文围绕Java字符串处理展开,介绍了字符串比较方式,如‘==’和‘equal’的区别;阐述了字符串API及格式化方法。还讲解了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);
    }
}

常用日期格式化转换符:

1565476-20190709112030437-544157589.png

时间格式化转换符:

1565476-20190709112046955-414712333.png

常规转换符:

1565476-20190709112052832-1199144183.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值