(1)System类常见方法和案例:
(1)exit:退出当前程序
我们设计的代码如下所示:
package com.ypl.System_; public class System_ { public static void main(String[] args) { //exit: 退出当前程序 System.out.println("ok1"); //1.exit(0)表示程序退出 //2. 0表示一个状态,正常的状态 System.exit(0); System.out.println("ok2"); } }
我们运行之后如下所示:
(2)arraycopy: 复制数组元素,比较适合底层调用,一般使用Arrays.copyOf完成复制数组。
我们设计的代码如下所示:
package com.ypl.System_; import java.util.Arrays; public class System_ { public static void main(String[] args) { int[] src={1,2,3}; int[] dest= new int[3]; //dest当前是{0,0,0} int[] dest1= new int[3]; //dest当前是{0,0,0} int[] dest2= new int[3]; //dest当前是{0,0,0} //1.主要是搞清楚这五个参数的含义 //2.src – the source array. (源数组) // srcPos – starting position in the source array. (从源数组的哪个索引位置开始拷贝) // dest – the destination array. (目标数组,即把源数组的数据拷贝到哪个数组) // destPos – starting position in the destination data. (把源数组的数据拷贝到目标数组的哪个索引) // length – the number of array elements to be copied. (从源数组拷贝多少个数据到目标数组) System.arraycopy(src,0,dest,0,3); //[1,2,3] System.out.println("dest="+ Arrays.toString(dest)); System.arraycopy(src,0,dest1,1,2);//[0,1,2] System.out.println("dest1="+Arrays.toString(dest1)); System.arraycopy(src,0,dest2,1,src.length-1);//[0,1,2] System.out.println("dest2="+Arrays.toString(dest2)); } }
运行之后如下所示:
(3)currentTimeMillens:返回当前时间距离1970-1-1 的毫秒数
我们设计的代码如下所示:
package com.ypl.System_; import java.util.Arrays; public class System_ { public static void main(String[] args) { //currentTimeMillens:返回当前时间距离1970-1-1的毫秒数 // System.out.println(System.currentTimeMillis()); } }
我们运行之后如下所示:
我们从菜鸟教程的API查看如下所示:
(4)gc:运行垃圾回收机制 System.gc( ).
(2)BigInteger和BigDecimal
应用场景:
(1)BigInteger适合保存比较大的整型
(2)BigDecimal适合保存精度更高的浮点型(小数)
BigInteger
我们查看BigInteger的类图如下所示:
我们发现BigInteger里面有许多方法。
我们设计代码如下所示:
package com.ypl.bignum; import java.math.BigInteger; public class BigInteger_ { public static void main(String[] args) { long l=23788888999l; System.out.println("l="+l); //当我们编程中,需要处理很大的整数,long 不够用 //可以使用BigInteger的类来搞定 long l1=2378888899999999l; System.out.println("l1="+l1); BigInteger bigInteger = new BigInteger("237888889999999999999"); BigInteger bigInteger1 = new BigInteger("100"); System.out.println(bigInteger); //1.在对BigInteger进行加减乘除的时候,需要使用对应的方法,不能直接进行 + - * / //2.可以创建一个要操作的BigInteger,然后进行相应操作。 BigInteger add = bigInteger.add(bigInteger1); System.out.println(add); //加 BigInteger subtract = bigInteger.subtract(bigInteger1); System.out.println(subtract); //减法 BigInteger multiply = bigInteger.multiply(bigInteger1); System.out.println(multiply); //乘 BigInteger divide = bigInteger.divide(bigInteger1); System.out.println(divide); //除法 } }
我们运行之后如下所示:
我们下来查看BigDecimal:
我们设计的代码如下所示:
package com.ypl.bignum; import java.math.BigDecimal; public class BigDecimal_ { public static void main(String[] args) { //当我们需要保存一个精度很高的数时,double不够用 //可以使用BigDecimal double d=1999.1111111111111d; System.out.println(d); double c=1999.5555555555555555555; //会进行精度的缩减 System.out.println(c); BigDecimal bigDecimal = new BigDecimal("1999.555555555555555555"); BigDecimal bigDecimal1 = new BigDecimal("1.1"); System.out.println(bigDecimal); //1.如果对BigDecimal进行运算,比如加减乘除,需要使用对应的方法 //2.创建一个需要操作的BigDecimal然后调用相应的方法即可 BigDecimal add = bigDecimal.add(bigDecimal1); //加 System.out.println(add); BigDecimal subtract = bigDecimal.subtract(bigDecimal1);//减 System.out.println(subtract); BigDecimal multiply = bigDecimal.multiply(bigDecimal1); //乘 System.out.println(multiply); BigDecimal divide = bigDecimal.divide(bigDecimal1);//除,可能抛出异常,在算除法的时候是可能除不尽的, // 除不尽会抛出异常,除尽则不会 System.out.println(divide); } }
我们运行之后如下所示:
发现抛出异常,我们的解决方案如下所示:
package com.ypl.bignum; import java.math.BigDecimal; public class BigDecimal_ { public static void main(String[] args) { //当我们需要保存一个精度很高的数时,double不够用 //可以使用BigDecimal double d=1999.1111111111111d; System.out.println(d); double c=1999.5555555555555555555; //会进行精度的缩减 System.out.println(c); BigDecimal bigDecimal = new BigDecimal("1999.555555555555555555"); BigDecimal bigDecimal1 = new BigDecimal("1.1"); System.out.println(bigDecimal); //1.如果对BigDecimal进行运算,比如加减乘除,需要使用对应的方法 //2.创建一个需要操作的BigDecimal然后调用相应的方法即可 BigDecimal add = bigDecimal.add(bigDecimal1); //加 System.out.println(add); BigDecimal subtract = bigDecimal.subtract(bigDecimal1);//减 System.out.println(subtract); BigDecimal multiply = bigDecimal.multiply(bigDecimal1); //乘 System.out.println(multiply); // BigDecimal divide = bigDecimal.divide(bigDecimal1);//除,可能抛出异常,在算除法的时候是可能除不尽的, // 除不尽会抛出异常,除尽则不会 //在调用divide方法时,指定精度即可,BigDecimal.ROUND_CEILING //如果有无限循环小数就会保留分子的精度 BigDecimal divide = bigDecimal.divide(bigDecimal1,BigDecimal.ROUND_CEILING); System.out.println(divide); } }
我们运行之后如下所示:
我们发现完美解决。
(3)Date介绍
1.Date:精确到毫秒,代表特定的瞬间
2.SimpleDateFormat:格式和解析日期的类
SimpleDateFormat格式化和解析日期的具体类。它允许进行格式化(日期-->文本)、解析(文本->日期)和规范化
我们查看类的关系继承图:
我们查看他的方法,发现里面有很多方法,同时也有很多过时的方法:
我们了解里面properties的相关:properties指的并不是我们的字段,而是如果我们的类里面有get和set的相关方法,就会把后面的名称自动当作一个properties。
我们通过具体案例来进行了解:
我们设计代码如下所示:package com.ypl.data_; public class Dog { private String name; private int age; public Dog(String name, int age) { this.name = name; this.age = age; } public void cry(){ } class Air{ } //说明一下diagram IDEA properties 的含义 public void setAddress(String address){ } public double getSalary( ){ return 1.1; } }
我们点击了properties之后,我们发现出现salary和address.
我们没有点击之后,我们发现出现如下所示:出现了setAddress和getSalsry方法。
我们设计的代码如下所示:
package com.ypl.data_; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Date01 { public static void main(String[] args) throws ParseException { //1.获取当前系统时间 //2.这里的Date类是在java.util包 //3.默认输出的日期格式是国外的方式,因此通常需要对格式进行转换 Date d1 = new Date(); //获取当前系统时间 System.out.println("当前日期="+d1); //1.创建SimpleDateFormat对象,可以指定相应的格式 //2.这里的格式使用的字母是规定好,不能乱写 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E"); String format = sdf.format(d1); //format:将日期转换成指定格式的字符串 System.out.println("当前日期="+format); Date d2 = new Date(9234567); //通过指定毫秒数得到时间 System.out.println("d2="+d2); //获取某个时间对应的毫秒数 SimpleDateFormat smd = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E"); String format1 = smd.format(d2); System.out.println("当前日期="+format1); //1.可以把一个格式化的String转成对应的Date //2.得到Date仍然在输出时,还是按照国外的形式,如果希望指定格式输出,需要转换(使用SimpleDateFormat) //3.在把String -->Date,使用的sdf格式需要和你给的String的格式一样,否则会抛出转换异常。 String s="1996年01月01日 10:20:30 星期一"; //格式必须和sdf上的格式一致 Date parse = sdf.parse(s); System.out.println("parse="+parse); System.out.println("parse"+sdf.format(parse)); } }
我们运行之后如下所示:
我们在api文档里面来查看SimpleDate:
(4)Calendar类(日历)
1.第二代日期类,主要就是Calendar类(日历)
2.Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
我们查看他的类图:
我们发现Calendar的构造器是私有的:
我们查看他的方法:
我们发现这些方法中有些是Calendar私有的。
我们在去创建一个Calendar的时候是通过getInstance来获取的。
我们查看源码如下:
我们发现这两个构造方法都是私有的。
通过如下两个来获取Calendar:
我们查看Calendar的字段如下所示:
我们查看他的内部类如下所示:
我们的案例代码如下所示:package com.ypl.data_; import java.util.Calendar; public class Calendar_ { public static void main(String[] args) { //1.Calendar是一个抽象类,并且构造器是private //2.可以通过getInstance( )来获取实例 //3.提供大量的方法和字段提供给程序员 //4.Calendar没有提供对应的格式化的类,因此需要程序员自己组合来输出(灵活) Calendar c = Calendar.getInstance();//创建日历类对象 //比较简单,自由 System.out.println("c="+c); //4.获取日历对象的某个日历字段 System.out.println("年:"+c.get(Calendar.YEAR)); //这里为什么要+1,因为Calendar返回月时候,是按照 0 开始编号 System.out.println("月:"+(c.get(Calendar.MONTH)+1)); System.out.println("日:"+c.get(Calendar.DAY_OF_MONTH)); System.out.println("小时:"+c.get(Calendar.HOUR)); System.out.println("分钟:"+c.get(Calendar.MINUTE)); System.out.println("秒:"+c.get(Calendar.SECOND)); //Calendar没有专门的格式化方法,所以需要程序员自己来组合显示 System.out.println(c.get(Calendar.YEAR)+"年"+(c.get(Calendar.MONTH)+1)+"月"+c.get(Calendar.DAY_OF_MONTH)+"日"); } }
我们运行之后如下所示:
以上显示的是12小时时间,我们修改如下为24小时:
package com.ypl.data_; import java.util.Calendar; public class Calendar_ { public static void main(String[] args) { //1.Calendar是一个抽象类,并且构造器是private //2.可以通过getInstance( )来获取实例 //3.提供大量的方法和字段提供给程序员 //4.Calendar没有提供对应的格式化的类,因此需要程序员自己组合来输出(灵活) //5.如果我们需要按照24小时进制来获取时间,Calendar.HOUR==改成==>Calendar.HOUR_OF_DAY Calendar c = Calendar.getInstance();//创建日历类对象 //比较简单,自由 System.out.println("c="+c); //4.获取日历对象的某个日历字段 System.out.println("年:"+c.get(Calendar.YEAR)); //这里为什么要+1,因为Calendar返回月时候,是按照 0 开始编号 System.out.println("月:"+(c.get(Calendar.MONTH)+1)); System.out.println("日:"+c.get(Calendar.DAY_OF_MONTH)); System.out.println("小时:"+c.get(Calendar.HOUR_OF_DAY)); System.out.println("分钟:"+c.get(Calendar.MINUTE)); System.out.println("秒:"+c.get(Calendar.SECOND)); //Calendar没有专门的格式化方法,所以需要程序员自己来组合显示 System.out.println(c.get(Calendar.YEAR)+"年"+(c.get(Calendar.MONTH)+1)+"月"+c.get(Calendar.DAY_OF_MONTH)+"日"); } }
我们运行之后如下所示:
(5)第三代日期类:LocalDate(日期/年月日)、LocalTime(时间/时分秒)、LocalDateTime(日期时间/年月日时分秒)JDK8加入
前面两代日期类的不足分析
JDK1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK1.1引入Calendar类之后被弃用了。而Calendar也存在问题是:
1.可变性:像日期和时间这样的类应该是不可变的。
2.偏移性:Date中的年份是从1900开始的,而月份都从0开始
3.格式化:格式化只对Date有用,Calendar则不行
4.此外,他们也不是线程安全的;不能处理闰秒等(每隔2天,多出1s)
LocalDate:只包含日期,可以获取日期字段
LocalTime只包含时间,可以获取时间字段
LocalDateTime:包含日期+时间,可以获取日期和时间字段
我们查看LocalDateTime的类图如下所示:
我们查看他的构造器:
我们查看他的方法如下所示:
我们查看他的基本获取如下所示:
package com.ypl.data_; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; public class LocalDate_ { public static void main(String[] args) { //第三代日期 //1.使用now( )返回表示当前日期时间的对象 LocalDateTime ldt = LocalDateTime.now(); //LocalDate.now( ); //LocalTime.now( ) System.out.println(ldt); System.out.println("年="+ldt.getYear()); System.out.println("月="+ldt.getMonth());//英文日 System.out.println("月="+ldt.getMonthValue());//中文月 System.out.println("日="+ldt.getDayOfYear());//一年的第几天 System.out.println("日="+ldt.getDayOfMonth());//一个月的第几天 System.out.println("时="+ldt.getHour()); System.out.println("分="+ldt.getMinute()); System.out.println("秒="+ldt.getSecond()); LocalDate now = LocalDate.now();//可以获取年月日 System.out.println(now.getYear()); LocalTime now1 = LocalTime.now();//可以获取时分秒 System.out.println(now1.getHour()); } }
运行之后如下所示:
DateTimeFormatter格式化
我们进行格式化如下所示:
DateTimeFormatter格式日期类,类似于SimpleDateFormat
我们在jdk1.8及其以后发现如下所示:
我们实例如下所示:
package com.ypl.data_; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; public class LocalDate_ { public static void main(String[] args) { //第三代日期 //1.使用now( )返回表示当前日期时间的对象 LocalDateTime ldt = LocalDateTime.now(); //LocalDate.now( ); //LocalTime.now( ) System.out.println(ldt); //2.使用DateTimeFormatter对象来进行格式化 //创建DateTimeFormatter对象 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss"); String format = dateTimeFormatter.format(ldt); System.out.println("格式化的日期="+format); } }
我们运行之后如下所示:
Instant时间戳,类似于Date,提供了一系列和Date类转换的方式
Instant -->Date:Date.form(instant);
Date--->Instant:date.toInstant():
我们查看他的类图如下所示:
我们查看他的方法如下所示:
我们设计的代码如下所示:
package com.ypl.data_; import java.sql.Date; import java.time.Instant; public class Instant_ { public static void main(String[] args) { //1.通过静态方法now( )获取表示当前时间戳的对象 Instant now = Instant.now(); System.out.println(now); //2.通过from可以把Instant转成Date java.util.Date from = Date.from(now); System.out.println(from); //3.通过date的toInstant( )可以把date转成Instant对象 Instant instant = from.toInstant(); System.out.println(instant); } }
我们运行之后如下所示:
第三代日期类更多方法:
1.LocalDateTime类
2.MonthDay类:检查重复事件
3.是否是闰年
4.增加日期的某个部分
5.使用plus方法测试增加时间的某个部分
6.使用minus方法测试查看一年前和一年后的日期
我们设计的代码如下所示:
package com.ypl.data_; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class LocalDate1_ { public static void main(String[] args) { LocalDateTime now = LocalDateTime.now(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss"); //提供 plus和minus方法可以对当前时间进行加或者减 //看看890天后,是什么时候 把年月日-时分秒 LocalDateTime localDateTime = now.plusDays(890); System.out.println("890天后="+dateTimeFormatter.format(localDateTime)); //看看在3456分钟前是什么时候, 把年月日-时分秒输出 LocalDateTime localDateTime1 = now.minusMinutes(3456); System.out.println("3456分钟前 日期="+dateTimeFormatter.format(localDateTime1)); } }
运行之后如下所示: