Day02:正则表达式 / Object / 包装类

JAVA正则表达式

实际开发中,经常需要对字符串数据进行一些复杂的匹配,查找,替换等操作。

通过"正则表达式",可以方便的实现字符串的复杂操作。

正则表达式是一串特定字符,组成一个"规则字符串",这个"规则字符串"是描述文本规则的工具。正则表达式就是记录文本规则的代码。

例如:

正则表达式:"[a-z]"表示a到z的任意一个字符。

正则表达式:"[a-z]"表示由1个或多个a-z字符组成的字符串。

                                字符集合

正则表达式 说明
[abc] a、b、c中任意一个字符
[^abc] 除了a、b、c的任意字符
[a-z] a、b、c、......、z中的任意一个字符
[a-zA-Z0~9] a~z、A~Z、0~9中任意一个字符
[a-z&&[^bc]] a~z中除了b和c以外的任意一个字符,其中&&表示"与"的关系

                             预定义字符集

正则表达式 说明
. 任意一个字符
\d 任意一个数字字符,相当于[0-9]
\w 单词字符,相当于[a-zA-Z0-9_]
\s 空白字符,相当于[\t\n\x0B\f\r]
\D 非数字字符
\W 非单词字符
\S 非空白字符

                                数量词

正则表达式 说明
X? 表示0个或1个X
X* 表示0个或任意多个X
X+ 表示1个到任意多个X(大于等于1个X)
X{n} 表示n个X
X{n, } 表示n个到任意多个X(大于等于n个X)
X{n,m} 表示n个到m个X

检索邮政编码

 

        规则为6位数字

 

        第一种匹配规则 [0-9][0-9][0-9][0-9][0-9]

 

        简化第一种规则 \d\d\d\d\d

 

        简化第二种规则 \d{6}

 

image.png

 

分组()

分组:()圆括号表示分组,可以将一系列正则表达式看作一个整体,分组时可以使用“|”表示“或”的关系。

例如:匹配手机号码面前的区号:

(\+86|0086)?\s?\d{11}

   圆括号表示这里需要出现" +86"或者"0086"

 

 检索手机号码:+8613838389438

 

    +86 可有可无

 

    +86与后面的号码直接空格可以没有或者有多个

 

    电话号码为11位数字

 

image.png

 

 "^"和"$"

^:代表字符串开始。

$:代表字符串结束。

 例如:匹配用户名规则-从头到尾连续8~10个单词字符

            \w{8,10}

            ^\w{8,10}$

    · 如果使用第一种写法,则"abcd1234_abcd"是可以验证通过的;

    · 使用第二种写法由于有从头到尾整体的限定,则验证不能通过。

String正则API

matches方法

matches(正则表达式)方法:将一个字符串与正则表达式进行匹配。

如果匹配成功就返回true,否则返回false。

 /** 测试email是否合法 */
    public void email(){
        String emailRegEx="^[a-zA-Z0-9_.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9]{2,4}$";
        String email="sdf@itkzhan.com.cn";
        System.out.println(email.matches(emailRegEx));
    }

 

split方法

String类的split()方法可以将字符串按照特定的分隔符分成字符串数组。

String[] split(String regex) 参数regex为正则表达式,以regex所表示的字符串为分隔符,将字符串拆分成字符串数组。

数据:"3,itkzhan, 3,  itkzhan@itkzhan.com,33"

    拆分为:["3"," itkzhan","  3"," itkzhan@itkzhan.com,"," 33"]

    拆分方式:str.split(",\\s*");

    解释:以逗号开头,>=0个的空格组合为分割


