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的时候 , 其余字 ...
随机推荐
- 新手阅读 Nebula Graph 源码的姿势
摘要:在本文中,我们将通过数据流快速学习 Nebula Graph,以用户在客户端输入一条 nGQL 语句 SHOW SPACES 为例,使用 GDB 追踪语句输入时 Nebula Graph 是怎么 ...
- C语言学习笔记之输出缓冲
在c语言中经常用到输出函数printf,当我们像往常一样在输出函数中输入我们的想要的输出的东西后加\n换行 验证结果如我们输出的一样 如果我们在后面加入死循环会不会出现这些语句呢 结果卡死了,可还是输 ...
- linxu系统安装WordPress
确保在安装wordpress之前,安装了nginx,php,mysql 没有安装的翻我之前的博文有安装方法 进入官网下载压缩包 wget https://wordpress.org/latest.ta ...
- 【计算机算法设计与分析】——NP
时间复杂度 时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快.也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的 ...
- 最新版CentOS8系统安装和基本配置
一.Centos8新版简介 Redhat公司在2019年5月推出了rhel8,年底推出了centos8,紧接着也会把相关的技术认证完全转换为新平台. 阿里云.华为云目前也已推出centos8的公共镜像 ...
- C#LeetCode刷题之#278-第一个错误的版本(First Bad Version)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3985 访问. 你是产品经理,目前正在带领一个团队开发新的产品.不 ...
- Vue Element-UI 中列表单选的实现
el-table中单选的实现 引用场景: 选择单条数据进行业务操作 实现方式: 给el-table-column设置el-radio Template 代码 <div class="r ...
- The Definitive Guide to Ruby's C API The Ruby C API Running Ruby in C Running C in Ruby
最近在研究如何在C/C++中 嵌入ruby脚本,很感谢找到了一篇文章,分享一下. The Definitive Guide to Ruby's C API
- 设计模式:建造者模式及在jdk中的体现,建造者模式和工厂模式区别
0.背景 建造模式(Builder模式) 假如有一个需求:盖房子,盖房子过程是一致的:打桩.砌墙.封顶.但是房子是各式各样的,最后盖出来的房子可能是高楼或别墅. 根据直接的思路,不用设计模式思想,我们 ...
- C++ STL sort 函数的用法
sort 在 STL 库中是排序函数,有时冒泡.选择等 $\mathcal O(n^2)$ 算法会超时时,我们可以使用 STL 中的快速排序函数 $\mathcal O(n \ log \ n)$ 完 ...