Java - 常用API
一、Object
概述
java.lang.Object 类是Java语言中的根类,即所有类的父类。
常用方法
Object中有11个可被子类继承的方法,常用的有equals方法、toString方法等。
public String toString():返回该对象的字符串表示。
默认返回,“对象的类型名+@+内存地址值”字符串形式。子类可以通过重写获取自己想要的字符串内容。
public boolean equals(Object obj):判断指定对象(参数)是否与此对象(调用者)“相同”。
默认返回,通过==运算符对地址值做比较后,获取的比较结果
打印类的对象信息(变量名),其实就是系统自动调用了变量名.toString( ) 方法打印的,所以打印对象信息直接打印对象变量名就行。
Object类方法重写
<1> 重写 toString() 方法 - 为了更好地展示对象的信息,原有的太简陋了,所以要重写优化。
按照需要,展示指定类中的内容,若不重写则展示地址值。输出语句中展示的内容,均为指定对象的字符串形式。
快捷方式:alt+insert --> toString() --> 选择要展示的成员 --> OK
<2> 重写equals (xxx) 方法 - 不重写的话,由于系统默认的equals 方法比较的是两个对象的地址,不够好,因为我们去比较对象,还是想看他们的内容是否相同,比如两个学生对象,我想看的是,他们的年龄,姓名是否相同,尽管地址不同,很正常没关系,我主要看内容,所以要重写。
按照需要,将两个对象按照指定规则进行比较,若不重写则通过地址值比较。
① 比较两个对象的地址值是否相同,如果相同,返回true ② 如果参数为空,或者类型不一致,返回false ③ 将参数转换为当前类型 ④ 比较两个对象的内容是否相同,并返回比较结果。
快捷方式:alt+insert --> equals and hashcode --> 选择要比较的成员 --> OK
代码优化:java.util.Objects,JDK7添加的工具类。由nullsave(空指针安全)或nulltolerant(容忍空指针)两类方法组成。
注意事项:
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; if (age != student.age) return false; return name != null ? name.equals(student.name) : student.name == null; }
只赋值年龄,姓名不赋值那它的值默认为null ,那么它调用equals 方法会报错,所以为了解决它有两种办法:直接用JDK 7+ 之后的Objects的静态方法进行比较,也可以把它的判断语句直接抄过来
快捷方式,idea会展示两种,一个是JDK提供的Objects的静态方法,但是会多导一个包,浪费空间;另外一种是idea 提供的,它是直接把判断语句抄过来的,不用导包,节省空间,推荐。
二、Date(时间类)
标准基准时间:【历元(epoch):1970年1月1日00:00:00 GMT)】,也称为时间原点。
java.util.Date类 表示自时间原点以来,特定的瞬间所经历的毫秒值。
构造方法
获取当前日期
public Date() : 运行时刻 - 时间原点,得到经过了多少毫秒,再换算成经过了多少年,多少月这样的格式
获取指定日期,参数是从时间原点开始经过的毫秒数
public Date(long date) : 时间原点+形参(经过的毫秒),得到总毫秒,再换算成经过了多少年,多少月这样的格式
常用功能
public long getTime () 把日期对象转换成对应的时间毫秒值。
public void setTime (long time) 把方法参数给定的毫秒值设置给日期对象 - 会覆盖,直接重新算
三、DateFormat (时间格式转换类)
概述
- java.text.DateFormat 该类可以使得在Date对象与String对象之间进行来回转换。
构造方法
DateFormat为抽象类,需要使用其子类 java.text.SimpleDateFormat 创建对象。
public SimpleDateFormat (String pattern):创建给定模式和默认语言环境日期格式符号转换对象。
常用功能
public String format ( Date date):(格式化)按照指定的格式,把Date对象转换为String对象。
public Date parse ( String source):(解析)按照指定的格式,把String对象转换为Date对象。
转换的时候要定义一个模板,便于对象获取值,不然它看不懂,互相转换时要遵循同一个模板。
案例 - 注意格式文本中的 MM(月份)与 HH(小时) 是大写的,月份是因为要和分钟区分,小时是因为大小写代表不同的意思,小写的hh 代表的是采用12小时制,HH 是24小时制。
//Date-->String 格式化:format Date d = new Date(); //SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); String result = sdf.format(d); System.out.println(result); //String-->Date 解析:parse String time = "2020-08-19 10:41:28"; SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //这里存在一个编译时异常,需要明确处理,异常的处理"后面学"。这里采用处理异常的方式try...catch。 //快捷方式Ctrl+Alt+T 将内容放到语法块中 Date d2 = null; try { d2 = sdf2.parse(time);// Unparseable date: "2020-08-19 10:41:28" } catch (ParseException e) { e.printStackTrace(); } System.out.println(d2);
四、Calendar(日历类)
概述
java.util.Calendar类表示一个“日历类”,可以进行日期运算,但是抽象类,不可实例化,其实我们实际上用的是它的亚洲地区子类GregorianCalendar,不同地区用的子类其实是不一样的。
注意事项
日历对象中的星期是从1-7来表示,1表示星期天。
日历对象中的月份是从0-11来表示,0表示一月份。
构造方法
Calendar类是一个抽象类,需要使用其 子类java.util.GregorianCalendar 创建对象。
Calendar提供了一个静态方法getInstance()可以获取GregorianCalendar对象
~ public static Calendar getInstance() 获取GregorianCalendar对象,以Calendar类型返回。
// 获取对象写法:类名 . 静态方法 Calendar nowCal = Calendar.getInstance();
常用功能 - 值超过范围直接进入下一个周期,比如月份设置12,会直接到下一年。值为负数代表回退。
public int get (int field) 获取某个字段的值。
public void set (int field,int value) 设置某个字段的值
public void add (int field,int amount) 为某个字段增加/减少指定的值
获取日历及时间标准格式
private static void showCalendar(Calendar c) { //public int get(int field) 获取某个字段的值。 int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); month++; int day = c.get(Calendar.DAY_OF_MONTH); int hour = c.get(Calendar.HOUR_OF_DAY); // hour有两种:12小时制的和24小时制的,选后者 int minute = c.get(Calendar.MINUTE); int second = c.get(Calendar.SECOND); System.out.println(year + "年" + month + "月" + day + "日 " + hour + ":" + minute + ":" + second); String[] weeks = {"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; int week = c.get(Calendar.DAY_OF_WEEK); week--; System.out.println(weeks[week]); }
时间类小练习
- 如果用毫秒相减的办法,到时候毫秒换算的时候,是除以365还是366没法判断,不准确,所以还是不行。
public class Test { public static void main(String[] args) { //定义一个方法,参数为生日的字符串类型的时间(yyyy-MM-dd),获取该生日对应的当前年龄 Scanner sc = new Scanner(System.in); System.out.println("请输入一个生日(格式:2000-12-12)"); String birthday = sc.nextLine(); int age = birthdayToAge(birthday); System.out.println(age); } //生日转年龄 当前年-生日年 public static int birthdayToAge(String birthday) { //定义了一个代表年龄的变量 int age = -1; //①获取生日Calendar对象 void setTime(Date date) 使用给定的 Date设置此日历的时间。 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date birDate = null; try { birDate = sdf.parse(birthday); } catch (ParseException e) { e.printStackTrace(); } Calendar birCal = Calendar.getInstance(); birCal.setTime(birDate); //②获取当前Calendar对象 Calendar nowCal = Calendar.getInstance(); //③判断如果当前的时间,在生日时间的后面 //boolean after(Object when) 返回 Calendar是否表示在指定的 Object表示的时间之后的时间。 //boolean before(Object when) 返回此 Calendar是否表示由指定的 Object表示的时间之前的时间。 //if (nowCal.after(birCal)){ if (birCal.before(nowCal)) { //3.1分别获取生日的年 和 当前的年 int birYear = birCal.get(Calendar.YEAR); int nowYear = nowCal.get(Calendar.YEAR); //3.2计算年龄 当前年-生日年 age = nowYear - birYear; //3.3判断如果(当前月份比生日月份小) 或 (月份相同,当前日比生日的日小),age-- int birMonth = birCal.get(Calendar.MONTH); int nowMonth = nowCal.get(Calendar.MONTH); int birDay = birCal.get(Calendar.DAY_OF_MONTH); int nowDay = nowCal.get(Calendar.DAY_OF_MONTH); if ((nowMonth<birMonth) || (nowMonth==birMonth&&nowDay<birDay)){ age--; } } return age; } }
五、Math类
概述
java.lang.Math: 含执行基本数字运算的方法的工具类。
Math类构造方法被私有修饰,不能创建对象,通过类名调用内部静态内容即可。
常用方法
public static int abs (int a) 获取参数a的绝对值
public static double ceil (double a) 向上取整
public static double floor (double a) 向下取整
public static double pow (double a, double b) 获取a的b次幂
public static long round (double a) 四舍五入取整
public static int max (int a, int b) 返回两个 int 值中较大的一个
public static int min (int a, int b) 返回两个 int 值中较小的一个
六、System类
概述
java.lang.System 可以获取与系统相关的信息或系统级操作的工具类。
System类构造方法被私有修饰,不能创建对象,通过类名调用内部静态内容即可。
常用方法
public static void exit (int status) 终止当前运行的Java虚拟机,非零表示异常终止,可以设计-1等数字分别代表什么原因终止
public static long currentTimeMillis () 返回当前时间(以毫秒为单位),类型是 long ,长整型
七、BigDecimal类
概述
java.math.BigDecimal 为浮点数提供精准计算的类
小数转换成二进制存储到计算机中,在参与运算的过程中会出现丢失精度的现象,比如直接打印两个小数,打印出来的不是我们认为的结果,2.1+1.3,应该是等于3.4,但是打印出来很长一串,因为计算机会把它转换成二进制再算,会丢失后面的位数。
构造方法
BigDecimal (double val) 将double类型的数据封装为BigDecimal对象(不推荐使用,不能解决精度丢失的问题)。
BigDecimal (String val) 将 BigDecimal 的字符串表示形式转换为 BigDecimal。(val必须是小数样式的字符串 “10.0”)。
常用方法
加法运算 public BigDecimal add (BigDecimal value)
减法运算 public BigDecimal subtract (BigDecimal value)
乘法运算 public BigDecimal multiply (BigDecimal value)。
除法运算 public BigDecimal divide (BigDecimal value) 不推荐,也是不能解决精度丢失的问题
除法运算 public BigDecimal divide (BigDecimal divisor, int scale, RoundingMode roundingMode)
八、Arrays
常用的打印数组和排序方法,还有很多方法,直接查API。
package com.itheima.demo10_Arrays; import java.util.Arrays; import java.util.Collections; public class Test { public static void main(String[] args) { int[] arr = {1, 4, 2}; System.out.println(Arrays.toString(arr));//打印数组 Integer[] arr2 = {22, 11, 55, 78, 1, 99}; Arrays.sort(arr); //默认升序 System.out.println(Arrays.toString(arr)); Arrays.sort(arr2, Collections.reverseOrder()); //降序排序,注意数组必须是包装类的类型! System.out.println(Arrays.toString(arr2)); } }