Java的字符串操作

小型送分题: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 测试结果

参考资料

java字符串操作_Java的字符串操作相关推荐

  1. java 字符串用法_java中字符串的用法

    1.String中的每个字符都是一个16位的Unicode字符,用Unicode很容易表达丰富的国际化字符集,比如很好的中文支持.甚至Java的标识符都可以用汉字,但是没人会用吧(只在一本清华的< ...

  2. java calendar字符串显示_java关于字符串和日期的代码展示

    StringBuffer是线性安全的,StringBuilder不是线性安全的 字符串的修改: stringBudile与stringBuiler提供了用于修改字符串内容的相关方法 String st ...

  3. java 字符串总结_Java中字符串(String)总结

    先说说JDK API: JDK中包含大量的API类库,所谓API(Application Programming Interface,应用程序编程接口,这些功能以类的形式封装). JDK API包含的 ...

  4. java遍历字符串字符_Java 遍历字符串中所有字符的最快方法

    小编典典 在我的AMDx64 8core和源1.8上,使用'charAt'和字段访问之间没有区别.看来jvm已经过充分优化,可以内联和精简任何'string.charAt(n)'调用. 这完全取决于S ...

  5. java split 数字_java截取字符串,截串,substring和split,分割字母和数字,正则缝隙...

    需求,把"01:大汽车",分成01和大汽车 有两种做法:一是substring Java代码 1 packagetest;2 3 public classsubstringTest ...

  6. java 字符串截取_java截取字符串,截串,substring和split,分割字母和数字,正则缝隙...

    需求,把"01:大汽车",分成01和大汽车 有两种做法:一是substring package test; public class substringTest { public ...

  7. java中字符串函数_JAVA中字符串函数subString的用法小结

    string str;str=str.substring(int beginindex);截取掉str从首字母起长度为beginindex的字符串,将剩余字符串赋值给str: str=str.subs ...

  8. java 对比函数_java中字符串比较函数和操作函数,详细解析

    java编程语言中关于字符的内容也是极其丰富的,所以学习这方面的知识也十分重要的.今天就来为大家介绍一些与java字符串有关的内容,也就是java中字符串比较函数和操作函数,并为大家进行详细的解析,一 ...

  9. java中字符串的操作_java中字符串的操作

    //创建一个字符数组 char[] charArr = {'a','b','c','d','e','f','g'}; //创建一个字符串 String str = new String(charArr ...

最新文章

  1. swiftsuspenders Memo
  2. 老旧计算机升级云桌面,哇哦!PC机房轻松升级云课堂 ,PC利旧方案看我的!
  3. C++中引用的一些问题
  4. 织梦cms仿知名吧站长导航网站模板
  5. 计算机软件通常分为两大类 它们是,计算机考试题库:计算机考试练习题(79)...
  6. STM32使用LWIP库新建tcp_sever
  7. oSIP开发者手册 (三)
  8. posix,perl正则表达式区别
  9. linux关于tcp协议ack的实现--总结和公平性问题
  10. ESP8266文档阅读ESP8266 SDK 入门指南
  11. 我卖掉北京 500 万的房子,在老家生活的这两年…
  12. Winsock2_WSADATA
  13. 二层交换机和三层交换机
  14. DNS劫持又称域名劫持
  15. [转]多普达818、828+升级中文WM6.1及必装软件全过程讲解
  16. ABAP:如何等待小数秒数
  17. 备忘录吕吕没有备忘录十新建_备忘录字段焦虑
  18. oracle备份恢复(dmp文件)
  19. 微博登录接入出现错误码21322(重定向地址不匹配),其他解决方法
  20. 找工作的时候怎样判断一家公司靠不靠谱

热门文章

  1. 计算机二级vb重点知识,计算机二级《VB》历年考试重点知识
  2. pytorch torch.nn.Sequential(* args)(嘎哈用的?构建神经网络用的?)
  3. 《深度学习的数学》笔记【各种概念】
  4. Python的第一种数据类型——Number(数字)
  5. 分析对象内部结构,并详解synchronized锁膨胀升级和降级的过程
  6. Java 垃圾回收机制,你知多少??
  7. exhaustion java_Java Exceptions
  8. java模拟数据库压测_写并发压测 java 脚本你必须会的 3 个类
  9. python多轴图_python-Aplpy多图动态轴共享
  10. 行星齿轮设计手册_合理选用行星齿轮传动装置的侧隙