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的时候 , 其余字 ...
随机推荐
- "点"醒自己
回顾: 过去的经历 从18年开始在某机构进行了测试培训,9月正式加入测试小白大军,中间也经历了半年的空窗期,入职2个月应能力不够被公司辞退,后通过培训班的朋友内推到一家软件外包公司,工作到现在. 思考 ...
- Android ViewPager进行碎片(Fragment)的分页操作
今天讲的是ViewPager 这个东西就是 假设你写了Fragment和Fragment1两个界面,用这个控件就可以实现两个界面之间的滑动,而不用Intent去跳转: 注意: 在布局中定义控件的时候, ...
- CSS表单与数据表(下)
2.表单 表单是用户输入内容的地方.表单涉及的控件很多,而且一直很难给它们应用样式.无法控制样式的部分,可以通过自定义控件来解决. 2.1 简单的表单 2.1.1 fieldset与legend fi ...
- java_Object类、日期时间类、System类、包装类
Object类 java.lang.Object 类是所有类的父类.它描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类就是Object. 如果一个类没有特别指定父类, 那么默认则继承自O ...
- 2020重新出发,JAVA学前了解,Windosws常用快捷键
前言:windows 常用快捷键 标准计算机键盘共104键,除了26个字母键.符号键.数字键外,剩下的都是一些功能键: 键盘功能键 常用功能键:Esc.Tab.Caps Lock.Shift.Ctrl ...
- 认识与学习BASH①——鸟叔的Linux私房菜
文章目录 认识与学习BASH① 认识BASH 壳程序 多种shells Bash shell 的功能 type :查询指令是否为Bash shell 的内置指令 指令的换行输入和快速删除 Shell的 ...
- 设计模式实战系列之@Builder和建造者模式
前言 备受争议的Lombok,有的人喜欢它让代码更整洁,有的人不喜欢它,巴拉巴拉一堆原因.在我看来Lombok唯一的缺点可能就是需要安装插件了,但是对于业务开发的项目来说,它的优点远远超过缺点. 我们 ...
- JavaScript基础-06-正则表达式
正则表达式 1. 正则表达式用于定义一些字符串的规则:计算机可以根据正则表达式,来检查一个字符串是否符合规则,将字符串中符合规则的内容提取出来. 2. 创建正则表达式对象: var reg=new R ...
- odoo12 Tree视图创建编辑旁边新增按钮,并根据条件隐藏
前言 我们通常在form视图中可以很简单地在header里面添加按钮,但是在某些情况下,我们也需要在Tree视图中添加按钮,但是odoo官方目前没有给我们提供相应的接口,因此,我们尝试自己来实现它.最 ...
- 报错:无效的列类型: 1111;must be specified for all nullable parameters.
org.springframework.jdbc.UncategorizedSQLException: Error setting null parameter. Most JDBC drivers ...