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;   }
}

运行结果

1587957788274

四,个人小结

java中操作字符串的类,我知道的有三个类,分别是String,StringBuffer和StringBuilder.这三个类都是以char[]的形式保存的字符串,但是String类型的字符串是不可变的,对String类型的字符床做修改操作都是相当于重新创建对象.而对StringBuffer和StringBuilder进行增删操作都是对同一个对象做操作.StringBuffer中的方法大部分都使用synchronized关键字修饰,所以StringBuffer是线程安全的,StringBuilder中的方法则没有,线程不安全,但是StringBuilder因为没有使用使用synchronized关键字修饰,所以性能更高,在单线程环境下我会选择使用StringBuilder,多线程环境下使用StringBuffer.如果生命的这个字符串几乎不做修改操作,那么我就直接使用String,因为不调用new关键字声明String类型的变量的话它不会在堆内存中创建对象,直接指向String的常量池,并且可以复用.效率更高。

资料来源

java中操作字符串都有哪些类,他们之间有什么区别?

JAVA正则表达式

------------恢复内容结束------------

------------恢复内容结束------------

------------恢复内容结束------------

------------恢复内容结束------------

posted @ 2020-04-27 13:45  UziMyGod  阅读(224)  评论(0编辑  收藏  举报