关于API我们在前面已有学习,String、StringBuilder都是之前学习的API
1.Math
1.1 Math概述
1.2 Math类的常用方法
方法名 | 说明 |
---|---|
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 |
public static int max(int a,int b) | 返回两个int值中的较大值 |
public static int min(int a,int b) | 返回两个int值中的较小值 |
public static double pow(double a,double b) | 返回a的b次幂的值 |
public static double random() | 返回值为double的正值,[0.0,1.0) |
使用Math.random实现0-100之间的int随机数
(int)(Math.random()*100) + 1
2.System
2.1 System类概述
System包含几个有用的类字段和方法,他不能被实例化
2.2 System类的常用方法
方法名 | 说明 |
---|---|
public static void exit(int status) | 终止当前运行的Java虚拟机,非零表示异常终止 |
public static long currentTimeMillis() | 返回当前时间(以毫秒为单位) |
对于 currentTimeMills() 有一个应用:
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
System.out.println(i);
}
long end = System.currentTimeMillis();
System.out.println("共耗时:" + (end - start) + "毫秒"); //可以输出这个for循环运行了多少毫秒
3.Object
3.1 Object类的概述
Object是类层次结构的根,每个类都可以将Object作为超类。所有类都直接或者间接的继承自该类
构造方法:public Object()
回想面向对象中,为什么说子类的构造方法默认访问的是父类的无参构造方法?
因为他们的顶级父类只有无参构造方法
看方法的源码,选中方法,按下Ctrl+B
以后写Student这种类时,要重写toString方法。
怎么重写?alt+insert即可,具体为什么要重写,见myInnerClass模块,second.apiDemo包中Student、ObjectDemoToString类
3.2Object类的常用方法
方法名 | 说明 |
---|---|
public String toString() | 返回对象的字符串表示形式。建议所有子类重写该方法,alt+insert自动生成 |
public boolean equals(Object obj) | 比较对象是否相等。默认比较地址,重写可以比较内容,alt+insert自动生成 |
4.Arrays
4.1 冒泡排序
4.2 Arrays类的概述和常用方法
Arrays类包含用于操作数组的各种方法
方法名 | 说明 |
---|---|
public static String toString(int[] a) | 返回指定数组的内容的字符串表示形式 |
public static void sort(int[] a) | 按照数字顺序排列指定的数组 |
工具类的设计思想:
●构造方法用private修饰
●成员用public static修饰
5.基本类型包装类
5.1 基本类型包装类概述
将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据
常用的操作之一:用于基本数据类型与字符串之间的转换
基本数据类型和包装类之间的对应关系
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
Int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
5.2 Integer类的概述和使用
Integer:包装一个对象中的原始类型int的值
方法名 | 说明 |
---|---|
public Integer(int value) | 根据int值创建Integer对象(过时) |
public Integer(String s) | 根据String值创建Integer对象(过时) |
public static Integer valueOf(int i) | 返回表示指定的int值得Integer实例 |
public static Integer valueOf(String s) | 返回一个保存指定值的Integer对象String |
由以下代码可知,Integer无法解析不是数字的字符串
public class IntegerDemo {
public static void main(String[] args) {
// public Integer(int value):根据 int 值创建 Integer 对象 (过时)
Integer i1 = new Integer(100);
System.out.println(i1);
// public Integer(String s):根据String 值创建 Integer对象(过时)
Integer i2 = new Integer("100");
System.out.println(i2);
/*Integer iw = new Integer("abc");
System.out.println(iw);*/ //报错NumberFormatException,由于不是数字的字符串,Integer无法解析
System.out.println("----------以上是通过构造方法来得到Integer对象,只不过过时了不推荐使用----------");
Integer i3 = Integer.valueOf(100);
System.out.println(i3);
Integer i4 = Integer.valueOf("100");
System.out.println(i4);
/* Integer in = Integer.valueOf("abc");
System.out.println(in);*/ //同样报错NumberFormatException,由于不是数字的字符串,Integer无法解析
}
}
5.3 int和String的相互转换
基本类型包装类的最常见操作就是:用于基本类型和字符串之间的相互转换
5.3.1 int 转换为 String
public static String valueOf(int i) :返回 int 参数的字符串表示形式。该方法是 String 类中的方法。
5.3.1 String 转换为 int
public static int parseInt(String s):将字符串解析为int类型。该方法是Integer类中的方法
public class IntegerDemo {
public static void main(String[] args) {
//int --- String
int number = 100;
//方式1 使用字符串加法
String s1 = "" + number;
System.out.println(s1);
//方式2 public static String valueOf (int i)
String s2 = String.valueOf(number);
System.out.println(s2);
System.out.println("--------");
//String --- int
String s = "100";
//方式1 先把String转为Integer 再把Integer转为int类型
//String --- Integer
Integer i =Integer.valueOf(s);
//Integer --- int
//public int intValue()
int num = i.intValue();
System.out.println(num);
//方式2 直接把String转化为int
//public static int parseInt (String s)
int y = Integer.parseInt(s);
System.out.println(y);
}
}
案例:字符串中数据排序
需求:有一个字符串:“91 27 46 38 50”,请写程序实现最终输出结果是:“27 38 46 50 91”
思路:
① 定义一个字符串
② 把字符串中的数字数据存储到一个int类型的数组中
● 得到字符串中每一个数字数据?
public String[] spilt(String regex)
● 定义一个int数组,把String[]数组中的每一个元素存储到int数组中
public static int parseInt(String s)
③ 对int数组进行排序
④ 把排序后的int数组中的元素进行拼接得到一个字符串,这里拼接采用StringBuilder来实现
⑤ 输出结果
public class Demo {
public static void main(String[] args) {
String s = "91 27 46 38 50";
//把字符串中的数字数据存储到一个int类型的数组中
String[] str = (s.split(" "));
//定义一个int数组,把String[] 数组中的每一个元素存储到int数组中
int[] arr = new int[str.length];
for (int i=0;i<str.length;i++){
arr[i] = Integer.parseInt(str[i]);
}
//对int数组进行排序
Arrays.sort(arr);
//把排序后的int数组中的元素进行拼接的到一个字符串,这里拼接采用StringBuilder来实现
StringBuilder sb = new StringBuilder();
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
sb.append(arr[i]);
}else {
sb.append(arr[i]).append(" ");
}
}
//使用toSpring方法得到String类型的结果
String result = sb.toString();
System.out.println(result);
}
}
5.4 自动装箱和拆箱
● 装箱:把基本数据类型转换为对应的包装类类型
● 拆箱:把包装类类型转换为对应的基本数据类型
public class IntegerDemo {
public static void main(String[] args) {
//装箱:把基本数据类型转换为对应的包装类类型
Integer i = Integer.valueOf(100); //装箱
Integer ii = 100; //自动装箱,隐含了Integer.valueOf(100)
//拆箱:把包装类类型转换为对应的基本数据类型
ii.intValue(); //拆箱
ii = ii.intValue() + 100; //拆箱后自动装箱
ii += 100; //自动拆箱后自动装箱
System.out.println(ii);
Integer iii = null;
if (iii != null) {
iii += 300; //NullPointerException
}
}
}
注意: 在使用包装类类型的时候,如果做操作,最好先判断是否为null
推荐的是, 只要是对象,在是用前就必须进行部位null的判断
6.日期类
6.1 Date 类概述和构造方法
注意:此处我们学习的Date类是 util 包下的Date类
Date代表了一个特定的时间,精确到毫秒
方法名 | 说明 |
---|---|
public Date() | 分配一个Date对象,并初始化,以便他代表他被分配的时间,精确到毫秒 |
public Date(long date) | 分配一个Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数 |
示例:
public class DateDemo01 {
public static void main(String[] args) {
//public Date() 分配一个Date对象,并初始化,以便他代表他被分配的时间,精确到毫秒
Date d1 = new Date();
System.out.println(d1); //CST指的是中国标准时间 输出了时间,说明其重写了toString方法
//public Date(long date) 分配一个Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数
long date = 0;
Date d2 = new Date(date);
System.out.println(d2); //输出的是从标准基准时间起经过了参数值毫秒以后是什么时间
}
}
6.2 Date类的常用方法
方法名 | 说明 |
---|---|
public long getTime() | 获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值 |
public void setTime(long time) | 设置时间,给的是毫秒值 |
public class DateDemo {
public static void main(String[] args) {
Date d = new Date();
//public long getTime() 获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值
System.out.println(d.getTime());
System.out.println(d.getTime()*1.0/1000/60/60/24/365);
System.out.println("--------");
//public void setTime(long time) 设置时间,给的是毫秒值
System.out.println(d);
long time = 1000*60*60;
d.setTime(time);
System.out.println(d);
long time1 = System.currentTimeMillis();
d.setTime(time1);
System.out.println(d);
}
}
6.3 SimpleDateFormat 类概述
SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。我们重点学习日期格式化和解析
日期和时间格式由日期和时间模式字符串指定,在日期和时间模式字符串中,从 ‘A’ 到 ‘Z’ 以及从 ‘a’ 到 ‘z’ 引号的字母被解释为表示日期或时间字符串的组件的模式字母
常用的模式字符及对应关系如下:
●y 年
●M 月
●d 日
●H 时
●m 分
●s 秒
6.4 SimpleDateFormat 的构造方法
方法名 | 说明 |
---|---|
public SimpleDateFormat() | 构造一个SimpleDateFormat,使用默认模式和日期格式 |
public SimpleDateFormat(String pattern) | 构造一个SimpleDateFormat使用给定的模式和默认的日期格式 |
6.5 SimpleDateFormat 格式化和解析日期
6.5.1 格式化(从Date到String)
public final String format(Date date):将日期格式化成日期/时间字符串
6.5.2 解析(从String到Date)
public Date parse(String source):从给定字符串的开始解析文本以生成日期
public class SimpleDateFormatDemo {
public static void main(String[] args) throws ParseException { //throws ParseException在后面抛出异常会讲
//格式化,从Date 到 String
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String s = sdf.format(d);
System.out.println(s);
s = sdf1.format(d);
System.out.println(s);
System.out.println("---------");
//解析,从String 到 Date
String ss = "2048-08-09 11:11:11";
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dd = sdf3.parse(ss);
System.out.println(dd);
}
}
案例:日期工具类
需求:定义一个日期工具类(DateUtils),包含两个方法:把日期转换为指定格式的字符串;把字符串解析为指定格式的日期,然后定义一个测试类(DateDemo),测试日期工具类的方法
思路:
① 定义日期工具类(DateUtils)
② 定义一个方法dateToString,用于把日期转换为指定格式的字符串
● 返回值类型:String
● 参数:Date date,String format
③ 定义一个方法StringToDate,用于字符串解析为指定格式的日期
● 返回值类型:Date
● 参数:String s,String format
④ 定义测试类DateDemo,调用日期工具类中的方法
注意 :工具类的定义有几个要点
①构造方法应该是私有的。
②成员方法应该是静态的。
以下给出实现代码:
工具类(DateUtils)
public class DateUtils {
public static String DateToString(Date d,String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(d);
}
public static Date StringToDate(String str,String format) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.parse(str);
}
}
测试类(Demo)
public class Demo {
public static void main(String[] args) throws ParseException {
Date d = new Date();
String str = DateUtils.DateToString(d,"yyyy-MM-dd HH:mm:ss");
System.out.println(str);
System.out.println(DateUtils.DateToString(d,"yyyy-MM-dd"));
Date dd = DateUtils.StringToDate(str,"yyyy-MM-dd HH:mm:ss");
System.out.println(dd);
}
}
6.6 Calendar 类概述
Calendar 为某一时刻和一组日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法
Calendar 提供了一个类方法getInstance用于获取Calendar对象,其日历字段已使用当前日期和时间初始化;
Calendar rightNow = Calendar.getInstance();
Calendar类是一个抽象类,建立对象只有通过多态,具体可以通过查看getInstance的源码来学习。
public class CalendarDemo {
public static void main(String[] args) {
//获取对象
Calendar c = Calendar.getInstance(); //多态的形式
System.out.println(c);
//public int get (int field)
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1; //为什么加一,因为Calendar得到的月份是从0月开始的
int date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
}
}
6.7 Calendar 的常用方法
方法名 | 说明 |
---|---|
public int get(int field) | 返回给定日历字段的值 |
public abstract void add(int field,int amount) | 根据日历的规则,将指定的时间量添加或减去给定的日历字段 |
public final viod set(int year,int month,int date) | 设置当前日历的年月日 |
public class CalendarDemo {
public static void main(String[] args) {
//获取日历对象
Calendar c = Calendar.getInstance();
//public int get(int field) 返回给定日历字段的值
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
//public abstract void add(int field,int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段
//需求1:3年前的今天
c.add(Calendar.YEAR,-3);
//需求2:10年后的5天前
c.add(Calendar.YEAR,+10);
c.add(Calendar.DATE,-5);
//public final void set(int year,int month,int date) 设置当前日历的年月日
c.set(2048,11,11);
}
}
案例:二月天
需求:获取任意一年的二月有多少天
思路:
① 键盘录入任意的年份
② 设置日历对象的年、月、日
● 年:来自键盘录入
● 月:设置为3月,月份是从0开始的,所以设置的值是2
● 日:设置为1日
③ 3月1日往前推一天,就是2月的最后一天
④ 获取这一天的输出即可
public class FebruaryDay {
public static void main(String[] args) {
//键盘录入任意年份
Scanner sc = new Scanner(System.in);
int year = sc.nextInt();
//设置日历的年月日
Calendar c = Calendar.getInstance();
c.set(year,2,1);
c.add(Calendar.DATE,-1);
System.out.println(year + "年的2月份有" + c.get(Calendar.DATE) + "天");
}
}