大数据必学Java基础四十八:包装类和日期类的讲解

​包装类和日期类的讲解

一、包装类

引入

【1】什么是包装类:

以前定义变量,经常使用基本数据类型

对于基本数据类型来说,它就是一个数,加点属性,加点方法,加点构造器

将基本数据类型对应进行了一个封装,产生了一个新的类,就是包装类

int,byte.....--->基本数据类型

包装类--->引用数据类型

【2】对应关系:

基本数据类型 对应的包装类 继承关系

byte Byte ---》Number---》Object

short Short ---》Number---》Object

int Integer ---》Number---》Object

long Long ---》Number---》Object

float Float ---》Number---》Object

double Double ---》Number---》Object

char Character Object

boolean Boolean Object

【3】已经有基本数据类型了,为什么要封装为包装类?

(1)java语言 面向对象的语言,最擅长的操作各种各样的类。

(2)以前学习装数据的---》数组,int[] String[] double[] Student[]

以后学习的装数据的---》集合,有一个特点,只能装引用数据类型的数据

【4】是不是有了包装类以后就不用基本数据类型了?

不是

Integer

【1】直接使用,无需导包:

【2】类的继承关系:

【3】实现接口:

【4】这个类被final修饰,那么这个类不能有子类,不能被继承:

【5】包装类是对基本数据类型的封装: 对int类型封装产生了Integer

【6】类的历史:

【7】属性:

1.//属性:
2.        System.out.println(Integer.MAX_VALUE);
3.        System.out.println(Integer.MIN_VALUE);
4.        //“物极必反”原理:
5.        System.out.println(Integer.MAX_VALUE+1);
6.        System.out.println(Integer.MIN_VALUE-1);

【8】构造器(发现没有空参构造器)

(1)int类型作为构造器的参数:

Integer i1 = new Integer(12);

(2)String类型作为构造器的参数:

Integer i2 = new Integer("12");
Integer i3 = new Integer("abcdef");

【9】包装类特有的机制:自动装箱 自动拆箱:

//自动装箱:int--->Integer
        Integer i = 12;
        System.out.println(i);
        //自动拆箱:Integer--->int
        Integer i2 = new Integer(12);
        int num = i2;
        System.out.println(num);

(1)自动装箱 自动拆箱 是从JDK1.5以后新出的特性

(2)自动装箱 自动拆箱 :将基本数据类型和包装类进行快速的类型转换。

验证:

可以自定打断点测试是否走入valueOf方法中:

【10】常用方法:

valueOf方法的底层:

package com.lanson;

/**
 * @Auther: lanson
 */
public class Test04 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //compareTo:只返回三个值:要么是0,-1,1
        Integer i1 = new Integer(6);
        Integer i2 = new Integer(12);
        System.out.println(i1.compareTo(i2));// return (x < y) ? -1 : ((x == y) ? 0 : 1);
        //equals:Integer对Object中的equals方法进行了重写,比较的是底层封装的那个value的值。
        //Integer对象是通过new关键字创建的对象:
        Integer i3 = new Integer(12);
        Integer i4 = new Integer(12);
        System.out.println(i3 == i4);//false 因为==比较的是两个对象的地址
        boolean flag = i3.equals(i4);
        System.out.println(flag);

        //Integer对象通过自动装箱来完成:
        Integer i5 = 130;
        Integer i6 = 130;
        System.out.println(i5.equals(i6));//true
        System.out.println(i5 == i6);
        /*
        如果自动装箱值在-128~127之间,那么比较的就是具体的数值
        否在,比较的就是对象的地址
         */

        //intValue() :作用将Integer--->int
        Integer i7 = 130;
        int i = i7.intValue();
        System.out.println(i);

        //parseInt(String s) :String--->int:
        int i8 = Integer.parseInt("12");
        System.out.println(i8);

        //toString:Integer--->String
        Integer i10 = 130;
        System.out.println(i10.toString());

    }
}

二、日期相关的类

1、java.util.Date

package com.lanson.test02;

import java.util.Date;

/**
 * @Auther: lanson
 */
public class Test {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //java.util.Date:
        Date d = new Date();
        System.out.println(d);
        System.out.println(d.toString());
        System.out.println(d.toGMTString());//过期方法,过时方法,废弃方法。
        System.out.println(d.toLocaleString());

        System.out.println(d.getYear());//120+1900=2020
        System.out.println(d.getMonth());//5 :返回的值在 0 和 11 之间,值 0 表示 1 月。
        //返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
        System.out.println(d.getTime());//1592055964263
        System.out.println(System.currentTimeMillis());
        /*
        (1)疑问:以后获取时间差用:getTime()还是currentTimeMillis()
        答案:currentTimeMillis()--》因为这个方法是静态的,可以类名.方法名直接调用
        (2)public static native long currentTimeMillis();
        本地方法
        为什么没有方法体?因为这个方法的具体实现不是通过java写的。
        (3)这个方法的作用:
        一般会去衡量一些算法所用的时间
         */
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            System.out.println(i);
        }
        long endTime = System.currentTimeMillis();
        System.out.println(endTime-startTime);
    }
}

