第二节、字符串的拼接与截取?

在项目开发过程中,在很多时候会用到字符串的截取和拼接,以帮助为我们得到我们想要的结果。

一、字符串拼接

1、使用+拼接字符串

在Java中,拼接字符串最简单的方式就是直接使用符号+来拼接。如:

   /*字符串拼接的几种方式*/
        String a = "窗前明月光";
        String b = "疑是地上霜";

        //使用+拼接字符串
        String ab =a+","+b+"。";
        System.out.println("+拼接后的:"+ab);

这里要特别说明一点,有人把Java中使用+拼接字符串的功能理解为运算符重载。其实并不是,Java是不支持运算符重载的。这其实只是Java提供的一个语法糖。每定义一个新的String就创建了一个新的对象。

2、使用String类中的方法concat方法 

如何实现的:

这段代码首先创建了一个字符数组,长度是已有字符串和待拼接字符串的长度之和,再把两个字符串的值复制到新的字符数组中,并使用这个字符数组创建一个新的String对象并返回。通过源码我们也可以看到,经过concat方法,其实是new了一个新的String,这也就呼应到前面我们说的字符串的不变性问题上了。

        String a = "窗前明月光";
        String b = "疑是地上霜";
 //使用String类中的concat方法
         //使用String类中的concat方法
        String co = a.concat(",").concat(b).concat("。");
        System.out.println("concat拼接后的:"+co);

3、使用StringBuffer可以方便的对字符串进行拼接 

   String a = "窗前明月光";
        String b = "疑是地上霜";
//使用StringBuffer拼接字符串
        StringBuffer buffer = new StringBuffer();
        buffer.append(a);
        buffer.append(",");
        buffer.append(b);
        buffer.append("。");
        System.out.println("StringBuffer拼接后的:"+buffer);

4、使用StringBuilder可以方便的对字符串进行拼接 

其用法和StringBuffer类似

   String a = "窗前明月光";
        String b = "疑是地上霜"; 
//使用StringBuilder拼接字符串
        StringBuilder sb = new StringBuilder();
        sb.append(a);
        sb.append(",");
        sb.append(b);
        sb.append("。");
        System.out.println("StringBuilder拼接后的:"+sb);

接下来我们看看StringBufferStringBuilder的实现原理。

String类类似,StringBuilder类也封装了一个字符数组,定义如下:

char[] value;

String不同的是,它并不是final的,所以他是可以修改的。另外,与String不同,字符数组中不一定所有位置都已经被使用,它有一个实例变量,表示数组中已经使用的字符个数,定义如下:

int count;

其append源码如下:

public StringBuilder append(String str) {
    super.append(str);
    return this;
}

该类继承了AbstractStringBuilder类,看下其append方法:

public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}

append会直接拷贝字符到内部的字符数组中,如果字符数组长度不够,会进行扩展。

StringBufferStringBuilder类似,最大的区别就是StringBuffer是线程安全的,看一下StringBufferappend方法。

public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

该方法使用synchronized进行声明,说明是一个线程安全的方法。而StringBuilder则不是线程安全的。


主要区别:StringBuffer是线程安全,StringBuilder则不是线程安全的(不能同步访问)

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。


以上就是比较常用的几种在Java中拼接字符串的方式,那么到底哪种更好用呢?为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接呢?

 字符串拼接全部测试代码如下

public class Main {

    public static void main(String[] args) {
        /*字符串拼接的几种方式*/
        String a = "窗前明月光";
        String b = "疑是地上霜";

        //使用+拼接字符串
        String ab =a+","+b+"。";
        System.out.println("+拼接后的:"+ab);

        //使用StringBuilder拼接字符串
        StringBuilder sb = new StringBuilder();
        sb.append(a);
        sb.append(",");
        sb.append(b);
        sb.append("。");
        System.out.println("StringBuilder拼接后的:"+sb);

        //使用String类中的concat方法
        String co = a.concat(",").concat(b).concat("。");
        System.out.println("concat拼接后的:"+co);

        //使用StringBuffer拼接字符串
        StringBuffer buffer = new StringBuffer();
        buffer.append(a);
        buffer.append(",");
        buffer.append(b);
        buffer.append("。");
        System.out.println("StringBuffer拼接后的:"+buffer);
    }
}