/** 使用split方法拆分字符串 */ public void testSplit(){ //按空格拆分 String str="java cpp php c# objective-c"; String[] strArr=str.split("\\s"); System.out.println(Arrays.toString(strArr)); //按+、-、=符号拆分 String line="100+200-150=150"; strArr=line.split("[\\+\\-=]"; System.out.println(Arrays.toString(strArr)); }

 replaceAll方法

String提供了同于字符串替换的方法:

String replaceAll(String regex,String replacement) 将字符串匹配正则表达式regex的字符串替换成replacement。


/** 使用replaceAll方法实现字符串替换 */ @Test public void testReplaceAll(){ //将str中的所有数字替换为"数字"二字 String str="abc123bcd45ef6f7890"; str=str.replaceAll("\\d+","数字"); System.out.println(str); }

 

 

 Object

java类继承结构中,java.lang.Object类位于顶端。

如果定义一个Java类时i没有使用exends关键字声明父类,则父类默认继承为java.lang.Objet类

Obeject类型的引用变量可以指向任何类型对象。

toString方法 

如何重写toString方法 

Object类中的重要方法,用于返回对象值的字符串表示;

 原则上建议重写,格式大多数遵循 "类的名字[域值]",例如:

    public String toString(){
        return getClass().getName()
                +"[name="+name
                +",salary="+salary
                +",gender="+gender
                +"]";
    }

 

 Java语言中很多地方会默认调用对象的toString方法:

字符串+对象,自动调用对象的toString方法

System.out.print(任意对象),直接调用toString方法

如果不重写toString方法,将使用Object的toString方法,逻辑为:

类名@散列码

toString方法时非常有用的调式工具

JDK中的标准类库中,许多类都定义了toString方法,方便用户获得有关对象状态的必要信息:

自定义的每一个类增加toString方法。

String重写toString方法

String的toString()方法就是将自身返回。

    public String toString(){
        return this;
    }

 

equals方法

Object中的equals方法,作用在于检测一个对象是否等于另一个对象;

在Object类中,这个方法判断两个对象是否具有相同的引用,即是否为相同的对象;

在实际开发中,一般需要重写该方法,下面代码在cell1和cell2指向同一个对象时才为true,可以将其重写为:当x和y坐标相等时两个对象即相等,这样更有意义一些。

    cell1.equals(cell2);

  public boolean equals(Object obj){
        if(obj==null){
            return false;
        }
        if(this==obj){
            return true;
        }
        if(obj instanceof Cell){
            Cell cell=(Cell)obj;
            return cell.row==row&&cell.col==col;
        }else{
            return false;
        }
    }

 

String重写equals方法

String的equals方法用于比较两个字符串对象的字符序列是否相等。

    /** 测试字符串的比较 */
    public class Demo{
        public static void main(String[] args){
            String s1=new String("abc");
            String s2=new String("abc");
            String s3=new String("A");
            
            System.out.println(s1.equals(s2));//true
            System.out.println(s1.equals(s3));//false
        }
    }

 

equals和==的区别?

==用于比较变量的值,可以用于任何类型,入股票用于引用类型,比较的时两个引用变量中存储的值(地址信息),判断两个变量是否指向相同的对象。

equals是Object的方法,重写以后,可以用于比较两个对象的内容是否“相等”;

注意:

Obejt默认的equals方法比较规则和==相同。

包装类

概述:

在进行类型转换的范畴内,由一种特殊的转换,需要将int这样的基本数据类型转换成对象;

所有基本类型都有一个于之对应的类,即包装类。

    image.png

包装类是不可改变类,在构造了包装类对象后,不允许更改包装在其中的值;

包装类是final的,不能定义他们的子类。

基本类型 基本类型 父类
int java.lang.Integer java.lang.Number
long java.lang.Long java.lang.Number
double java.lang.Double java.lang.Number
short java.lang.Short java.lang.Number
float java.lang.Float java.lang.Number
byte java.lang.Byte java.lang.Number
char java.lang.Character java.lang.Object
boolean  java.lang.Boolean java.lang.Object

8中基本数据类型包装类

Integer类

Integer 类在对象中包装了一个基本类型 int 的值。

Integer 类对象包含一个 int 类型的字段。

此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法

注意:

在实现将字符串转换为 int 类型数值的过程中,如果字符串中包含非数值类型的字符,则程序执行将出现异常。

Float类

Float 类在对象中包装了一个基本类型 float 的值。

Float 类对象包含一个 float 类型的字段。

此外,该类提供了多个方法,能在 float 类型与 String 类型之间互相转换,同时还提供了处理 float 类型时比较常用的常量和方法。

注意:

在实现将字符串转换为 float 类型数值的过程中,如果字符串中包含非数值类型的字符,则程序执行将出现异常。

Double类

Double 类在对象中包装了一个基本类型 double 的值。

Double 类对象包含一个 double 类型的字段。

此外,该类还提供了多个方法,可以将 double 类型与 String 类型相互转换,同时 还提供了处理 double 类型时比较常用的常量和方法。

注意:

在将字符串转换为 double 类型的数值的过程中,如果字符串中包含非数值类型的字符,则程序执行将出现异常。

Byte类

Byte 类将基本类型为 byte 的值包装在一个对象中。

一个 Byte 类的对象只包含一个类型为 byte 的字段。

此外,该类还为 byte 和 String 的相互转换提供了方法,并提供了一些处理 byte 时非常有用的常量和方法。

注意:

必须使用数值型的 String 变量作为参数才能创建成功,否则会抛出 NumberFormatException 异常。

Boolean类

Boolean 类将基本类型为 boolean 的值包装在一个对象中。

一个 Boolean 类的对象只包含一个类型为 boolean 的字段。

此外,此类还为 boolean 和 String 的相互转换提供了很多方法,并提供了处理 boolean 时非常有用的其他一些常用方法。

Char类

Character 类是字符数据类型 char 的包装类。

Character 类的对象包含类型为 char 的单个字段,这样能把基本数据类型当对象来处理。

Number类

Number 是一个抽象类,也是一个超类(即父类)。

Number 类属于 java.lang 包,所有的包装类(如 Double、Float、Byte、Short、Integer 以及 Long)都是抽象类 Number 的子类。

抽象类不能直接实例化,而是必须实例化其具体的子类。

System类

System 类代表系统,系统级的很多属性和控制方法都放置在该类的内部。

该类位于 java. lang 包。由于该类的构造方法是 private 的,所以无法创建该类的对象,也就是无法实例化该类。

System 类中提供了一些系统级的操作方法,常用的方法有 arraycopy()、currentTimeMillis()、exit()、gc() 和 getProperty()。

 

1. arraycopy() 方法

语法:

public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)

 

该方法的作用是数组复制,即从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

 

2.currentTimeMillis() 方法

语法:

long m=System.currentTimeMillis();

 

该方法的作用是返回当前的计算机时间,时间的格式为当前计算机时间与 GMT 时间(格林尼治时间)1970 年 1 月 1 日 0 时 0 分 0 秒所差的毫秒数。

 

3. exit() 方法

语法:

public static void exit(int status) 

该方法的作用是终止当前正在运行的 Java 虚拟机。

 

4.gc() 方法

语法:

public static void gc()

 

该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,取决于系统中垃圾回收算法的实现以及系统执行时的情况。

 

5. getProperty() 方法

语法:

public static String getProperty(String key)

 

该方法的作用是获得系统中属性名为 key 的属性对应的值。

常见属性:

 

属性名属性说明
java. version Java 运行时琢境版本
java.home Java 安装目录
os.name 操作系统的名称
os.version 操作系统的版本
user.name 用户的账户名称
user.home 用户的主目录
user, dir 用户的当前工作目录

 

Number和主要方法

抽象类Number是Byte,Double,Float,Integer,Long和Short类的父类;

Number的子类必须提供将表示的数值转换成byte,double,float,int,long和short的方法;

doubleValue()以double形式返回指定的数值

intValue()以int形式返回指定的数值

floatValue()以float形式返回值定的数值

/** 测试Number的intValue方法和doubleValue方法 */
    public void testIntValueAndDoubleValue(){
        Number d=123.45;
        Number n=123;
        //输出d和n对象所属的类型
        System.out.println(d.getClass().getName());//java.lang.Double
        System.out.println(n.getClass().getName());//java.lang.Integer
        
        int intValue=d.intValue();
        double doubleValue=d.doubleValue();
        System.out.println(intValue+","+doubleValue);//123,123.45
        
        intValue=n.intValue();
        doubleValue=n.doubleValue();
        System.out.println(intValue+","+doubleValue);//123,123.0
    }

 

Integer常用功能

Integer的静态方法parseInt用于将字符串转换成int。

   /** String转换为int */
    public void testParseInt(){
        String str="123";
        int value=Integer.parseInt(str);
        System.out.println(value);//123
        str="水电费";
        //会抛出NumberFormatException
        //value=Integer.parseInt(str);
    }

 

如果字符串的格式不是整数形式,将无法转换。

Double常用功能

  /** String转换为double */
    public void testParseDouble(){
        String str="12345.00";
        double value=Double.parseDouble(str);
        //12345.0
        System.out.println(value);
        
        str="¥12345.00";
        
        //会抛出NumberFormatException
        //value=Double.parseDouble(str);
    }

 

自动装箱和拆箱操作

 Integer a=100;    //装箱

        Integer b=200;    //装箱

        Integer c=a+b;    //拆箱再装箱

        double d=c;    //拆箱

 

装箱和拆箱是“编译器”认可的,而不是虚拟机。编译器在生成类的字节码是插入必要的方法调用

 Integer a=100 => Integer a=Integer.valueOf(100)

        Integer b=200 => Integer b=Integer.valueOf(200)

        Integer c=a+b=>Integer c=Integer.valueOf(a.intValue()+b.intValue())

        int d=c =>int d=c.intValue()

 

 

 image.png

小秘诀:

当一种类型转换成另一种类型时调用:

转换后类型=转换之前类型.parse转换后类型(变量名);

 

 

 

 

 

 

 

posted @ 2019-08-06 11:17  大阿毛  阅读(162)  评论(0编辑  收藏  举报