0426JavaSE01day02.txt=========正则、Object、包装类详解
正则表达式
基本正则表达式:正则表达式简介、分组()、 "^"和"$"
String正则API:matches方法、split方法、replaceAll方法
Object
Object:Object
toString方法:如何重写toString方法、String重写toString
equal方法:如何重写equals方法、String重写equals、equals和==的区别
包装类
包装类概述:
8种基本类型包装类:Number及其主要方法、Interger常用功能、Dobule常用功能、
自动装箱和拆箱操作
自动装箱和拆箱:自动装箱和拆箱的原理
基本正则表达式
1..1.1. 正则表达式简介
实际开发中,经常需要对字符串数据进行一些复杂的匹配、查找、替换等操作。
通过正则表达式,可以方便的实现字符串的复杂操作
正则表达式是一串特定的字符,组成一个“规则字符串”,这个规则字符串是描述
文本规则的工具,正则表达式就是记录文本规则的代码
所谓正则表达式就是使用一系列预定义的特殊字符来描述一个字符串的格式规则,然后使用该格式规则匹配某个字符串是否符合格式要求。
1、“.”和"\"
"."点儿,在正则表达式中表示任意一个字符。
"\"在正则表达式中是转意字符,当我们需要描述一个已经被正则表达式使用的特殊字符时,我们就可以通过使用"\"将其转变为原本的意思。
"\"在正则表达式中也有一些预定义的特殊内容:
\d:表示任意一个数字-------------------------------相当与[0-9]
\w:表示任意一个单词字符(只能是 数字,字母,下划线) --------相当与[a-zA-Z0-9]
\s:表示任意一个空白字符(\t \r \n \f \x0B)
\D:表示任意一个非数字字符
\W:表示任意一个非单词字符
\S:表示任意一个非空白字符
2、"字符集合 []"
"[]"用来描述单一字符,方括号内部可以定义这个字符的内容,也可以描述一个范围。例如:
[abc]:表示该字符只能是a或者b或者c---------------------【只能取其中的一个】
[^abc] ------------------->除了abc以外的任意字符
[123]:表示该字符只能是1或者2或者3
当我们需要描述所有小写字母时,我们可以使用范围 [a-z],表示该字符可以是任意一个小写字母。
同样还可以使用 [0-9] 来表示该字符可以是任意一个数字。
也可以在多个范围内选择。比如,[a-zA-Z0-9_] 表示该字符可以是任意字母,数字以及"下划线"
[a-z&&[^bc]] ---------------->a-z中除了bc以外的任意字符 【重要记住】
{} 的缩写版
"+":表示内容可以连续出现至少1次以上 【等价于】-------------->{1,}
"*":表示内容出现0-若干次 ----------------{0,}
"?":表示内容出现0-1次 ----------------{0,1}
x{n}:表示内容必须出现n次x
x{n,m}:表示内容出现n-m次x
x{n,}:表示内容出现至少n次x
1.1.2. 分组()
通过上面的内容,我们还无法解决类似下面的问题:
在描述电话号码时,前面有区号,区号的形式可以是0086或者+86
那么我们如何在这两个字符串之间选择?
这时我们可以使用分组"()"。() 可以将内容看做一个整体,()中可以使用"|"来表示或关系。例如,(+86|0086) 表示这里可以是+86或者0086。
1.1.3. "^"和"$"
通过在正则表达式的开始添加"^"以及末尾添加"$"来表示一个整体。若不使用它们,那么正则表达式只匹配某个字符串的部分内容是否符合格式规则,但使用它们,则要求字符串必须从头到尾都满足该格式规则。
例如,^\w{ 8,10 }$ 表示整体字符串只能出现单词字符8-10个。------------------【重要】
\w{ 8,10 } 表示整体字符串只匹配其中连续的8-10个。------------------【重要】
1.2. String正则相关API
matches方法
matches()方法的参数要求我们传入一个用字符串描述的正则表达式,然后使用该正则表达式描述的字符串格式规则来匹配当前字符串,若满足那么该方法返回true。否则返回false。
split方法
String[] split(String regex):参数要求传入一个用字符串描述的正则表达式,然后使用该正则表达式描述的字符串规则来匹配当前字符串,并按照满足的部分将字符串拆分。
replaceAll方法
String replaceAll(String regex,String replacement):参数要求传入一个用字符串描述的正则表达式和一个需要替换的字符串,然后使用该正则表达式描述的字符串规则来匹配当前字符串,并将满足的部分替换为需要替换的这个字符串
2. Object
Object类是java中所有类的顶级父类。若我们定义的一个类没有显式的使用extends继承某个类时,默认就是继承自Object的。
Object类型的引用变量可以指向任何类型对象
2.2. toString()方法
2.2.1. 如何重写 toString 方法
既然Object是所有类的顶级父类,那么在Object中定义的方法所有的类都具备。其中之一就是toStirng()方法。
String toString():该方法java希望我们重写时返回一个字符串,这个字符串的原则为:用一个字符串来描述当前对象。
Object实现了toString()方法,返回的是当前对象的“句柄”。
格式为:类的完全限定名@hashcode。
因为Object实现的toString()方法不具备什么实际开发意义,所以若我们需要在子类中使用该方法时通常我们会重写它。
2.2.2. String类重写toString() ------------------------------为什么要重写该方法?????
2.3.1. equals方法
boolean equals():该方法java希望我们重写时返回一个boolean值,表示两个对象间的内容比较是否一致
Object中的方法:作用在于检测一个对象是否等于另一个对象
在Object类中,这个方法判断二个对象是否具有相同的引用,即是否为相同的对象
在实际应用中,一般需要重写该方法,通过比较对象的成员属性,使该方法更有意义
例如:对于Cell类,如果不重写equals方法,默认比较二个对象相同时才返回true
,可以将其重写为:当x和y坐标相等时二个对象就相等,这样更有意义。
2.3.2. 如何重写equals方法
重写equals方法应遵循几个规则:
1.任何对象与null比较都应返回false
2.两个对象不属于同一个类时应返回false
3.同一个对象equals比较应当恒等为true
String重写了equals方法,作用是比较两个字符串对象中保存的字符序列是否完全一致。
2.3.4. equals与 == 的区别
"=="是值比较,对于引用类型变量而言,该变量保存的是对象的地址,所以使用"=="比较时,意思为两个变量的地址是否相等,换句话说就是看两个变量引用的是否为同一个对象
equals是内容比较,对于两个引用变量而言,是比较两个变量所引用的对象内容是否相同。
举个例子, 就好像一对双胞胎,他们是两个独立的个体,是两个对象。所以那么用"=="比较是 false。但是因为他们“长得一样”,所以equals方法比较是true。
我们也可以变相的理解为:"=="是判断是否为同一个,而"equals"是判断像不像。
equals是Object的方法,重写后,可以比较二个对象的内容是否相等
需要注意:Object默认的equals方法的比较规则同 ==
3. 包装类
包装类是不可变类,在构造了包装类对象后,不允许更改包装在其中的值
包装类是final的,不能定义他们的子类。
Number及其主要方法
抽象类Number是Byte 、Double 、Float Integer Long Short类的父类
Number的子类必须提供将表示的数值转换为byte double float int long short
的方法
doubleValue() 以double形式返回指定的数值
intValue() 以int形式返回指定的数值
floatValue 以float形式返回指定的数值
Integer常用功能:
能在int类型和String类型之间相互转化,还提供了一些常量
static int MAX_VALUE int类型最大值
static int MIN_VALUE int类型最小值
Integer的静态方法:parseInt() 用于将字符串转为int
3.1.1. 包装类概述
我们知道java是面向对象的语言,其精髓之一是可以使用多态性,提高程序的灵活度。但是java中有8个基本类型:byte,short,int,long,float,double,char,boolean。它们是以值的形式存在于内存中,而不是对象。它们不是Object的子类,不能参与面向对象的开发。
public class Test{
public static void main(String[] args){
String str = "hello";
doSome(str);//可以,因为String是Object的子类
int i = 1;
//程序编译不通过,原因在于int不是Object的子类,不能使用多态性。
doSome(i);
}
public static void doSome(Object o){
....
}
}
对于8个基本类型,java提供了他们相应的包装类:
基本类型 包装类
byte java.lang.Byte
short java.lang.Short
int java.lang.Integer
long java.lang.Long
float java.lang.Float
double java.lang.Double
char java.lang.Character
boolean java.lang.Boolean
其中除了Character与Boolean的父类是Object之外,其余的都是继承自:java.lang.Number
补充:
正则匹配特殊字符时 * ? . [ ] + - \ | 需要用 \ 进行转意
(0086 | \+86)
(00 | \+)86
正则的意义:
1.正则本身也是字符串
2.用于匹配字符串中字符次序的“规则字符串”
常用API:
String.matches() 规则检查方法
String.split() 切边方法
String.replaceAll() 全局替换
用途:-----------------------------【面试题】
1.用户表单数据检查
2.字符串规则检查(检查是否符合规范)
技巧:
利用开发工具的正则搜索功能检查正则表达式的正确性 Ctrl+F
设计一种规则,来检查字符串是否满足规则
matchs()用于测试字符串 整体 是否符合正则规则
matchs 方法进行整体匹配检查,相当与包含 ^ $边界检查,造成如上检查结果相同,这不是正则表达式的问题,是matchs方法的现象
检查"a"是否符合[abc]规则
/**
*toString() 方法是Object类上定义的方法, 是留给全部子类的方法
*Object 默认的toString方法返回值没有意义
*类名@散列值 JavaSE_day2.Foo@1941dc9 -------------------->包名.类名@散列值 【记住】
*
*为了让子类重写该方法
*
*一般重写该方法,要返回对象的关键数据
*toString()方法的用途:Java的API会自动调用toString方法
*利用这个特点可以简化程序的调试输出,
*例如:println(p)会自动调用toString()
**建议在子类中重写toString方法
*Java 提供的API几乎都重写了toString()方法
*包括:String StringBuilder Date Integer
*/
Point p1=new Point(10,20);
传统做法
System.out.println(p1.x+","+p1.y);
利用toString方法
System.out.println(p1); -------->可以简化程序的调试输出(当参数有50个时,效果就非常明显)
**
* Object 提供了比较二个对象是否相等的方法 equals()
* 1.默认的equals() 方法,不能比较对象中数据是否相等
* 建议子类重写这个方法
* 2.重写时按照关键数据比较二个对象是否相等
== 比较的是变量的值,引用变量的值是地址,也就是==比较的是引用变量的地址值
Object 的equasl方法就是用==比较的,所以建议子类重写为可靠的比较方法
Java提供的API几乎都重写了equals方法
包括:String Integer Date
基本类型数据性能比包装类强
常用的包装类 Integer Double
自动包装拆包
java 5 开始提供自动包装 拆包
//正常方式
Double x=new Double(5.5);
double d=x.doubleValue();
//自动方式
Double n=5.6; //将基本类型 直接赋值给 包装类
double m=n; //将包装类型 自动转为 基本类型