Java的字符串操作
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 测试结果

参考资料
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的字符串操作的更多相关文章
- JAVA作业—字符串操作
------------恢复内容开始------------ ------------恢复内容开始------------ ------------恢复内容开始------------ ------- ...
- Java的字符串操作一些简单的思考
Java的字符串操作 1 .1不可变的String String对象事不可变的,String类中的每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符 ...
- java类库字符串操作
在java类库中,java给我们提供了字符串几个特别的操作,分别是String,Stringbuffer,Stringbuilder等.下面就对这几个类做一个简单的介绍.首先,我们先了解一下Strin ...
- Java Script 字符串操作
JS中常用几种字符串操作: big() small() bold() fontcolor() fontsize() italics() strike() link() charAt() charCod ...
- Java String 字符串操作小结
// 转载加编辑 -- 21 Apr 2014 1. Java字符串中子串的查找 Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现 ...
- 使用javap分析Java的字符串操作
我们看这样一行简单的字符串赋值操作的Java代码. String a = "i042416"; 使用命令行将包含了这行代码的Java类反编译查看其字节码: javap -v con ...
- 四:Java之字符串操作String、StringBuffer和StringBuilder
string是我们经经常使用到的一个类型,事实上有时候认为敲代码就是在重复的操作字符串,这是C的特点,在java中.jdk非常好的封装了关于字符串的操作.三个类String .StringBuffer ...
- Java基础(一)-- Java对字符串操作大全
一.Java字符串类基本概念 在JAVA语言中,字符串数据实际上由String类所实现的.Java字符串类分为两类:一类是在程序中不会被改变长度的不变字符串:二类是在程序中会被改变长度的可变字符串.J ...
- android TextView字体设置最少占多少行. 及其 Java String 字符串操作 . .
① 字体设置: 修改代码 : GridViewActivity.java priceTv为 TextView priceTv.setMaxLines(3); //当多与7个字fu的时候 , 其余字 ...
随机推荐
- Android布局——单复选框(今天上课的内容总结下)
怎么感觉最近补充的都是监听器的内容,今天学长提了一个新的监听器,看起来很牛批(因为很长) // 添加文本更改的监听器, TextWatcher是监听器的回调接口 text.addTextChanged ...
- 22、Command 命令模式
1.command 命令模式 命令模式(Command Pattern):在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指 ...
- git使用-远程仓库(github为例)
1.登录github(没有先注册账号) 2.settings>SSH and GPG keys>New SSH key Title(自己填写即可) key需要git命令生成 ssh-key ...
- Css 设置超过再两行显示省略号
大部分场景都是超过一行就显示... <template> <div class="other-product-item item-name" :title=&qu ...
- 深度强化学习:Deep Q-Learning
在前两篇文章强化学习基础:基本概念和动态规划和强化学习基础:蒙特卡罗和时序差分中介绍的强化学习的三种经典方法(动态规划.蒙特卡罗以及时序差分)适用于有限的状态集合$\mathcal{S}$,以时序差分 ...
- 【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!
在 冰河技术 微信公众号前面的文章中,我们介绍了如何使用注解来自动装配Spring组件.之前将的都是在来的字段上添加注解,那有没有什么方法可以实现方法.构造器位置的自动装配吗?今天我们就一起来探讨下如 ...
- eric4 编译 中文 控件 报错 解决
eric4 在qt设计师界面, 设计 中文名控件 时,有时候不能编译,报错如下: 解决办法: 打开eric4---setting----preferences 按下图操作后 ,重新启动eric4即可解 ...
- Android 禁止ViewPager左右滑动的功能实现
来来来,各位看官~ Look here!!! Android 禁止ViewPager左右滑动的功能实现!! I think it`s so easy,无需重写ViewPager!!! JUST ...
- WIN10家庭版安装ORACLE的问题
第一次安装成功后可启动ORACLE服务,重启计算机后服务监听无法启动,建议替换系统
- 使用Kali中的Metasploit生成木马控制Windows系统
一.概念:Kali基于debin的数字取证系统,上面集成了很多渗透测试工具,其前身是BT5 R3(BtackTrack). 其中Metasploit是一个综合利用工具,极大的提高了攻击者的渗透效率,使 ...