2、java.sql.Date

package com.lanson.test02;

import java.sql.Date;

/**
 * @Auther: lanson
 */
public class Test02 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //java.sql.Date:
        Date d = new Date(1592055964263L);
        System.out.println(d);
        /*
        (1)java.sql.Date和java.util.Date的区别:
        java.util.Date:年月日  时分秒
        java.sql.Date:年月日
        (2)java.sql.Date和java.util.Date的联系:
        java.sql.Date(子类) extends java.util.Date (父类)
         */

        //java.sql.Date和java.util.Date相互转换:
        //【1】util--->sql:
        java.util.Date date = new Date(1592055964263L);//创建util.Date的对象
        //方式1:向下转型
        Date date1 = (Date) date;
        /*
        父类:Animal 子类:Dog
        Animal an = new Dog();
        Dog d = (Dog)an;
         */
        //方式2:利用构造器
        Date date2 = new Date(date.getTime());


        //【2】sql-->util:
        java.util.Date date3 = d;

        //[3]String--->sql.Date:
        Date date4 =  Date.valueOf("2019-3-8");

    }
}

3、SimpleDateFormat

【1】String---》java.util.Date 类型转换:

分解:

(1)String--->java.sql.Date

(2)java.sql.Date--->java.util.Date

public class Test04 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //(1)String--->java.sql.Date
        java.sql.Date date = java.sql.Date.valueOf("2022-9-24");
        //(2)java.sql.Date--->java.util.Date
        java.util.Date date2 = date;
        System.out.println(date2.toString());
    }
}

上面的代码有局限性,字符串的格式只能是年-月-日拼接的形式,换成其它类型,就会出现异常

【2】引入新的类:SimpleDateFormat

package com.lanson.test02;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Auther: lanson
 */
public class Test05 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //日期转换:
        //SimpleDateFormat(子类) extends DateFormat(父类是一个抽象类)
        //格式化的标准已经定义好了:
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //String--->Date
        try {
            Date d = df.parse("2019-4-6 12:23:54");
            System.out.println(d);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        //Date--->String
        String format = df.format(new Date());
        System.out.println(format);

        Date date = new Date();
        System.out.println(date.toString());
        System.out.println(date.toGMTString());
        System.out.println(date.toLocaleString());
    }
}

【3】日期格式:

4、Calendar

package com.lanson.test02;

import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 * @Auther: lanson
 */
public class Test06 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //Calendar是一个抽象类,不可以直接创建对象
        //GregorianCalendar()子类 extends Calendar(父类是一个抽象类)
        Calendar cal = new GregorianCalendar();
        Calendar cal2 = Calendar.getInstance();
        System.out.println(cal);

        //常用的方法:
        // get方法,传入参数:Calendar中定义的常量
        System.out.println(cal.get(Calendar.YEAR));
        System.out.println(cal.get(Calendar.MONTH));
        System.out.println(cal.get(Calendar.DATE));
        System.out.println(cal.get(Calendar.DAY_OF_WEEK));
        System.out.println(cal.getActualMaximum(Calendar.DATE));//获取当月日期的最大天数
        System.out.println(cal.getActualMinimum(Calendar.DATE));//获取当月日期的最小天数

        // set方法:可以改变Calendar中的内容
        cal.set(Calendar.YEAR,1990);
        cal.set(Calendar.MONTH,3);
        cal.set(Calendar.DATE,16);
        System.out.println(cal);

        //String--->Calendar:
        //分解:
        //String--->java.sql.Date:
        java.sql.Date date = java.sql.Date.valueOf("2020-4-5");
        //java.sql.Date-->Calendar:
        cal.setTime(date);
        System.out.println(cal);
    }
}

练习

需求:

package com.lanson.test02;

import java.util.Calendar;
import java.util.Scanner;

/**
 * @Auther: lanson
 */
public class Test08 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {

        //录入日期的String:
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入你想要查看的日期:(提示:请按照例如2012-5-6的格式书写)");
        String strDate = sc.next();
        /*System.out.println(strDate);*/
        //String--->Calendar:
        //String-->Date:
        java.sql.Date date = java.sql.Date.valueOf(strDate);
        //Date--->Calendar:
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);

        //后续操作:
        //星期提示:
        System.out.println("日\t一\t二\t三\t四\t五\t六\t");

        //获取本月的最大天数:
        int maxDay = cal.getActualMaximum(Calendar.DATE);
        //获取当前日期中的日:
        int nowDay = cal.get(Calendar.DATE);

        //将日期调为本月的1号:
        cal.set(Calendar.DATE,1);
        //获取这个一号是本周的第几天:
        int num = cal.get(Calendar.DAY_OF_WEEK);
        /*System.out.println(num);*/
        //前面空出来的天数为:
        int day = num - 1;
        //引入一个计数器:
        int count = 0;//计数器最开始值为0
        //在日期前将空格打印出来:
        for (int i = 1; i <= day; i++) {
            System.out.print("\t");
        }
        //空出来的日子也要放入计数器:
        count = count + day;
        //遍历:从1号开始到maxDay号进行遍历:
        for (int i = 1; i <= maxDay ; i++) {

            if(i == nowDay){//如果遍历的i和当前日子一样的话,后面多拼一个*
                System.out.print(i+"*"+"\t");
            }else{
                System.out.print(i+"\t");
            }
            count++;//每在控制台输出一个数字,计数器做加1操作
            if(count%7 == 0){//当计数器的个数是7的倍数的时候,就换行操作
                System.out.println();
            }
        }


    }
}

