java包机制、Math、日期

97 阅读4分钟

包机制

Java 是面向对象的程序语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型,int的包装类型就是Interger。
从Java 5 开始就引入了自动装箱/拆箱机制,是的两者可以相互转换。

装箱就是自动将基本数据类型转换为包装器类型  
拆箱就是自动将包装类型转换为基本数据类型。
原始类型:boolean, char, byte, short, int, long, float, double

包装类型:Boolean,Character, Byte, Short, Integer, Long, Float, Double

基本类型和包装类的区别

  • int是基本数据类型,Integer是其包装类,注意是一个类。
  • Integer 能为null, int不能。
  • 更多见代码实例
//装箱就是自动将基本数据类型转换为包装器类型
Integer a1 = 1123;
Integer a2 = 1123;
System.out.println(a1 == a2 );;     //false
System.out.println(a1.equals(a2));  //true

//拆箱就是自动将包装类型转换为基本数据类型。
String str = "12345";
Integer s = Integer.parseInt(str);
System.out.println(s);  //12345
System.out.println("<----------->");

int i1 = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
Integer i4 = 128;
System.out.println(i1 == i2);       //true      Integer 会自动拆箱为int
System.out.println(i1 == i3);       //true
System.out.println(i2 == i3);       //false
System.out.println(i2 == i4);       //false
System.out.println("<----------->");

Integer j1 = 127;   //编译时被翻译成:Integer j1 = Integer.valueOf(127);
//valueOf()这个函数对于-128到127之间的函数会进行缓存,而不会new Integer(),
// 此数字范围内传参则直接返回缓存中的对象。在此之外,直接new出来。
Integer j2 = 127;
System.out.println(j1 == j2);   //true

Integer j3 = new Integer(127);
System.out.println(j1 == j3);   //false

Math

System.out.println(Math.PI);    //获取圆周率
System.out.println(Math.max(10,12));        //求最大值 12
System.out.println(Math.round(12.45));      //四舍五入 12
System.out.println(Math.round(12.51));  //13
System.out.println(Math.ceil(9.01));    //向上取整 10.0
System.out.println(Math.floor(9.01));   //向下取整 9.0
System.out.println(Math.abs(-12));   //取绝对值  12
System.out.println(Math.pow(2,3));   //2的3次方
System.out.println(Math.random());   //获取0到1之间的随机小数(不包含0和1)


//取一位小数点
double s = 10.0;
System.out.println(Math.round(10.548*s)/s);     //10.5

//精度丢失问题
System.out.println(123.3/100);      //1.2329999999999999

//解决精度丢失问题要使用BigDecimal,要使用字符串转换    //不知用字符串转换的话计算结果不准确
BigDecimal big1 = new BigDecimal("123.3");
BigDecimal big2 = new BigDecimal("100");
big1 = big1.divide(big2);
System.out.println(big1);       //1.233

Date类

Date代表一个特定的瞬间,以毫秒级精度

常用函数

image.png

public static void main(String[] args) throws InterruptedException {
    Date date = new Date();
    System.out.println(date);       //Tue May 10 17:27:03 CST 2022
    // getTime     获取该事件的毫秒数
    System.out.println(date.getTime());
    //setTime     以毫秒单位设置一个时间
    date.setTime(0);
    System.out.println(date.getTime());     //0

    Date date2 = new Date();
    Thread.sleep(1000);
    Date date3 = new Date();
    System.out.println(date2.before(date3));        //true
    System.out.println(date2.after(date3));     //false
    System.out.println(System.currentTimeMillis());     //获取当前时间的毫秒数
    
}

操作日期主要涉及到以下几个类: image.png

SimpleDateFormat格式化日期

public static void main(String[] args) throws ParseException {
    Date d = new Date();
    System.out.println(d);  //Tue May 10 17:50:47 CST 2022
    
    SimpleDateFormat dateFormat1 = new SimpleDateFormat();
    SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String dateText1 = dateFormat1.format(d);   //格式化日期
    String dateText2 = dateFormat2.format(d);
    System.out.println(dateText1);  //22-5-10 下午5:46
    System.out.println(dateText2);  //2022-05-10 17:46:04

    String str = "2000-01-10 17:46:04";
    Date d2 = dateFormat2.parse(str);   //将字符串转换为Date类
    System.out.println(d2);     //Fri Jan 10 17:46:04 CST 2020
}

image.png

Calendar

Calendar类主要用于操作日期

image.png

public static void main(String[] args) {
    //Calendar 尽管为抽象类,但是自身封装了一个方法实例化
    Calendar c1 = Calendar.getInstance();

    System.out.println(c1.get(Calendar.YEAR));  //获取年份
    System.out.println(c1.get(Calendar.DAY_OF_YEAR));  //获取当年的第几天
    int m = c1.get(Calendar.MONTH);     //获取月份      注意月份是从0开始的
    System.out.println(m + 1);
    System.out.println(c1.get(Calendar.DATE));  //日期
    System.out.println(c1.get(Calendar.HOUR));  //  12小时制的小时
    System.out.println(c1.get(Calendar.HOUR_OF_DAY));  //  24小时制的小时
    System.out.println(c1.get(Calendar.MINUTE));  //  分
    System.out.println(c1.get(Calendar.SECOND));  //  秒
    System.out.println(c1.get(Calendar.DAY_OF_WEEK));  // 星期几       注意星期日是 1

    System.out.println(c1.getTime());   //获取时间
    System.out.println(c1.getTimeInMillis());   //获取时间值,以毫秒为单位
    c1.add(Calendar.YEAR,1);        //根据时间字段去运算,若设置的是天数,则月份受会其可能变化   roll则是单单那个值会变化,也就是其他都是固定了的。  
    System.out.println(c1.getTime());

    Calendar c2 = Calendar.getInstance();
    c2.set(Calendar.YEAR,1);    //设置日期 
    System.out.println(c2.getTime());
    System.out.println(c2.compareTo(c1));   //比较时间
}
/**
 * 获取当月的 天数
 *
 */
public static int getCurrentMonthDay()
{
    Calendar a = Calendar.getInstance();
    a.set(Calendar.DATE, 1);
    a.roll(Calendar.DATE, -1);
    int maxDate = a.get(Calendar.DATE);
    return maxDate;
}

/**
 * 根据 年、月 获取对应的月份 的 天数
 */
public static int getDaysByYearMonth(int year, int month)
{
    Calendar a = Calendar.getInstance();
    a.set(Calendar.YEAR, year);
    a.set(Calendar.MONTH, month - 1);
    a.set(Calendar.DATE, 1);
    a.roll(Calendar.DATE, -1);
    int maxDate = a.get(Calendar.DATE);
    return maxDate;
}

参考:
SimpleDateFormat 格式化日期