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的时候 , 其余字 ...
随机推荐
- 网络安全传输系统-sprint1传输子系统
一.产品规划与设计 二.传输子系统 基本框架:(1)不带安全功能的传输系统 (2)安全加密功能 part1:基本传输子程序设计(不带安全加密功能) 客户端 服务器 int main(int argc, ...
- 《第22条军规》Catch-22
也许我们能注意到,英语里“军规”和“圈套”是同一个词. <第二十二条军规>是约瑟夫·海勒的代表作,小说以第二次世界大战期间驻扎在皮亚诺扎岛上的一支美国飞行队为背景,描写飞行员约瑟连(YOY ...
- Docker 搭建 Keycloak
Docker 搭建 Keycloak 命令 需要创建好数据库,启动容器指定数据库信息 # KEYCLOAK_USER 用户名 # KEYCLOAK_PASSWORD 密码 # DB_ADDR 数据库地 ...
- Springboot中如何自定义注解以及使用2例
不说废话,直接进入正题: java自定义注解主要有3步:1.编写@interface接口2.编写@interface对应的处理方法进行处理3.调用处理方法 示例一:判断奇偶:比如有一个字段no要判断奇 ...
- springboot配置字符编码
这边主要有两种方式 方式一.使用传统的Spring提供的字符编码过滤器(Filter的方式) 因为,字符编码过滤器在框架中已经有了,所以我们不需要自己写了.直接进行配置类的实现: @Configura ...
- 洛谷P1048 采药 二维dp化一维
题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个 ...
- 代码优化之return 减少括号嵌套
代码优化之return 减少括号嵌套 例如下面的公共方法 // 优化 substring方法 解决边界越界问题 空指针问题 优化前 public static String subString ...
- C#LeetCode刷题之#453-最小移动次数使数组元素相等(Minimum Moves to Equal Array Elements)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3877 访问. 给定一个长度为 n 的非空整数数组,找到让数组所有 ...
- Homekit_DoHome_智能通断器
本款通断器适用于IOS和android系统用户,苹果用户可以非常方便的使用siri进行有效控制,android用户需要下载Dohome App进行操作,同时支持市面上主流的智能音箱进行控制. 对于an ...
- P、NP、NPC问题详解
转载地址 https://blog.csdn.net/bcb5202/article/details/51202589 P.NP.NPC 概念 > P问题:能够在多项式时间内解决的决策问题. - ...