定义
API(Application Programming Interface)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。也可以理解为是两个应用程序之间通信的机制,或者使用一组规则和协议的组件或计算机硬件。
作用
提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源代码,或理解内部工作机制的细节。简单来说是别人提供功能代码,我们可以直接调用其功能,且不用访问源码,这样更方便于我们开发,减少项目代码量。
1.Object类
1.1 概述
java.lang.Object
类是Java语言中的根类,每个类都使用 Object
作为超类。所有对象(包括数组)都实现这个类的方法。
如果一个类没有特别指定父类, 那么默认则继承自Object类。例如:
public class MyClass /*extends Object*/ {
// ...
}
1.2 native本地方法
在Object类的源码中定义了native
修饰的方法,native
修饰的方法称为本地方法。
本地方法的特点:
-
被native修饰的方法,非Java语言编写,是由C++语言编写。
-
本地方法在运行时期进入本地方法栈内存,本地方法栈是一块独立内存的区域。
-
本地方法的意义是和操作系统进行交互。
private static native void registerNatives();
static {
registerNatives();
}
``
当程序运行的时候,Object类会最先被加载到内存中。类进入内存后首先加载自己的静态成员,static代码块中调用了本地方法registerNatives()
,和操作系统进行交互。
1.3 toString()方法
方法声明:public String toString()
:返回该对象的字符串表示。
Object类toString()方法源码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
源码分析:
getClass().getName()
返回类的全限定名字。hashCode()
方法返回int值,可以暂时理解为对象的内存地址。Integer.toHexString()
将int类型的值转成十六进制。- 因此调用对象的toString()方法将看到内存的地址值。
创建Person类,并调用方法toString()
public static void main(String[] args){
Person person = new Person();
String str = person.toString();
System.out.println(str);
System.out.println(person);
}
结论:toString()方法返回的字符串,包名类名@对象内存地址
输出语句System.out.println(对象); 为默认调用对象的toString方法
通过程序运行,得到结论,在输出语句中打印对象,就是在调用对象的toString()方法。
toString()方法的重写:
toString()的价值:放回类中的成员变量值
由于toString方法返回的结果是内存地址,而在开发中,内存地址并没有实际的应用价值,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person"+name+":"+age;
}
// 省略构造器与Getter Setter
}
1.4 equals方法
方法声明:public boolean equals(Object obj)
:指示其他某个对象是否与此对象“相等”。
Object类equals()方法源码:
public boolean equals(Object obj) {//Object obj可以传任何类型
return (this == obj);
}
源码分析:
- this是当前对象,哪个对象调用的equals方法就表示哪个对象。
- obj表述传递的参数,参数类型Object,可以传递任意类型对象。
- this==obj 比较两个对象的内存地址是否相同
equals方法默认比较两个对象的内存地址是否相同,相同则返回true。
equals()方法的重写:
实际应用中,比较内存地址是否相同并没有意义,我们可以定义对象自己的比较方式,比较对象中成员变量的值是否相同。需要对方法进行重写。
需求:重写equals()方法,比较两个对象中姓名和年龄是否相同,如果姓名和年龄都相同返回true,否则返回false。
public class Person {
private String name;
private int age;
public boolean equals(Object obj){
//判断两个对象地址弱相同,即为同一个对象
if(this == obj)
return true;
//obj对象为空,无需比较,返回false
if(obj == null)
return false;
//obj如果是Person类型对象,则强制转换
if(obj instanceof Person){
Person person = (Person)obj;
//比较两个对象的name属性和age属性,如果相等,返回true
return this.name.equals(person.name) && this.age == person.age;
}
return false;
}
}
2.Date类
java.util.Date
类 表示特定的瞬间,精确到毫秒。1000毫秒等于1秒。
2.1 Date类构造方法
-
public Date()
:从运行程序的此时此刻到时间原点经历的毫秒值,转换成Date对象,分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。 注: 创建日期对象,时间跟随操作系统
-
public Date(long date)
:将指定参数的毫秒值date,转换成Date对象,分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。
public static void main(String[] args) {
// 创建日期对象,把当前的时间
System.out.println(new Date()); // Tue Jan 16 14:37:35 CST 2020
// 创建日期对象,把当前的毫秒值转成日期对象
System.out.println(new Date(0)); // Thu Jan 01 08:00:00 CST 1970
}
2.2 Date类的常用方法
public **long getTime()
把**日期对象转换成对应的时间毫秒值。public void setTime(long time)
把方法参数给定的毫秒值设置给日期对象。
public static void main(String[] args) {
//创建日期对象
Date date = new Date();
//public long getTime()获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值
System.out.println(date.getTime());
//public void setTime(long time):设置时间,给的是毫秒值
date.setTime(0);
System.out.println(date);
}
结果显示:
1596274570383
Thu Jan 01 08:00:00 CST 1970
2.3 日期对象和毫秒值的相互转换
日期是不能进行数学计算的,但是毫秒值可以,在需要对日期进行计算时,可以现将日期转成毫秒值后在进行计算。
- 日期对象转成毫秒值:
Date date = new Date(); date.getTime()
System.currentTimeMillis()
- 毫秒值转成日期对象:
Date date = new Date(long 毫秒值)
date.setTime(long 毫秒值)
3.DateFormat类
java.text.DateFormat
是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。
- 格式化:按照指定的格式,把Date对象转换为String对象。
- 解析:按照指定的格式,把String对象转换为Date对象。
3.1 构造方法
由于DateFormat为抽象类,不能直接使用,所以需要常用的子类java.text.SimpleDateFormat
。这个类需要一个模式(格式)来指定格式化或解析的标准。构造方法为:
public SimpleDateFormat(String pattern)
:用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。
参数pattern是一个字符串,代表日期时间的自定义格式。
常用的格式规则为:
标识字母(区分大小写) | 含义 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 时0-23 |
m | 分 |
s | 秒 |
k 时1-24
备注:更详细的格式规则,可以参考SimpleDateFormat类的API文档。
3.2 转换方法
- String format(Date date)传递日期对象,返回格式化后的字符串。
- Date parse(String str)传递字符串,返回日期对象。
public static void main(String[] args) throws ParseException {
//格式化:从 Date 到 String
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String s = sdf.format(d);
System.out.println(s);
System.out.println("--------");
//从 String 到 Date
String ss = "2048-08-09 11:11:11";
//ParseException
//创建子类对象
//日期格式注意:必须和要转的字符串的格式一致,否则转不了
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dd = sdf2.parse(ss);
System.out.println(dd);
}
运行结果:
2020年08月01日 17:44:32
--------
Sun Aug 09 11:11:11 CST 2048
4. Calendar日历类
4.1 概念
java.util.Calendar`是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性的。
注意:java.util.Calendar`是日历类,日历类是抽象类,不能创建对象,找子类GregerianCalendar
日历字段概念:日历中所包含的内容就是日历字段 (年,月,日… 字段在程序中都是int类型)
4.2 日历对象获取方式
Calendar是抽象类,不能创建对象,需要使用子类对象。java.util.GregorianCalendar
类是Calendar的子类,但是创建日历对象需要根据本地的时区,语言环境来创建,比较困难,Calendar类提供了静态方法 getInstance()直接获取子类的对象。
public static Calendar getInstance()
:使用默认时区和语言环境获得一个日历。
Calendar cal = Calendar.getInstance();
4.3 常用方法
public int get(int field)
:返回给定日历字段的值。public void set(int field, int value)
:将给定的日历字段设置为给定值。public abstract void add(int field, int amount)
:根据日历的规则,为给定的日历字段添加或减去指定的时间量。public Date getTime()
:返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
4.4 日历字段
Calendar类中提供很多静态成员,直接类名调用,代表给定的日历字段:
字段值 | 含义 |
---|---|
YEAR | 年 |
MONTH | 月(从0开始,可以+1使用) |
DAY_OF_MONTH | 月中的天(几号) |
HOUR | 时(12小时制) |
HOUR_OF_DAY | 时(24小时制) |
MINUTE | 分 |
SECOND | 秒 |
DAY_OF_WEEK | 周中的天(周几,周日为1,可以-1使用) |
代码使用简单演示:
public static void main(String[] args) {
// 创建Calendar对象
Calendar cal = Calendar.getInstance();
// 获取年
int year = cal.get(Calendar.YEAR);
//设置年份为2020年
cal.set(Calendar.YEAR, 2020);
//将年份修改为2000年
cal.add(Calendar.YEAR,-20)
//将日历对象转换为日期对象
Date d = cal.getTime();
System.out.println(d);
}
运行结果:
Tue Aug 01 17:49:24 CST 2000
5.System
5.1 概述
java.lang.System
类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作。System类私有修饰构造方法,不能创建对象,直接类名调用。静态调用 System.类名
5.2常用方法:
方法名 | 说明 |
---|---|
public static void exit(int status) | 终止当前运行的 Java 虚拟机,非零表示异常终止 |
public static long currentTimeMillis() | 返回当前时间(以毫秒为单位) 测试类 |
public static void arrayCopy(Object src, int srcPos, Object dest, int destPos, int length) | 从指定源数组中复制一个数组,复制的是数组中的元素 |
public static void gc() | 运行垃圾回收器。 |
参数解释:
src:要复制的源数组
srcPos:源数组的开始索引
dest:复制后的目标数组
descPose:目标数组的开始索引
length: 复制的元素个数
练习:
在控制台输出1-10000,计算这段代码执行了多少毫秒
public static void main(String[] args) {
//获取当前时间毫秒值
System.out.println(System.currentTimeMillis());
//计算程序运行时间
long start = System.currentTimeMillis();
for (int i = 1; i <= 10000; i++) {
System.out.println(i);
}
long end = System.currentTimeMillis();
System.out.println("共耗时毫秒:" + (end - start));
}
5.3 arrayCopy方法:
- Object src:要复制的数据源数组
- int srcPost:数据源数组的开始索引
- Object dest:复制后的目的数组
- int destPos:目的数组开始索引
- int length:要复制的数组元素的个数
练习:数组元素复制
将源数组中从1索引开始,复制3个元素到目的数组中
public static void main(String[] args){
int[] src = {1,2,3,4,5};
int[] dest = {6,7,8,9,0};
//将源数组中从1索引开始,复制3个元素到目的数组中
System.arraycopy(src,1,dest,0,3);
for(int i = 0 ; i < dest.length;i++){
System.out.println(dest[i]);
}
5.4 gc()方法
运行垃圾回收器,JVM将从堆内存中清理对象,清理对象的同时会调用对象的finalize()方法,JVM的垃圾回收器是通过另一个线程开启的,因此程序中的效果并不明显。
6. Arrays
6.1 概述
java.util.Arrays
此类包含用来操作数组的各种方法,比如排序和搜索等。Arrays类私有修饰构造方法,其所有方法均为静态方法,调用起来非常简单。
6.2常用方法
方法名 | 说明 |
---|---|
public static void sort(int[] a) | 对指定的int数组进行升序排列 |
public static int binarySearch(int[] a,int key) | 对数组 进行二分查找法,找不到元素返回(-插入点)-1 |
public static String toString(int[] a) | 将数组转成字符串 |
public static void main(String[] args){
int[] arr = {7,4,5,5,29,51};
//数组升序排列
Arrays.sort(arr);
//数组转成字符串
String arrStr = Arrays.toString(arr);
System.out.println(arrStr);
//数组二分查找
int index = Arrays.binarySearch(arr,9);
System.out.println(index);
}
- [ ]
7.Math类
7.1 概述
java.lang.Math
类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,私有构造方法其所有方法均为静态方法,并且不会创建对象,调用起来非常简单。
7.2 常用方法
方法名 方法名 | 说明 |
---|---|
public static int abs(int a) | 返回参数的绝对值 |
public static double ceil(double a) | 返回大于或等于参数的最小double值,等于一个整数 |
public static double floor(double a) | 返回小于或等于参数的最大double值,等于一个整数 |
public static int round(float a) | 按照四舍五入返回最接近参数的int |
圆周率:Math.PI
幂运算:static double pow(double a,double b) a的b次幂
8. BigInteger类
8.1 概述
java.math.BigInteger
类,不可变的任意精度的整数。如果运算中,数据的范围超过了long类型后,可以使用BigInteger类实现,该类的计算整数是不限制长度的。
8.2 构造方法
BigInteger(String value) 将 BigInteger 的十进制字符串表示形式转换为 BigInteger。超过long类型的范围,已经不能称为数字了,因此构造方法中采用字符串的形式来表示超大整数,将超大整数封装成BigInteger对象。
8.3 常用方法
方法名 | 含义 |
---|---|
add(BigInteger value) | 返回其值为 (this + val) 的 BigInteger,超大整数加法运算 |
subtract(BigInteger value) | 返回其值为 (this - val) 的 BigInteger,超大整数减法运算 |
multiply(BigInteger value) | 返回其值为 (this * val) 的 BigInteger,超大整数乘法运算 |
divide(BigInteger value) | 返回其值为 (this / val) 的 BigInteger,超大整数除法运算,除不尽取整数部分 |
public static void main(String[] args){
BigInteger big1 = new BigInteger("84461511484516161");
BigInteger big2 = new BigInteger("546+64484848484841");
//加法运算
BigInteger add = big1.add(big2);
System.out.println("求和:"+add);
//减法运算
BigInteger sub = big1.subtract(big2);
System.out.println("求差:"+sub);
//乘法运算
BigInteger mul = big1.multiply(big2);
System.out.println("乘积:"+mul);
//除法运算
BigInteger div = big1.divide(big2);
System.out.println("除法:"+div);
}
注:浮点数据在内存中的不精确性
9.BigDecimal类
9.1 概述
java.math.BigDecimal
类,不可变的、任意精度的有符号十进制数。该类可以实现超大浮点数据的精确运算。
9.2 构造方法
BigDecimal(String value)将 BigDecimal的十进制字符串表示形式转换为 BigDecimal。
9.3 常用方法
方法名 | 含义 |
---|---|
add(BigInteger value) | 返回其值为 (this + val) 的 BigInteger,超大整数加法运算 |
subtract(BigInteger value) | 返回其值为 (this - val) 的 BigInteger,超大整数减法运算 |
multiply(BigInteger value) | 返回其值为 (this * val) 的 BigInteger,超大整数乘法运算 |
divide(BigInteger value) | 返回其值为 (this / val) 的 BigInteger,超大整数除法运算,除不尽取整数部分 |
9.4 除法计算
BigDecimal类实现精确的浮点数除法运算,如果两个浮点除法计算后是无限循环,那么就会抛出异常。
除法运算方法:
- BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)
- divesor:此 BigDecimal 要除以的值。
- scale:保留的位数
- roundingMode:舍入方式
- 舍入方式:BigDecimal类提供静态的成员变量来表示舍入的方式
- BigDecimal.ROUND_UP 向上加1。
- BigDecimal.ROUND_DOWN 直接舍去。
- BigDecimal.ROUND_HALF_UP 四舍五入。
public static void main(String[] args){
BigDecimal big1 = new BigDecimal("2.23");
BigDecimal big2 = new BigDecimal("2.24");
//加法计算
BigDecimal add = big1.add(big2);
System.out.println("求和:"+add);
//减法计算
BigDecimal sub = big1.subtract(big2);
System.out.println("求差:"+sub);
//乘法计算
BigDecimal mul = big1.multiply(big2);
System.out.println("乘法:"+mul);
//除法计算
BigDecimal div = big1.divide(big2,2,BigDecimal.ROUND_HALF_UP);
System.out.println(div);
}
10. 正则表达式
正则表达式是对字符串操作的一种规则,事先定义好一些字符串,这些字符串称为规则字符串,使用规则字符串表达一些逻辑功能。
例如:指定一个字符串itheima123@itcast.cn,判断出这个字符串是否符合电子邮件的规则。使用字符串String对象的方法是可以完成的,但是非常复杂,若使用正则表达式则会非常的简单实现。
10.1 正则规则-字符类
规则写法 | 规则含义 |
---|---|
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A到 Z,两头的字母包括在内(范围) |
[0-9] | 0到9,两头的数字包括在内(范围) |
[a-zA-Z0-9] | a 到 z 或 A到 Z或0-9 |
10.2 正则规则-预定义字符类
规则写法 | 规则含义 |
---|---|
. | 任何字符 |
\d | 数字[0-9] |
\D | 非数字 [^0-9] |
\w | 单词字符 [a-zA-Z0-9_] |
\W | 非单词字符[^a-zA-Z0-9_] |
10.3 正则规则-数量词
规则写法 | 规则含义 |
---|---|
X{?} | 一次或一次也没有 |
X{*} | 零次或多次 |
X{+} | 一次或多次 |
X{n} | 恰好 n 次 |
X{n,} | 至少 n 次 |
X{n,m} | 至少 n 次,但是不超过 m 次 |
注意:输出数组元素时会看到存在一个多余空格,Arrays.toString()方法源码中追加的空格。