Java的字符串操作

Java的字符串操作

  1. 小型送分题:Java有字符串(String),StringBuffer(字符串缓存),StringBuilder(字符串建造者?)各种实现,究其原因还是历史上的各种坑。

一、不同字符串操作的对比

字符串操作 定义 内存分配 可变性 线程安全性 性能
C/C++ 中的char* 操作 char *是一个指针,可以指向一个字符串数组 由系统处理 可变 不可知 高效,都是直接对内存空间进行操作
C/C++中的char数组 是一个字符数组 手动释放 不可变 不可知 高效,都是直接对内存空间进行操作
C/C++中的String封装类 string可以被看成是以字符为元素的一种容器。 手动释放 可变 并发的读操作是线程答安全的。 较char指针和char数组低效
Java中的String String 类中使用 final 关键字修饰字符数组来保存字符串 系统处理 不可变 线程安全 每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。
Java中的StringBuilder 字符串变量 系统处理 可变 线程不安全 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升
Java中的StringBuffer 字符串变量 系统处理 可变 线程安全 StringBuilder > StringBuffer > String

1.1 C++中const修饰指针

以*为界,左物右指

const在星号的左边,是被指向的常量不可变

const在星号的右边,是指针的指向不可变

说明
定义 指向const常量值的指针 const常量指针
解释 当const在*的左边时,实际物体值不变 指针本身成为一个const指针,必须把const标明的部分放在*的右边
示例 const int * x;
int const * x;//两者是一致的
int * const p = 地址 // 因为P 所指向的地址是不能被修改的,所以必须被初始化

\2. 小型送分题:请自己设计一整套测试程序,测试演示说明以上各种字符串类型的效率差别(条件不足的可以省略C/C++部分)。

二、 Java字符串操作类的性能比较

2.1 具体代码

package stringTest;

/**
 * @Description 测试字符串操作类的效率
 * @Author 林泽鸿
 * @Date 2020/4/24 20:55
 */

class StringEntities {
    private static final int COUNTS = 10*10000;


    /***
     * 测试String拼接字符串添加操作时间
     */
    public static void testString(){
        System.out.print("Start to test String -> ");
        long startTime = System.currentTimeMillis();
        String strResult = "";
        for(int i = 0; i< COUNTS; i++){
            strResult += i;
        }
        long endTime = System.currentTimeMillis();
        // 统计循环整个过程时间
        System.out.println("Total time of String operation i: "+ (endTime - startTime));
    }

    /**
     * 测试StringBuffer拼接字符串添加操作时间
     */
    public static void testStringBuffer(){
        System.out.print("Start to test StringBuffer -> ");
        long startTime = System.currentTimeMillis();
        StringBuffer strResult = new StringBuffer();
        for(int i = 0; i< COUNTS; i++){
            strResult.append(i);
        }
        long endTime = System.currentTimeMillis();
        // 统计循环整个过程时间
        System.out.println("Total time of StringBuffer operation is: "+ (endTime - startTime));
    }

    /**
     * 测试StringBuilder拼接字符串添加操作时间
     */
    public static void testStringBuilder(){
        System.out.print("Start to test StringBuilder -> ");
        long startTime = System.currentTimeMillis();
        StringBuilder strResult = new StringBuilder();
        for(int i = 0; i< COUNTS; i++){
            strResult.append(i);
        }
        long endTime = System.currentTimeMillis();
        // 统计循环整个过程时间
        System.out.println("Total time of StringBuilder operation is:: "+ (endTime - startTime));
    }
}
public class test {

    public static void main(String[] args) {
        StringEntities.testString();
        StringEntities.testStringBuffer();
        StringEntities.testStringBuilder();

    }
}

2.2 测试结果

2.3 小结

可见,String类操作字符串十分消耗性能,StringBuilder比StringBuffer的效率略高。

\3. 小型送分题:请完成如下功能,使用正则表达式测试从字符串中识别

三、正则表达式的匹配

a) 邮编号码

b) 区号-座机号码

c) 手机号码

3.1 具体代码

package stringTest;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Description 正则表达式的测试
 * @Author 林泽鸿
 * @Date 2020/4/24 22:28
 */
public class RegularExpression {
    public static void main(String[] args) {
        // 要验证的字符串
        //邮政编码
        String zipCodeStr = "515160";
        //区号-座机号码
        String areaCodeStr = "020-12345678";
        //手机号码
        String phoneStr = "13633224466";

        //邮政编码
        String zipCodeRegEx = "^[1-9]\\d{5}$";
        //区号-座机号码
        String areaCodeRegEx = "\\d{3}-\\d{8}|\\d{4}-\\d{7}";
        //手机号码
        String phoneRegEx = "^(?:13\\d|15\\d|18\\d)\\d{5}(\\d{3}|\\*{3})$";
        System.out.println("下面进行验证的三个字符串分别均是正确的邮政编码,区号-座机号码和手机号码");
        System.out.println("验证是否是邮政编码");
        System.out.println(isMatch( zipCodeStr,zipCodeRegEx));
        System.out.println(isMatch( areaCodeStr,zipCodeRegEx));
        System.out.println(isMatch( phoneStr,zipCodeRegEx));

        System.out.println("验证是否是区号-座机号码");
        System.out.println(isMatch( zipCodeStr,areaCodeRegEx));
        System.out.println(isMatch( areaCodeStr,areaCodeRegEx));
        System.out.println(isMatch( phoneStr,areaCodeRegEx));
        System.out.println("验证是否是手机号");
        System.out.println(isMatch( zipCodeStr,phoneRegEx));
        System.out.println(isMatch( areaCodeStr,phoneRegEx));
        System.out.println(isMatch( phoneStr,phoneRegEx));


    }

    static boolean isMatch(String str ,String regEx ){

        // 编译正则表达式
        Pattern pattern = Pattern.compile(regEx);
        // 忽略大小写的写法
        Matcher matcher = pattern.matcher(str);
        // 字符串是否与正则表达式相匹配
        boolean isMatch = matcher.matches();
        return isMatch;
    }
}

3.2 测试结果

参考资料

https://www.cnblogs.com/tsingke/p/12075078.html

https://blog.csdn.net/u010275850/article/details/77512695

https://www.cnblogs.com/qxj511/p/4965793.html

java中String StringBuilder StringBuffer比较和效率(性能)测试 - 行者老夫 - 博客园

Java中字符串操作类String、StringBuffer、StringBuilder区别及性能对比测试_Java_Mr电阻的博客-CSDN博客

posted @ 2020-04-24 23:17  亥码  阅读(373)  评论(0编辑  收藏  举报