• 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正则表达式

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

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

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

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

  • 相关阅读:
    【c/c++】#pragma的用法
    【c/c++】#pragma的用法
    【matlab】matlab中 mcc、mbuild和mex命令详解
    【codecs】数据流ES、PES、TS、PS简介
    【codecs】数据流ES、PES、TS、PS简介
    【SVAC】SVAC标准简介
    【python】Python实现SMTP发送邮件
    【c】#pragma once 与#ifndef的区别与作用
    【c】#pragma once 与#ifndef的区别与作用
    【Tools/PC】如何在一台电脑上实现双屏幕显示?
  • 原文地址:https://www.cnblogs.com/huihui0820/p/12786185.html
Copyright © 2020-2023  润新知