java字符串操作_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在星号的左边,是被指向的常量不可变

ecb091a2512b705704b644d29d117428.png

const在星号的右边,是指针的指向不可变

4345599628362ba61358cf40e869558c.png

说明

定义

指向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 测试结果

43b70bd57dfb418cf024f01844b01a96.png

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 测试结果

0515ed3dc36becd60575bb16a5aeebf9.png

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java字符串操作大全,适合初学者,浅显易懂 部JAVA字符串操作 2008-07-11 15:39:42| 分类: JAVA | 标签: |字号大中小 订阅 . JAVA字符串的方法 String a = "53c015"; //Integer.parseInt(s, radix) radix设置为10,表示10进制,16表示16进制啦 int i = Integer.parseInt(a, 16); 1、length() 字符串的长度   例:char chars[]={'a','b'.'c'};     String s=new String(chars);     int len=s.length(); 2、charAt() 截取一个字符   例:char ch;     ch="abc".charAt(1); 返回'b' 3、getChars() 截取多个字符   void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)   sourceStart指定了子串开始字符的下标,sourceEnd指定了子串结束后的下一个字符的下标。因此,子串包含从sourceStart到sourceEnd-1的字符。接收字符的数组由target指定,target中开始复制子串的下标值是targetStart。   例:String s="this is a demo of the getChars method.";     char buf[]=new char[20];     s.getChars(10,14,buf,0); 4、getBytes()   替代getChars()的一种方法是将字符存储在字节数组中,该方法即getBytes()。 5、toCharArray() 6、equals()和equalsIgnoreCase() 比较两个字符串 7、regionMatches() 用于比较一个字符串中特定区域与另一特定区域,它有一个重载的形式允许在比较中忽略大小写。   boolean regionMatches(int startIndex,String str2,int str2StartIndex,int numChars)   boolean regionMatches(boolean ignoreCase,int startIndex,String str2,int str2StartIndex,int numChars) 8、startsWith()和endsWith()   startsWith()方法决定是否以特定字符串开始,endWith()方法决定是否以特定字符串结束 9、equals()和==   equals()方法比较字符串对象中的字符,==运算符比较两个对象是否引用同一实例。   例:String s1="Hello";     String s2=new String(s1);     s1.eauals(s2); //true     s1==s2;//false 10、compareTo()和compareToIgnoreCase() 比较字符串 11、indexOf()和lastIndexOf()   indexOf() 查找字符或者子串第一次出现的地方。   lastIndexOf() 查找字符或者子串是后一次出现的地方。 12、substring()   它有两种形式,第一种是:String substring(int startIndex)          第二种是:String substring(int startIndex,int endIndex) 13、concat() 连接两个字符串 14 、replace() 替换   它有两种形式,第一种形式用一个字符在调用字符串中所有出现某个字符的地方进行替换,形式如下:   String replace(char original,char replacement)   例如:String s="Hello".replace('l','w');   第二种形式是用一个字符序列替换另一个字符序列,形式如下:   String replace(CharSequence original,CharSequence replacement) 15、trim() 去掉起始和结尾的空格 16、valueOf() 转换为字符串 17、toLowerCase() 转换为小写 18、toUpperCase() 转换为大写 19、StringBuffe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值