一、实用类介绍
常用JavaAPI(封装在包里)
- Java.lang
- Enum、包装类、Math、String、StringBuffer、System……
- java.util :工具类
- java.io :输入输出操作
- java.sql : 数据库的操作
- ……
1.1 枚举类型
1.1.1 为什么使用枚举
解决不合理的赋值操作,用枚举数据类型,强制规定输入值的类型。
1.1.2 什么是枚举
【定义】枚举是指由一组固定的常量组成的类
1.1.3 如何使用枚举以及好处
【使用枚举的好处】:
- 类型安全(保证了属性的正确赋值)
- 易于输入
- 代码清晰
public enum Weekend {
Mon,Tus,Wen,Th,Fir,Su
}
二、包装类介绍
2.1 包装类及其作用
2.1.1包装类的概念
- 包装类把基本类型数据转化为对象
- 每个个基本数据类型在Java.lang包中都有个相应的包装类
2.1.2 包装类的作用
- 提供了一系列的使用的方法
- 集合不允许存放基本数据类型数据,存放数字时,会用到包装类型,自动进行装箱操作
2.2 包装类的两种构造方法
- 以每个包装类对应的基本数据类型作为为参数
int iNum = 0;
Integer i = new Integer(iNum);
//此时的i就是Integer类型,就可以调用Integer的方法
注意
Boolean类构造方法参数为String类型的,若该字符串内容为true(不考虑大小写),则该Boolean对象表示true,否则表示false
当给Number包装类构造方法参数为string时,字符串不能为null,则该字符串必须可解析为相应的基本数据类型的数据。否则编译不通过,运行是会抛出NumberFormatException异常。
- 除Charactor类外,其他包装类可以将一个字符串作为参数构造他们的实例参数为字符串
public type(String value)
如:Integer i = new Integer("123");
2.3 包装类的常用方法
- xxxValue()
- toString()
2.3.1 xxxValue()
:包装类转换成基本类型
Integer i1 = new Integer(100);
int ivalue = i.intValue();
System.out.println(i1.equals(ivalue)); //false
Boolean b3 = new Boolean(true);
boolean bvalue = b3.booleanValue();
System.out.println(b3.equals(bvalue)); //true
Double d3 = new Double(100.2);
double dvalue = d3.doubleValue();
System.out.println(d3.equals(dvalue)); //true
Float f3 = new Float(10.2F);
float fvalue = f3.floatValue();
System.out.println(f3.equals(fvalue)); //true
Character c3 = new Character('哈');
char cvalue = c3.charValue();
System.out.println(c3.equals(cvalue)); //true
2.3.2 toString()
:将包装类转化成字符串
//toString()方法是将基本数据类型转化
boolean b4 = true;
String s = Boolean.toString(b4);
System.out.println(s); //true
int num =3;
String s1 = Integer.toString(num);
System.out.println(s1); //3
String sex = Character.toString('男');
System.out.println(sex);
String d5 = Integer.toString(25);
System.out.println(d5);
2.3.3 parseXXX()
:把字符串转化成相应的基本数据类型(Character除外)****
字符串->基本类型
//parseXXX()作用:见字符串转化成基本数据类型
int num4 = Integer.parseInt("36");
Scanner sc = new Scanner(System.in);
System.out.println("请输入分数:");
String score = sc.next();
double d6 = Double.parseDouble(score);
System.out.println(d6 + 10);
2.3.4 valueOf()
:(字符串)->包装类,除Character以外
- valueOf(基本数据类型):基本数据类型->包装类
int i = 90;
Integer j1 = Integer.valueOf(i);
char sex = '男';
Character cSex = Character.valueOf(sex);
- valueOf(字符串):字符串->包装类,除Character以外
如果传入的是String类型的参数,必须要与对应的包装类类型一致,否则会报NumberFormatException异常
String m = "123";
Integer m1 = Integer.valueOf(m);
//编译报错,因为Character不存在valueOf()方法,
String gender = "男";
Character gender2 = Character.valueOf(gender);
2.4 装箱与拆箱(JDK1.5以后)
2.4.1 装箱操作
装箱:将基本数据类型转化成对应的包装类的对象(JDK自动完成)
1、valueOf
2、构造方法
2.4.2 拆箱操作
拆箱:包装类对象转化成基本数据类型的值(JDK自动完成)
注意:
包装类型并不是替换基本数据类型,在基本数据类型要用对象类型表示的时候(比如对集合添加int类型的时候)
[三、Math 类](###3.2 Math类详解)
3.1 Java.util.Math类
Math类提供了常用的数学运算方法和两个静态常量E(自然对数的底数)和PI(圆周率)
常用方法
方法返回值 | 方法的描述 |
| |
| |
| |
| |
| |
| |
| |
注意
Random方法使用:
double random = Math.random(); random*=10; random = (int) random+1; System.out.println(random);
四、 Random类
4.1 Random概述
在API里是这样描述的:
此类的实例用于生成伪随机数流。此类使用 48 位的种子。
java.util.lang
注:
种子就把他看作是一个数列的序列,在这个序列中生成随机数,使用nextInt(int bound)生成在bound范围内的随机数
用同一个种子值初始两个Random对象,然后用每个对象调用相同的方法,得到的随机数一定是相同的。
import java.util.*;
class TestRandom {
public static void main(String[] args) {
//步骤一:创建raandom对象
Random random1 = new Random(100);
//步骤二: 调用方法
System.out.println(random1.nextInt());
System.out.println(random1.nextFloat());
System.out.println(random1.nextBoolean());
Random random2 = new Random(100);
System.out.println(random2.nextInt());
System.out.println(random2.nextFloat());
System.out.println(random2.nextBoolean());
}
}
五、String类****
5.1 String(字符串常量)概述
【在API中是这样描述】:
String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
java.lang.String:
5.2 创建字符串的两种方式及区别
2.1、直接赋值方式创建对象
直接赋值方式创建对象是在方法区的常量池
String str="hello";//直接赋值的方式
2.2、通过构造方法创建字符串对象
通过构造方法创建字符串对象是在堆内存
String str=new String("hello");//实例化的方式
2.3、两种实例化方式的比较
1)编写代码比较
public class TestString {
public static void main(String[] args) {
String str1 = "Lance";
String str2 = new String("Lance");
String str3 = str2; //引用传递,str3直接指向st2的堆内存地址
String str4 = "Lance";
/**
* ==:
* 基本数据类型:比较的是基本数据类型的值是否相同
* 引用数据类型:比较的是引用数据类型的地址值是否相同
* 所以在这里的话:String类对象==比较,比较的是地址,而不是内容
*/
System.out.println(str1==str2);//false
System.out.println(str1==str3);//false
System.out.println(str3==str2);//true
System.out.println(str1==str4);//true
}
}
可能这里还是不够明显,构造方法实例化方式的内存图:String str = new String(“Hello”);
首先:
当我们再一次的new一个String对象时:
3)字符串常量池
在字符串中,如果采用直接赋值的方式(String str=“Lance”)进行对象的实例化,则会将匿名对象“Lance”放入对象池,每当下一次对不同的对象进行直接赋值的时候会直接利用池中原有的匿名对象,
这样,所有直接赋值的String对象,如果利用相同的“Lance”,则String对象==返回true;
比如:对象手工入池
public class TestString {
public static void main(String args[]){
String str =new String("Lance").intern();//对匿名对象"hello"进行手工入池操作
String str1="Lance";
System.out.println(str==str1);//true
}
}
总结:两种实例化方式的区别
1)直接赋值(String str = “hello”):只开辟一块堆内存空间,并且会自动入池,不会产生垃圾。
2)构造方法(String str= new String(“hello”);):会开辟两块堆内存空间,其中一块堆内存会变成垃圾被系统回收,而且不能够自动入池,需要通过public String intern();方法进行手工入池。
在开发的过程中不会采用构造方法进行字符串的实例化。
避免空指向
首先了解: == 和public boolean equals()比较字符串的区别
==在对字符串比较的时候,对比的是内存地址,
equals比较的是字符串内容,在开发的过程中,equals()通过接受参数,可以避免空指向。
举例:
String str = null; if(str.equals("hello")){//此时会出现空指向异常 ... } if("hello".equals(str)){//此时equals会处理null值,可以避免空指向异常 ... }
6)String类对象一旦声明则不可以改变;而改变的只是地址,原来的字符串还是存在的,并且产生垃圾(GC)
5.2 String常用的方法
5.1 StringBuffer类
【API给出的定义是】:
线程安全的可变字符序列。
说明:
使用String类型的缺点:我们如果对字符串进行拼接操作,每次拼接都会构成一个新的String对象,既耗时,又浪费空间
5.2 StringBuffer、StringBuilder 与String的区别:
相同点:都是用来引用字符串的
Stringbuffer与StringBuilder区别:
区别 | StringBuffer | StingBuilder |
线程是否安全 | 线程安全 | 线程不安全 |
StringBuffer与String的区别:
区别 | StringBuffer | String |
内容长度是否可变 | 可变,且初始容量16,增加容量在同一个容器中 | 不可变,每次都生成新的对象 |
5.2 StringBuild类
六、System类
6.1 字段
- err:标准输出流(错误提示)
- out:标准输出流(正常)
- in:标准输入流
6.2 方法
方法返回值 | 方法的描述 |
| |
| |
| |
七、日期操作类
7.1 Date类
java.util.Date类:表示日期和时间
- 提供了操作日期和时间各组成部分的方法
java.util.SimpleDateFormat类
- 用于定制日期时间的格式
【示例】
//创建日期对象
Date date = new Date();
//定制日期时间格式
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = format.format(date);
System.out.println(now);
在美国语言环境中解释日期和时间模式
日期和时间模式 | 结果 |
| |
| |
| |
| |
| |
| |
| |
| |
| |
7.2 Calendar类**
7.3 DataFormat类
7.4 SimpleDateFormat类**
7.5 DecimalFormat类**
八、 正则表达式(regular Expression)
8.1 概述
8.1.1 为什么要学习正则表达式?
- 文本的复杂处理
8.1.2 正则表达式的优势与用途?
- 一种强大的而且灵活的文本处理工具
- 大部分编程语言、数据库、文本编辑器、开发环境都支持正则表达式。
8.1.3 正则表达式的定义:
- 正则就是描述一个规则,通过这个规则可以匹配到一些字符串
- 学习正则表达式很大程度上就是学习表达式的语法规则
8.2 使用流程
- 分析所需要匹配的数据,写出测试用的典型数据
- 在工具软件中进行匹配
- 在程序调用通过测试的正则表达式
8.1 基础语法
8.1.1 普通字符
- 字母、数字、汉字、下划线、以及没有特殊含义的标点符号,都是“普通字符”。表达式中的普通的字符,在匹配一个字符的时候,匹配与之相同的一个字符
简单的转义字符
正则表达式 | 含义 |
\n | 代表换行 |
\t | |
\ | |
^,$, | 匹配这些字符本身 |
| |
| |
| |
| ``匹配空白符(包括空格,制表符,换行符等空白符任意一个)` |
| |
8.1.2 自定义字符
[]
:方括号匹配括号中的任意一个字符
正则表达式 | 含义 |
[ab5@] | 匹配 a或b或c或@ |
[^abc] | 匹配"a",“b”,"c" |
[f-k] | 匹配"f"~"k"之间的任意一个字符 |
[^A-F0-3] | 匹配“A”-“F”,“0”-“3”之外的任意个字符 |
8.1.3 量词
量词描述了一个模式匹配文本的方式,包含:
- 贪婪型:量词默认的是贪婪模式,发现尽可能多的匹配
- 非贪婪型:通过?指定,匹配最小的字符数
- 占有型:通过+指定,当用于字符串时防止匹配失败时回溯
正则表达式 | 含义 |
{n} | 表示重复n次 |
{m,n} | 表达式至少重复m次,最多重复n次 |
{m,} | 表达式至少重复m次 |
| 匹配表达式0次或者1次,相当于{0,1} |
| 表达式至少出现1次,相当于{1,} |
| 表达式不出现或者出现任意次,相当于{0,} |
注意:
- 匹配次数中的贪婪模式(匹配的字符越多越好,默认!)
- 匹配的次数中的非贪婪模式(匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个?号)
8.1.4 逻辑操作符
组合一个或多个表达式,通过逻辑操作符实现。
正则表达式 | 含义 |
XY | Y跟在X后面,并且XY同时满足 |
X|Y | X或者Y |
(X) | ()表示捕获组(group),可以对组group进行处理,尤其是获取其中的内容 |
8.1.5 字符边界
- (本组标记匹配的不是字符而是位置,符合某种条件的位置)
正则表达式 | 含义 |
^ | 与字符串开始的地方匹配 |
$ | 与字符串结束的地方匹配 |
\b | 匹配一个单词边界 |
- \b匹配这样一个位置,前面的字符和后面的字符不全是\w
8.1.6 匹配模式
IGNORECASE 忽略大小写
- 匹配时忽略大小写
- 默认情况下,正则表达式要匹配区分大小写的
SINGLELINE 单行模式
- 整个文本看成一个字符串,只有一个开头和结尾
MULTILINE 多行模式
- 每行都是一个字符串,都有开头和结尾
- 在指定了MUTILINE之后,如果需要仅匹配字符串开始和结束位置,可以使用\A与\Z
\Aa b\Z
测试文本
aguhub
agihujb
aikb
an>。表达式中的普通的字符,在匹配一个字符的时候,匹配与之相同的一个字符
简单的转义字符
正则表达式 | 含义 |
\n | 代表换行 |
\t | |
\ | |
^,$, | 匹配这些字符本身 |
| |
| |
| |
| ``匹配空白符(包括空格,制表符,换行符等空白符任意一个)` |
| |
8.1.2 自定义字符
[]
:方括号匹配括号中的任意一个字符
正则表达式 | 含义 |
[ab5@] | 匹配 a或b或c或@ |
[^abc] | 匹配"a",“b”,"c" |
[f-k] | 匹配"f"~"k"之间的任意一个字符 |
[^A-F0-3] | 匹配“A”-“F”,“0”-“3”之外的任意个字符 |
8.1.3 量词
量词描述了一个模式匹配文本的方式,包含:
- 贪婪型:量词默认的是贪婪模式,发现尽可能多的匹配
- 非贪婪型:通过?指定,匹配最小的字符数
- 占有型:通过+指定,当用于字符串时防止匹配失败时回溯
正则表达式 | 含义 |
{n} | 表示重复n次 |
{m,n} | 表达式至少重复m次,最多重复n次 |
{m,} | 表达式至少重复m次 |
| 匹配表达式0次或者1次,相当于{0,1} |
| 表达式至少出现1次,相当于{1,} |
| 表达式不出现或者出现任意次,相当于{0,} |
注意:
- 匹配次数中的贪婪模式(匹配的字符越多越好,默认!)
- 匹配的次数中的非贪婪模式(匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个?号)
8.1.4 逻辑操作符
组合一个或多个表达式,通过逻辑操作符实现。
正则表达式 | 含义 |
XY | Y跟在X后面,并且XY同时满足 |
X|Y | X或者Y |
(X) | ()表示捕获组(group),可以对组group进行处理,尤其是获取其中的内容 |
8.1.5 字符边界
- (本组标记匹配的不是字符而是位置,符合某种条件的位置)
正则表达式 | 含义 |
^ | 与字符串开始的地方匹配 |
$ | 与字符串结束的地方匹配 |
\b | 匹配一个单词边界 |
- \b匹配这样一个位置,前面的字符和后面的字符不全是\w
8.1.6 匹配模式
IGNORECASE 忽略大小写
- 匹配时忽略大小写
- 默认情况下,正则表达式要匹配区分大小写的
SINGLELINE 单行模式
- 整个文本看成一个字符串,只有一个开头和结尾
MULTILINE 多行模式
- 每行都是一个字符串,都有开头和结尾
- 在指定了MUTILINE之后,如果需要仅匹配字符串开始和结束位置,可以使用\A与\Z
\Aa b\Z
测试文本
aguhub
agihujb
aikb
PS:笔记先记这么多,日后补充。