运行结果如下:

 二、字符串截取

示例代码如下:

public class Main {

    public static void main(String[] args) {
        /*--------------------------------字符串截取的几种方式----------------------------------------------*/
        String str = "窗前明月光,疑是地上霜。";
        //截取第n个字符
        String ns = str.substring(2);
        System.out.println("截掉前两位字符的内容:"+ns);
        //截取字符串的某个范围字符
        String fw =str.substring(0,3);
        System.out.println("截取字符串前三位的内容:"+fw);
        //截取字符串最后一个字符的问题
        String lastS =  str.substring(str.lastIndexOf(",")+1);
        System.out.println("截取最后一个,后的内容:"+lastS);
        //从开始截取到中间某个指定字符 (该字符出现的第一次)
         String zdS = str.substring(0,str.indexOf("地"));
        System.out.println("截取到中间某个指定字符(第一次出现):"+zdS);
         //从开始截取到指定某段字符串结尾
        String midStr ="上霜";
       String jwS =str.substring(0,str.indexOf(midStr)+midStr.length());
        System.out.println("截取到指定某段字符串结尾:"+jwS);

    }
}

运行结果

三、字符串替换

在 Java 中,String 类提供了 3 种字符串替换方法,分别是 replace()、replaceFirst() 和 replaceAll()

1、replace() 方法

replace() 方法用于将目标字符串中的指定字符(串)替换成新的字符(串),其语法格式如下:

字符串.replace(String oldChar, String newChar)

其中,oldChar 表示被替换的字符串;newChar 表示用于替换的字符串。replace() 方法会将字符串中所有 oldChar 替换成 newChar。

2、replaceFirst() 方法

replaceFirst() 方法用于将目标字符串中匹配某正则表达式的第一个子字符串替换成新的字符串,其语法形式如下:

字符串.replaceFirst(String regex, String replacement)

其中,regex 表示正则表达式;replacement 表示用于替换的字符串。

3、replaceAll() 方法

replaceAll() 方法用于将目标字符串中匹配某正则表达式的所有子字符串替换成新的字符串,其语法形式如下:

字符串.replaceAll(String regex, String replacement)

其中,regex 表示正则表达式,replacement 表示用于替换的字符串。


示例代码如下:

public class Main {

    public static void main(String[] args) {

        /*--------------------------------字符串替换的几种方式----------------------------------------------*/
        //replace()
        String words = "你是猪吗?猪";
        System.out.println("原始字符串是'"+words+"'");
        String rp = words.replace("猪","牛");
        System.out.println("replace()替换后的结果:"+rp);

       //replaceFirst()
        String newStr = words.replaceFirst("猪","牛");
        System.out.println("replaceFirst()替换后的结果:"+newStr);

        //replaceAll()
        String ra = words.replaceAll("猪","牛");
        System.out.println("replaceAll()替换后的结果:"+ra);



    }
}

运行结果:

四,将字符串分割组装为json格式对象

    /*--------------------------------将字符串分割组装为json格式对象----------------------------------------------*/
      String json ="八宝粥,65g;红豆,40g;黑米,20g;糯米,20g;薏米,20g;水,930g;糖,80g;";
        List<Mater> list = new ArrayList<>();
      String[] strS = json.split(";");//先用;号分割外层数据
        System.out.println("原始数据"+json);
        System.out.println("用;号分割"+strS[0]);
        //再用,号分割内层数据
        for (String ss: strS){
            String[] strS2 = ss.split(",");
            System.out.println("用,号分割"+ss.length()+strS);
            Mater mater = new Mater();
            mater.setName(strS2[0]);
            mater.setNum(strS2[1]);
            list.add(mater);
        }
        System.out.println("构造的list集合"+list);

 运行结果如下:

不足之处敬请@我 


版权声明:本文为qq_41966713原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。