JAVA作业—字符串操作
------------恢复内容开始------------
------------恢复内容开始------------
------------恢复内容开始------------
------------恢复内容开始------------
JAVA作业—字符串操作
一,不同字符串的比较
字符串操作 | 数据类型 | 可变性 | 内存分配 | 线程安全性 | 性能 |
---|---|---|---|---|---|
C/C++中的char* | 字符指针 | 可变 | 系统处理 | 未知 | 高效 |
C/C++中的String封装类 | 一个类 | 可变 | 手动释放 | 并发的读操作是线程答安全的。 | 较char指针低效 |
Java中的String 类 | char[]的形式保存的字符串 | 不可变 | 系统处理 | 安全 | 对String类型的字符床做修改操作都是相当于重新创建对象。StringBuilder > StringBuffer > String。 |
Java中的StringBuilder类 | char[]的形式保存的字符串 | 可变 | 系统处理 | 不安全 | 操作都是对同一个对象做操作,StringBuilder因为没有使用使用synchronized关键字修饰,所以性能更高。StringBuilder > StringBuffer > String。 |
Java中的StringBuffer类 | char[]的形式保存的字符串 | 可变 | 系统处理 | 安全 | 操作都是对同一个对象做操作,StringBuffer中的方法大部分都使用synchronized关键字修饰。StringBuilder > StringBuffer > String。 |
二,字符串操作性能比较
测试代码
`package Stringtest;
/**
* @author 李玉
* */
public class Test {
private static final int N=100000;
public static void main(String[] args) {
StringTest();
StringBufferTest();
StringBuilderTest();
} public static void StringTest(){
long begintime=System.currentTimeMillis();
String str="";
for (int i=0;i<N;i++){
str+=i;
}
long endtime =System.currentTimeMillis();
System.out.println("StringTime is:"+(endtime-begintime)+"ms");
} public static void StringBufferTest(){
long begintime = System.currentTimeMillis();
StringBuffer str= new StringBuffer();
for(int i = 0; i< N; i++){
str.append(i);
}
long endTime = System.currentTimeMillis();
System.out.println("StringBufferTime is: "+ (endTime - begintime)+"ms");
}
public static void StringBuilderTest(){
long beginTime = System.currentTimeMillis();
StringBuilder str = new StringBuilder();
for(int i = 0; i< N; i++){
str.append(i);
} long endTime = System.currentTimeMillis();
System.out.println("StringBuilderTime is:"+ (endTime - beginTime)+"ms");
}
}`
运行结果
三,正则表达式匹配
测试代码
package Stringtest;import com.sun.org.apache.xerces.internal.impl.xpath.regex.Match;
import java.util.regex.Matcher;import java.util.regex.Pattern;
public class RegularExpressionTest {
public static void main(String[] args) {
//邮政编码
String postcode="^(?:13\\d|15\\d|18\\d)\\d{5}(\\d{3}|\\*{3})$";
//手机号
String phone="^[1-9]\\d{5}$";
//区号-座机号码
String areacode= "\\d{3}-\\d{8}|\\d{4}-\\d{7}";
//测试用例
String pc="236000";
String p="18226290524";
String ac="010-123456789";
System.out.println(match(postcode,pc));
System.out.println(match(phone,pc));
System.out.println(match(areacode,pc));
System.out.println(match(postcode,p));
System.out.println(match(phone,p));
System.out.println(match(areacode,p));
System.out.println(match(postcode,ac));
System.out.println(match(phone,ac));
System.out.println(match(areacode,ac));
}
static boolean match(String str,String Ex){
Pattern p=Pattern.compile(str);
Matcher m=p.matcher(Ex);
while (m.find()){
return true;
}
return false; }
}
运行结果
四,个人小结
java中操作字符串的类,我知道的有三个类,分别是String,StringBuffer和StringBuilder.这三个类都是以char[]的形式保存的字符串,但是String类型的字符串是不可变的,对String类型的字符床做修改操作都是相当于重新创建对象.而对StringBuffer和StringBuilder进行增删操作都是对同一个对象做操作.StringBuffer中的方法大部分都使用synchronized关键字修饰,所以StringBuffer是线程安全的,StringBuilder中的方法则没有,线程不安全,但是StringBuilder因为没有使用使用synchronized关键字修饰,所以性能更高,在单线程环境下我会选择使用StringBuilder,多线程环境下使用StringBuffer.如果生命的这个字符串几乎不做修改操作,那么我就直接使用String,因为不调用new关键字声明String类型的变量的话它不会在堆内存中创建对象,直接指向String的常量池,并且可以复用.效率更高。
资料来源
------------恢复内容结束------------
------------恢复内容结束------------
------------恢复内容结束------------
------------恢复内容结束------------