5、JDK1.8新增日期时间API

引入

JDK1.0中使用java.util.Date类 --》第一批日期时间API

JDK1.1引入Calendar类 --》第二批日期时间API

缺陷:

可变性 : 像日期和时间这样的类应该是不可变的。

偏移性 : Date中 的年份是从1900开始的,而月份都从0开始。

格式化 : 格式化只对Date有用,Calendar则不行。

JDK1.8新增日期时间API --》第三批日期时间API

LocalDate/LocalTime/LocalDateTime

package com.lanson.test02;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

/**
 * @Auther: lanson
 */
public class Test09 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //1.完成实例化:
        //方法1:now()--获取当前的日期,时间,日期+时间
        LocalDate localDate = LocalDate.now();
        System.out.println(localDate);
        LocalTime localTime = LocalTime.now();
        System.out.println(localTime);
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime);
        //方法2:of()--设置指定的日期,时间,日期+时间
        LocalDate of = LocalDate.of(2010, 5, 6);
        System.out.println(of);
        LocalTime of1 = LocalTime.of(12, 35, 56);
        System.out.println(of1);
        LocalDateTime of2 = LocalDateTime.of(1890, 12, 23, 13, 24, 15);
        System.out.println(of2);

        //LocalDate,LocalTime用的不如LocalDateTime多
        //下面讲解用LocalDateTime:
        //一些列常用的get***
        System.out.println(localDateTime.getYear());//2022
        System.out.println(localDateTime.getMonth());//JUNE
        System.out.println(localDateTime.getMonthValue());//6
        System.out.println(localDateTime.getDayOfMonth());//14
        System.out.println(localDateTime.getDayOfWeek());//SUNDAY
        System.out.println(localDateTime.getHour());//22
        System.out.println(localDateTime.getMinute());//22
        System.out.println(localDateTime.getSecond());//6

        //不是set方法,叫with
        //体会:不可变性
        LocalDateTime localDateTime2 = localDateTime.withMonth(8);
        System.out.println(localDateTime);
        System.out.println(localDateTime2);

        //提供了加减的操作:
        //加:
        LocalDateTime localDateTime1 = localDateTime.plusMonths(4);
        System.out.println(localDateTime);
        System.out.println(localDateTime1);
        //减:
        LocalDateTime localDateTime3 = localDateTime.minusMonths(5);
        System.out.println(localDateTime);
        System.out.println(localDateTime3);


    }
}

DateTimeFormatter

package com.lanson.test02;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;

/**
 * @Auther: lanson
 */
public class Test10 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //格式化类:DateTimeFormatter

        //方式一:预定义的标准格式。如: ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;IS0_LOCAL_TIME
        DateTimeFormatter df1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        //df1就可以帮我们完成LocalDateTime和String之间的相互转换:
        //LocalDateTime-->String:
        LocalDateTime now = LocalDateTime.now();
        String str = df1.format(now);
        System.out.println(str);//2022-06-15T15:02:51.29

        //String--->LocalDateTime
        TemporalAccessor parse = df1.parse("2022-06-15T15:02:51.29");
        System.out.println(parse);


        //方式二:本地化相关的格式。如: oflocalizedDateTime()
        //参数:FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT
        //FormatStyle.LONG :2022年6月15日 下午03时17分13秒
        //FormatStyle.MEDIUM: 2022-6-15 15:17:42
        //FormatStyle.SHORT:20-6-15 下午3:18
        DateTimeFormatter df2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
        //LocalDateTime-->String:
        LocalDateTime now1 = LocalDateTime.now();
        String str2 = df2.format(now1);
        System.out.println(str2);

        //String--->LocalDateTime
        TemporalAccessor parse1 = df2.parse("20-6-15 下午3:18");
        System.out.println(parse1);

        //方式三: 自定义的格式。如: ofPattern( "yyyy-MM-dd hh:mm:ss") ---》重点,以后常用
        DateTimeFormatter df3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
        //LocalDateTime-->String:
        LocalDateTime now2 = LocalDateTime.now();
        String format = df3.format(now2);
        System.out.println(format);//2022-06-15 03:22:03
        //String--->LocalDateTime
        TemporalAccessor parse2 = df3.parse("2022-06-15 03:22:03");
        System.out.println(parse2);

    }
}

相关文章

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个...
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:...
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程...