常用API【2】
1.Math类
1.1 Math类概述
Math包含执行基本数字运算的方法
没有构造方法,如何使用类中的成员呢? 看类的成员是否是静态的,如果是,可以通过类名直接调用
1.2Math类的常用方法
public class MyMathDemo01 { public static void main(String[] args) { //返回参数的绝对值 System.out.println(Math.abs(88)); System.out.println(Math.abs(-88)); System.out.println("***********************"); //返回大于等于参数的最小的double值,等于一个整数 System.out.println(Math.ceil(12.65)); System.out.println(Math.ceil(12.15)); System.out.println("******************"); //返回小于或等于参数的最大double值,等于一个整数 System.out.println(Math.floor(12.45)); System.out.println(Math.floor(12.78)); System.out.println("*******************"); //按着四舍五入返回最接近参数的int System.out.println(Math.round(10.50F)); System.out.println(Math.round(10.15F)); System.out.println("*****************"); //返回连个int值中的较大值 System.out.println(Math.max(12,35)); System.out.println("*****************"); //返回连个int值中的较大值 System.out.println(Math.min(213,56)); System.out.println("**************"); //返回a的b次幂的值 System.out.println(Math.pow(2.0,5.0)); System.out.println("*************"); //返回值为double的正值, [0.0,1.0) System.out.println(Math.random()); System.out.println(Math.random()*100);//double类型的 System.out.println((int)(Math.random()*100));// 0-99的整数 System.out.println((int)(Math.random()*100)+1);// 0-100的整数 } }
public class MyMathDemo01 { public static void main(String[] args) { //返回参数的绝对值 System.out.println(Math.abs(88)); System.out.println(Math.abs(-88)); System.out.println("***********************"); //返回大于等于参数的最小的double值,等于一个整数 System.out.println(Math.ceil(12.65)); System.out.println(Math.ceil(12.15)); System.out.println("******************"); //返回小于或等于参数的最大double值,等于一个整数 System.out.println(Math.floor(12.45)); System.out.println(Math.floor(12.78)); System.out.println("*******************"); //按着四舍五入返回最接近参数的int System.out.println(Math.round(10.50F)); System.out.println(Math.round(10.15F)); System.out.println("*****************"); //返回连个int值中的较大值 System.out.println(Math.max(12,35)); System.out.println("*****************"); //返回连个int值中的较大值 System.out.println(Math.min(213,56)); System.out.println("**************"); //返回a的b次幂的值 System.out.println(Math.pow(2.0,5.0)); System.out.println("*************"); //返回值为double的正值, [0.0,1.0) System.out.println(Math.random()); System.out.println(Math.random()*100);//double类型的 System.out.println((int)(Math.random()*100));// 0-99的整数 System.out.println((int)(Math.random()*100)+1);// 0-100的整数 } }
2. System类
2.1 System类概述
System包含几个有用的类字段和方法,它不能被实例化
public class SystemDemo01 { public static void main(String[] args) { /*System.out.println("开始"); //终止当前运行的Java虚拟机,非零表示异常终止 System.exit(0); System.out.println("结束");*/ //返回当前时间(以毫秒为单位) System.out.println(System.currentTimeMillis()); //据1970年共多少年 System.out.println(System.currentTimeMillis()*1.0/1000/60/60/24/365+"年"); //运行一个程序所用的时间 long start = System.currentTimeMillis(); for (int i = 0; i < 10000; i++) { System.out.println(i); } long end = System.currentTimeMillis(); System.out.println("共耗时"+(end - start) + "毫秒"); } }
3.Object类
3.1 Object类的概述
Object是类层次结构的根,每个类都可以将Object作为超类,所有类都直接或者间接的继承自该类
构造方法: public Object()
为什么说子类的构造方法默认访问的是父类的无参构造方法?
因为他们的顶级父类只有无参构造方法
实体类
public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Student() { } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
测试类
/* 建议所有子类重写toString方法 */ public class ObjectDemo { public static void main(String[] args) { Student s = new Student(); s.setName("浪浪"); s.setAge(20); System.out.println(s);//未重写toString()时,com.lang_01.Student@4554617c System.out.println(s.toString());//未重写toString()时,com.lang_01.Student@4554617c /* public void println(Object x) { //x = s String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }*/ /* public static String valueOf(Object obj) { obj =x return (obj == null) ? "null" : obj.toString(); }*/ /*public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }*/ } }
3.2 Object类的常用方法
实体类
public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Student() { } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public boolean equals(Object o) { /* this ----s1 o ---- s2 */ //判断地址是否相同,如果相同,直接范湖true if (this == o) { return true; } //判断参数是否为null //判断对象是否来自一个类 if (o == null || getClass() != o.getClass()) { return false; } //向下转型 Student student = (Student) o; //student = S2; //比较年龄是否相同 if (age != student.age) { return false; } //比较姓名是否相同 return name != null ? name.equals(student.name) : student.name == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } }
测试类
public class ObjectDemo01 { public static void main(String[] args) { Student s1 = new Student(); s1.setName("浪浪"); s1.setAge(20); Student s2 = new Student(); s2.setName("浪浪"); s2.setAge(20); //需求: 比较两个对象的内容是否相同 System.out.println(s1 == s2);//false System.out.println(s1.equals(s2));//未重写实体类中的equals()方法时,结果为:false /* public boolean equals(Object obj) { //this ---- s1 //obj ----- s2 return (this == obj); } */ } }
4.Arrays类
4.1 冒泡排序
排序:将一组数据按照固定的规则进行排列
-
如果有n个数据进行排序,总共需要比较n-1次
-
每一次比较完毕,下一次比较就会少一个数据
冒泡排序:一种排序的方式,对要进行排列的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有数据进行操作,直至所有数据按照要求完成排序
public class ArrayDemo { public static void main(String[] args) { //定义一个数组 int[] arr = {24, 45, 92, 14, 64}; System.out.println("排序前:"+ arrayToString(arr)); /*//第一次比较 for (int i = 0; i<arr.length-1;i++){ if (arr[i] > arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } System.out.println("第一次比较后:"+arrayToString(arr)); //第二次比较 for (int i = 0; i<arr.length-1-1;i++){ if (arr[i] > arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } System.out.println("第二次比较后:"+arrayToString(arr)); //第三次比较 for (int i = 0; i<arr.length-1-2;i++){ if (arr[i] > arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } System.out.println("第三次比较后:"+arrayToString(arr)); //第四次比较 for (int i = 0; i<arr.length-1-3;i++){ if (arr[i] > arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } System.out.println("第四次比较后:"+arrayToString(arr));*/ //优化后 for (int x = 0; x < 4; x++) { for (int i = 0; i < arr.length-1-x; i++) { if (arr[i]>arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } } System.out.println("优化后:"+ arrayToString(arr)); } //把数组中的元素按照指定的规则组成一个字符串:【元素1,元素2】 public static String arrayToString(int[] arr){ StringBuilder sb = new StringBuilder(); sb.append("["); for (int i = 0; i < arr.length; i++) { if (i == arr.length-1){ sb.append(arr[i]); }else { sb.append(arr[i]).append(","); } } sb.append("]"); String s = sb.toString(); return s; } }
4.2 Arrays 类的概述和常用方法
工具类的设计思路:
-
构造方法用private修饰
-
成员用public static修饰
5.基本类型包装类
5.1基本类型包装类概述
将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据常用的操作之一:用于基本类型与字符串之间的转换
5.2 Integer 类的概述和使用(列举一种)
Integer:包装一个对象中的原始类型int值
public class IntegerDemo { public static void main(String[] args) { //根据int值创建Integer 对象(过时)【不建议使用】 Integer i1 = new Integer(100); System.out.println(i1); //根据String值创建Integer对象(过时)【不建议使用】 //Integer i2 = new Integer("abc");//java.lang.NumberFormatException Integer i2 = new Integer("100"); System.out.println(i2); //返回表示指定的int值的Integer实例【推荐使用】 Integer i3 = Integer.valueOf(100); System.out.println(i3); //返回一个保存指定值的Integer对象String【推荐使用】 Integer i4 = Integer.valueOf("1010"); System.out.println(i4); } }
5.3 int 和String的相互转换
基本类型包装类的最常见操作就是:用于基本类型和字符串之间的相互转换
1.int 转换为 String
public static String valueOf(int i): 返回int参数的字符串表示形式。该方法是String类中的方法
2.String 转换为 int
public static int parseInt(String s): 将字符串解析为int类型。该方法时Integer类中的方法
/* int和String的相互转换 */ public class IntegerDemo { public static void main(String[] args) { //int -----String int number = 100; //方式1 String s1 = "" + number; System.out.println(s1); //方式2 String s2 = String.valueOf(number); System.out.println(s2); System.out.println("******************"); //String ------ int String s = "100"; //方式1 int i = Integer.valueOf(s); System.out.println(i); //方法2 int i1 = Integer.parseInt(s); System.out.println(i1); //方法3 String ---- Integer ---- int Integer x = Integer.valueOf(s); int i2 = x.intValue(); System.out.println(i2); }
字符串中数据排列
需求:有一个字符串:“91 26 79 65 20” ,请写程序实现最终输出结果是:“20 26 65 79 91”
思路:
1.定义一个字符串
2.把字符串中的数字数据存储到一个int类型的数组中
① 得到字符串中每一个数字数据
public String[] split(String regex)
② 定义一个int数组,把String[] 数组中的每一个元素存储到int数组中
public static int parseInt(String s)
③ 对int数组进行排序
④ 把排序后的int数组中的元素进行拼接得到一个字符串,这里拼接采用StringBuilder来实现
⑤ 输出结果
public class IntegerTest { public static void main(String[] args) { //定义一个字符串 String s = "91 26 79 65 20"; //把字符串中的数字数据存储到一个int类型的数组中 String[] strArray = s.split(" "); /*for (int i = 0; i < strArray.length; i++) { System.out.println(strArray[i]); }*/ //定义一个int数组,把String[] 数组中的每一个元素存储到int数组中 int[] arr = new int[strArray.length]; for (int i = 0; i<arr.length; i++){ arr[i] = Integer.parseInt(strArray[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(" "); } } String result = sb.toString(); System.out.println("result:"+result); } }
5.4 自动装箱和拆箱
-
装箱:把基本数据类型转换为对应的包装类类型
-
拆箱:把包装类类型转换为对应的基本数据类型
注意: 在使用包装类类型的时候,如果做操作,最好先判断是否为null
我们推荐的是,只要是对象,在使用前就必须进行不为null的判断
public class IntegerDemo { public static void main(String[] args) { //装箱: 把基本类型数据转为对应的包装类型 Integer i = Integer.valueOf(100); Integer ii = 100;//Integer.valueOf(100); //拆箱:把包装类型转换为对应的基本数据类型 //ii = ii.intValue() + 200; ii += 100; System.out.println(ii); Integer iii = null; if (iii!= null){ iii += 300;//不判断会报错,java.lang.NullPointerException } System.out.println(iii); } }
日期类
6.1 Date 类概述和构造方法
Date代表了一个特定的时间,精确到毫秒
public class MyDateDemo { public static void main(String[] args) { //分配一个Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒 Date d1 = new Date(); System.out.println(d1); //分配一个Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数 long date = 1000*60*60; Date d2 = new Date(date); System.out.println(d2); } }
6.2 Date 类的常用方法
public class MyDateDemo02 { public static void main(String[] args) { //创建日期对象 Date d = new Date(); //getTime()获取的是时间对象从1970年1月1日 00:00:00:到现在 System.out.println(d.getTime()); System.out.println(d.getTime()*1.0/1000/60/60/24/365); //setTime(long time) 设置时间,给的是毫秒值 long time = System.currentTimeMillis(); d.setTime(time); System.out.println(d); } }
6.3 SimpleDateFormat 类概述
SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。我们重点学习日期格式化和解析
日期和时间格式由日期和时间模式字符串指定,在日期和时间模式字符串中,从’A’ 到 ‘Z’ 以及从 ‘a’ 到 ‘z’ 引号的字母被解释为表示日期或时间字符串的组件的模式字母
-
y 年
-
M 月
-
d 日
-
H 时
-
m 分
-
s 秒
6.4 SimpleDateFormat 的构造方法
6.5 SimpleDateFormat 格式化和解析日期
1. 格式化(从Date 到 String)
public final String format(Date date): 将日期格式化成日期/时间字符串
2. 解析(从 String 到 Date)
public Date parse(String source): 从给定字符串的开始解析文本以生成日期
public class SimpleDateFormatDemo { public static void main(String[] args) throws ParseException { //格式化: 从 Date 到 String Date d = new Date(); //SimpleDateFormat sdf = new SimpleDateFormat(); 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 = "2020-09-08 17:11:25"; SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /* java.text.ParseException: 给它的类型 得和你设置的类型一样才能解析到 */ Date dd = sdf2.parse(ss); System.out.println(dd); }
日期工具类
需求:定义一个日期工具类(DateUtils),包含两个方法,把日期转换为指定格式的字符串;把字符串解析为指定格式日期,然后定义一个测试类(DateDemo),测试日期工具类的方法
思路:
① 定义日期工具类(DateUtils)
② 定义一个方法dateToString,用于把日期转换为指定格式的字符串
-
返回值类型:String
-
参数:Date date,String format
③ 定义一个方法stringToDate,用于字符串解析为指定格式的日期
-
返回值类型:Date
-
参数:String s , String format
④ 定义测试类DateDemo,调用日期工具类中的方法
时间工具类
/* 工具类 构造方法私有 成员方法静态 */ public class DateUtils { public DateUtils() { } /* 定义一个方法dateToString,用于把日期转换为指定格式的字符串 返回值类型:String 参数:Date date,String format */ public static String dateToString(Date date, String format){ SimpleDateFormat sdf = new SimpleDateFormat(format); String s = sdf.format(date); return s; } /* 定义一个方法stringToDate,用于字符串解析为指定格式的日期 返回值类型:Date 参数:String s , String format */ public static Date StringToDate(String s,String format) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat(format); Date d = sdf.parse(s); return d; } }
public class DateDemo { public static void main(String[] args) throws ParseException { //创建一个时间对象 Date d = new Date(); String s1 = DateUtils.dateToString(d,"yyyy年MM月dd日 HH:mm:ss"); System.out.println(s1); String s2 = DateUtils.dateToString(d,"yyyy年MM月dd日"); System.out.println(s2); String s3 = DateUtils.dateToString(d,"HH:mm:ss"); System.out.println(s3); System.out.println("**********************"); //需格式一致 String s = "2020-09-08 17:32:20"; Date dd = DateUtils.StringToDate(s,"yyyy-MM-dd HH:mm:ss"); System.out.println(dd); } }
6.6 Calendar 类概述
calendar为某一时刻和一组日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法
calendar提供了一个类方法getInstance用于获取Calendar对象,其日历字段已使用当前日期和时间初始化:
calendar rightNow = 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 mouth = c.get(Calendar.MONTH)+1; //Calendar.MONTH 范围是 0-11 int date = c.get(Calendar.DATE); System.out.println(year + "年" + mouth + "月" + date + "日"); } }
6.7 Calendar 的常用方法
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 mouth = c.get(Calendar.MONTH)+1; //Calendar.MONTH 范围是 0-11 int date = c.get(Calendar.DATE); System.out.println(year + "年" + mouth + "月" + date + "日");*/ //add()根据日历的规则,将制定的时间量添加或减去给定的日历字段 //需求一:3年前的今天 /*c.add(Calendar.YEAR,-2); int year = c.get(Calendar.YEAR); int mouth = c.get(Calendar.MONTH)+1; //Calendar.MONTH 范围是 0-11 int date = c.get(Calendar.DATE); System.out.println(year + "年" + mouth + "月" + date + "日");*/ //需求2:10年后的5天前 c.add(Calendar.YEAR,10); c.add(Calendar.DATE,-5); int year = c.get(Calendar.YEAR); int mouth = c.get(Calendar.MONTH)+1; //Calendar.MONTH 范围是 0-11 int date = c.get(Calendar.DATE); System.out.println(year + "年" + mouth + "月" + date + "日"); //set(int year,int month,int date) 设置当前日历的年月日 c.set(2048,11,11); int y = c.get(Calendar.YEAR); int m = c.get(Calendar.MONTH)+1; int d = c.get(Calendar.DATE); System.out.println(y + "年" + m + "月" + d + "日" ); } }
二月天
需求:获取任意一年的二月有多少天
思路:
①键盘录入任意的年份
②设置日历对象的年、月、日
-
年:来自于键盘录入
-
月:设置为3月,月份是从0开始的,所以设置的值是2
-
日:设置为1日
③ 3月1日往前推一天,就是2月的最后一天
④获取这一天输出即可
public class calendarTest { public static void main(String[] args) { //从键盘录入任意的年份 Scanner sc = new Scanner(System.in); System.out.println("输入年份:"); int year = sc.nextInt(); //设置日历对象的年、月、日 Calendar c = Calendar.getInstance(); c.set(year,2,1); //3月1日往前推一天,就是2月的最后一天 c.add(Calendar.DATE,-1); //获取这一天输出即可 int date = c.get(Calendar.DATE); System.out.println(year+"年的2月份有" + date + "天"); } }