首页 > 技术文章 > JAVA之再初识七

hzau-xpgao 2020-11-07 16:09 原文

本篇博客将介绍中的String类,分为以下几个问题:

1、选取几个String与StringBuffer的常用API,并编写实例测试API的功能。

2、简述String、StringBuffer、StringBuilder三者之间的共同点与区别,应该分别在何种场景下使用

3、为什么不建议在for循环中使用“+”进行字符串的拼接

4、什么是字符串的编码与解码

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

问题1:

  首先要明确String类、StringBuffer类,StringBuilder类是在java.lang语言包中

        String类常用API功能介绍:

            1、String初始化 

                String str=new String("JAVA");
                String str="JAVA";

     上述语句可以实现String类对象的初始化,但两条语句不能同时出现,因为String的特点是一旦赋值,便不能更改其指向的字符对象,

即只能指向最初指向的对象。

                  2、返回 char指定索引处的值

                调用方法为:
                    char a= str.charAt(index);
                    其中index为索引值

     3、字符串的截取

           调用方法:String substring(int beginIndex, int endIndex);
          返回的字符串从beginIndex到endIndex-1          String str1=new String("JAVAAPI");                System.out.println(str1.substring(0, 4));

  

        StringBuffer类常用API功能介绍:

     1、StringBuffer初始化

                   StringBuffer str=new StringBuffer("JAVAAPI");
                   StringBuffer str="JAVAAPI";

                  上述红色代码会编译出错,StringBuffer类不支持这种写法。

     2、字符串的插入

                  调用方法:StringBuffer   insert(int offset, String str)   offset表示插入位置,str表示插入内容
                  StringBuffer str=new StringBuffer("JAVAAPI");
                      str.insert(1, "C++");

                  3、字符串的删除

             调用方法: StringBuffer  delete(int start, int end)
                     删除strat到end-1之间的字符串
                              StringBuffer str=new StringBuffer("JAVAAPI");
                              str.delete(2, 5);
                              System.out.println(str);  

                    打印的结果为”JAPI“

  

  StringBuilder类常用API功能介绍:

     1、StringBuilder初始化

                   StringBuilder str=new StringBuilder("JAVAAPI");
                   StringBuilder str="JAVAAPI";

                  上述红色代码编译同样会出错,StringBuilder类也不支持这种写法。

        2、字符串的添加

            StringBuilder str=new StringBuilder("JAVAAPI");
            str.append("lang");
            System.out.println(str);
            在末尾添加字符串"lang"

     上述代码打印结果为:“JAVAAPIlang”

        3、返回指定子字符串第一次出现的字符串内的索引。

             调用方法:int    indexOf(String str, int fromIndex)
              StringBuilder str=new StringBuilder("JAVAAPIlang");
              System.out.println(str.indexOf("API"));
              返回子字符串首个字符的索引值

                   代码打印结果为“4”


 

问题2:

String类特点:

    String类代表字符串。Java程序中的所有字符串文字(例如"abc")都被实现为此类的实例。

     字符串不变;它们的值在创建后不能被更改。 

          字符串缓冲区支持可变字符串。因为String对象是不可变的,它们可以被共享。

          String类包括用于检查序列的各个字符的方法,用于比较字符串,搜索字符串,提取子字符串以及创建将所有字符翻译为大写或小写的字符串的副本。

StringBuffer类特点:   

     线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。

           字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。

           每个字符串缓冲区都有一个容量。 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。 如果内部缓冲区溢出,则会自动变大。         

           字符串连接是通过StringBuilder (或StringBuffer )类及其append方法实现的。

StringBuilder类特点:

     一个可变的字符序列。 此类提供与StringBuffer的API,但不保证同步。 此类设计用作简易替换为StringBuffer在正在使用由单个线程字符串缓冲区的地方(如通常是这种情况)。 在可能的情况下,建议使用这个类别优先于StringBuffer ,因为它在大多数实现中将更快。

   StringBuilder不能安全使用多线程。 

问题3:

    for中使用"+"进行字符串的拼接,没拼接一次字符串,就需要新创建一个对象,会降低效率。

这个问题,推荐一下大佬的解答:https://blog.csdn.net/u012045045/article/details/86523709

 

long t1 = System.currentTimeMillis();
//这里是初始字符串定义
for (int i = 0; i < 50000; i++) {
    //这里是字符串拼接代码
}
long t2 = System.currentTimeMillis();
System.out.println("cost:" + (t2 - t1));
我们使用形如以上形式的代码,分别测试下五种字符串拼接代码的运行时间。得到结果如下:
+ cost:5119
StringBuilder cost:3
StringBuffer cost:4
concat cost:3623
StringUtils.join cost:25726

 

(注:此处转载于CSDN-

问题4:

将unicode字符集转为本地字符集(如GB2312或GBK)的过程叫编码,反之叫解码。

 

package com;
import java.io.*;
public class Run
{  
  public static void printByteArray(String msg,byte[] t){
    System.out.println(msg+":");
    for(int i=0;i<t.length;i++){
      System.out.println(Integer.toHexString(t[i]));
    }
  }
  public static void printCharArray(String msg,char[] c){
    System.out.println(msg+":");
    for(int i=0;i<c.length;i++){
      System.out.println(Integer.toHexString(c[i]));
    }
  }
  public static void main(String[] args){
    try{
      String str = "中文";
      System.out.println(str);
      //unicode字符集中对"中文"二字的对应代码
      printCharArray("unicode",str.toCharArray());   
      //转为本地字符集GBK2312对应的代码
      byte[] b =str.getBytes("GB2312");
      printByteArray("GB2312",b);
      //转为ISO8859-1对应的代码,因为ISO8859-1是英文字符集,没有对应的汉字代码,所以转化错误
      byte[] m =str.getBytes("ISO8859-1");
      printByteArray("ISO8859-1",m);
    }
    catch(UnsupportedEncodingException e){
        System.out.println("没有相应的字符集!");
    }
  }  
}

上述代码运行结果为:

 

以上就是我对String类的一些理解,如有错误,欢迎指正!

 

推荐阅读