zoukankan      html  css  js  c++  java
  • 字符串(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是非线程安全

  • 相关阅读:
    4.关于QT中的QFile文件操作,QBuffer,Label上加入QPixmap,QByteArray和QString之间的差别,QTextStream和QDataStream的差别,QT内存映射(
    PlSql加入数据库链接
    UserScan的处理流程分析
    第八十八题(金山笔试题,字符串移动)
    4Sum_leetCode
    LeetCode Add Binary
    Hibernate or JPA Annotation中BLOB、CLOB注解写法
    配置Nginx防止直接用IP訪问Webserver
    Java集合系列之TreeMap源代码分析
    使用Application Loader上传APP流程解读[APP公布]
  • 原文地址:https://www.cnblogs.com/sanzashu/p/11156132.html
Copyright © 2011-2022 走看看