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博客

Java的字符串操作的更多相关文章

  1. JAVA作业—字符串操作

    ------------恢复内容开始------------ ------------恢复内容开始------------ ------------恢复内容开始------------ ------- ...

  2. Java的字符串操作一些简单的思考

    Java的字符串操作 1 .1不可变的String String对象事不可变的,String类中的每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符 ...

  3. java类库字符串操作

    在java类库中,java给我们提供了字符串几个特别的操作,分别是String,Stringbuffer,Stringbuilder等.下面就对这几个类做一个简单的介绍.首先,我们先了解一下Strin ...

  4. Java Script 字符串操作

    JS中常用几种字符串操作: big() small() bold() fontcolor() fontsize() italics() strike() link() charAt() charCod ...

  5. Java String 字符串操作小结

    // 转载加编辑 -- 21 Apr 2014 1. Java字符串中子串的查找 Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现 ...

  6. 使用javap分析Java的字符串操作

    我们看这样一行简单的字符串赋值操作的Java代码. String a = "i042416"; 使用命令行将包含了这行代码的Java类反编译查看其字节码: javap -v con ...

  7. 四:Java之字符串操作String、StringBuffer和StringBuilder

    string是我们经经常使用到的一个类型,事实上有时候认为敲代码就是在重复的操作字符串,这是C的特点,在java中.jdk非常好的封装了关于字符串的操作.三个类String .StringBuffer ...

  8. Java基础(一)-- Java对字符串操作大全

    一.Java字符串类基本概念 在JAVA语言中,字符串数据实际上由String类所实现的.Java字符串类分为两类:一类是在程序中不会被改变长度的不变字符串:二类是在程序中会被改变长度的可变字符串.J ...

  9. android TextView字体设置最少占多少行. 及其 Java String 字符串操作 . .

    ①  字体设置: 修改代码 :  GridViewActivity.java priceTv为 TextView priceTv.setMaxLines(3); //当多与7个字fu的时候 , 其余字 ...

随机推荐

  1. Python下载网络图片方法汇总与实现

    本文介绍下载python下载网络图片的方法,包括通过图片url直接下载.通过re/beautifulSoup解析html下载以及对动态网页的处理等. ​ 很多人学习python,不知道从何学起.很多人 ...

  2. 未来云原生世界的“领头羊”:容器批量计算项目Volcano 1.0版本发布

    在刚刚结束的CLOUD NATIVE+ OPEN SOURCE Virtual Summit China 2020上,由华为云云原生团队主导的容器批量计算项目Volcano正式发布1.0版本,标志着V ...

  3. Linux Docker部署

    Docker 安装 卸载旧版docker yum remove docker \ docker-client \ docker-client-latest \ docker-common \ dock ...

  4. JavaScript call的示例

    作用: 改变函数执行时的作用域 let name = 'global name' function say(){ console.info(arguments) // 调用时接收的参数个数 conso ...

  5. golang 中的struct理解

    golang实验代码 package main import("fmt") type Stu struct{ name string age int } func (stu *St ...

  6. HBase存储及读写原理介绍

    一.HBase介绍及其特点 HBase是一个开源的非关系型分布式数据库,它参考了谷歌的BigTable建模,实现的编程语言为Java.它是Apache软件基金会的Hadoop项目的一部分,运行于HDF ...

  7. 根据字典内的键值修改另一个字典的value

    需求:根据传入字典的key1,将value1循环替换到已知字典内相同key的value def dispose_dict(input_parameter,fixed_parameter): for i ...

  8. (转)文件上传org.apache.tomcat.util.http.fileupload.FileUploadException: Stream closed

    文件上传时,tomcat报错org.springframework.web.multipart.MultipartException: Failed to parse multipart servle ...

  9. python爬虫用drony转发进行抓包转发

    转载至https://www.cnblogs.com/lulianqi/p/11380794.html#l_2 实际操作步骤(Android) 笔者这里直接使用上面提到第3种方法(方法1在对于手机AP ...

  10. Arrays中toString 和 binarySearch 的原代码

    只是记住方法是干什么的,但是对具体方法的理解还是不够 查找方法 当所查找的不存在的时候 返回值应该是 return -(low + 1);   一直知道toString 是转换成为字符串  但是具体的 ...