Java学习——day 06

主要内容

  • 多维数组
  • 包装类
  • 自动装箱和自动拆箱
  • SimpleDateFormat类的使用
  • Calendar类的使用

笔记详情

1. 多维数组

在Java中经常使用的还是一维数组,少数情况下会使用到二维数组,三维以上的数组很少使用,但是我们还是要掌握多维数组的使用,特别是二维数组。

二维数组在定义的时候,可以理解为点定义一个一维数组,然后在一维数组的基础之上在定义一个一维数组,这样就可以定义一个二维数组。同一维数组类似,二维数组的初始化方式有以下三种:默认初始化、静态初始化、动态初始化。

public static void main(String[] args) {
    // 默认初始化,初始化规则和一维数组的初始化规则一样
    int arrayA[][] = new int[4][2];

    // 定义的时候直接进行初始化
    int[][] arrayB = { { 1, 2, 3 }, { 4, 5 }, { 6, 7, 8, 9, 10 } };
    System.out.println(arrayB[2][0]);

    // 动态初始化
    int arrayC[][] = new int[3][];

    arrayC[0] = new int[2];
    arrayC[1] = new int[3];
    arrayC[2] = new int[4];

    arrayC[0][0] = 12;
    arrayC[0][1] = 23;
    arrayC[1][0] = 34;
    arrayC[1][1] = 45;
    arrayC[1][2] = 20;
    arrayC[2][0] = 10;
    arrayC[2][1] = 30;
    arrayC[2][2] = 52;
    arrayC[2][3] = 32;
}

2. 包装类

Java是面向对象的一门编程语言,但是Java中的基本数据类型却不是面向对象的,我们在实际使用的过程中,需要将基本数据类型转变为对象,这个时候就会用到包装类。Java中有八种基本数据类型,这八种数据类型对应八个包装类,具体对应关系如下:

基本数据类型 包装类
byte Byte
boolean Boolean
short Short
char Character
int Integer
long Long
float Float
double Double

包装类提供了基本数据类型和对象之间的转换方式,同时包含每种基本类型的相关属性和方法,比如最大值最小值等。下面给出一些包装类的实例:

public static void main(String[] args) {

    Integer a = 120;    // 定义Integer对象a
    Double b = 23.45;   // 定义Double对象b

    System.out.println(Integer.MAX_VALUE);      // int类型的最大值
    System.out.println(Double.MAX_VALUE);       // double类型的最大值
}

3. 自动封箱和自动拆箱

这两个概念是围绕封装类记性的,基本类型数据包装到对象中,作为对象来使用,这是封箱;包装类类型的对象可以作为基本数据类型来使用,这是拆箱。这两个封箱过程由java自动实现,就叫做自动封箱和自动拆箱。

Integer a = 120;    // 自动封箱
int b = a + 22;     // 自动拆箱

这里有一个有趣的现象,为了优化Java语言,编译器做了一下的设置:如果整数在 [-128,127] ,之间,那么对应的包装类对象是相等的,否则不相等。实例如下:

public static void main(String[] args) {
    Integer a = 127;
    Integer b = 127;
    System.out.println(a == b);     // true
    
    Integer a2 = 200;
    Integer b2 = 200;
    System.out.println(a2 == b2);       // false
    
    Integer a3 = -200;
    Integer b3 = -200;
    System.out.println(a3 == b3);       // false
}

4. SimpleDateFormat类的使用

Java中的SimpleDateFormat类可以帮助我们很方便地进行时间的格式化操作,该类大致实现两个功能:通过时间戳获得直观的时间表达式(如:2017-11-12);通过直观的时间表达式(2017-11-12)获取时间戳。

1. 通过时间戳获得直观的时间表达式

首先我们应该知道下面的一些格式化规则:

表达式 表示的时间
yyyy
MM
dd
hh 1~12小时制(1-12)
HH 24小时制(0-23)
mm
ss
S 毫秒
E 星期几
D 一年中的第几天
F 一月中的第几个星期(会把这个月总共过的天数除以7)
w 一年中的第几个星期
W 一月中的第几星期(会根据实际情况来算)
a 上下午标识
k 和HH差不多,表示一天24小时制(1-24)
K 和hh差不多,表示一天12小时制(0-11)
z 表示时区

我们首先应该通过SimpleDateFormat类定义一个对象,初始化的时候,传入的参数是时间表达式,然后通过该对象调用 format() 方法,给方法中传入时间戳,最后按照时间表达式中返回一个字符串。实例如下:

SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat df3 = new SimpleDateFormat("今天是yyyy-MM-dd,今天是一年中的第D天");
SimpleDateFormat df4 = new SimpleDateFormat("今天是yyyy-MM-dd,今天是一年中的第W个星期");

System.out.println(df1.format(now));    // 2018-12-19
System.out.println(df2.format(now));    // 2018-12-19 09:03:28
System.out.println(df3.format(now));    // 今天是2018-12-19,今天是一年中的第353天
System.out.println(df4.format(now));    // 今天是2018-12-19,今天是一年中的第4个星期

2. 通过直观的时间表达式获取时间戳

首先我们先看一个实例:

SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");

try {
    String strDate = "2017-02-16";
    Date date1 = df1.parse(strDate);
    System.out.println(date1);      // Thu Feb 16 00:00:00 CST 2017
    System.out.println(date1.getTime());        // 1487174400000
} catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
}

通过时间表达式获取时间戳的时候,也是要定义一个SimpleDateFormat对象,并传入时间表达式a(如:yyyy-MM-dd),这个时候要注意的是,使用这个对象去解析的时间表达式b要和时间表达式a匹配,比如这个时候我们传入2017-02-16是可以的,但是传入2017/02/16是不可以的。

同时这里也要注意,我们应该是用捕获异常来进行解析时间表达式(具体原因我们不清楚,深入学习之后,再回头修改笔记)

5. Calendar类的使用

Java中的Calendar类可以帮助我们处理年月日和时间戳之间的转化,也可以帮助我们计算时间,比如20天后是日期,两年后的日期。在生命Calendar类对象的时候要注意,Calendar类是一个抽象类,不能直接使用new运算符进行声明实例对象,但是该类提供了一个 getInstance() 方法,可以返回一个Calendar类的子类对象,这样我们就可以顺利的使用该类中的属性和方法:

Calendar cal = Calendar.getInstance(); // 声明Calendar的子类实例对象

/****** 时间的设置 ******/
cal.set(2018, 11, 20); // 设置时间:2018年2月20日,注意是2月
cal.set(2017, 11, 1, 13, 15, 55); // 设置时间:2017年12月1日 13点15分55秒
cal.set(Calendar.YEAR, 3030); // 单独设置年份,单独设置月日,与此同理

/****** 时间的获取 ******/
int year = cal.get(Calendar.YEAR); // 获取年份
int month = cal.get(Calendar.MONTH) + 1; // 获取月份,注意要 +1
int day = cal.get(Calendar.DAY_OF_MONTH); // 获取日
int hour = cal.get(Calendar.HOUR); // 获取时
int minute = cal.get(Calendar.MINUTE); // 获取分
int second = cal.get(Calendar.SECOND); // 获取秒
int weekDay = cal.get(Calendar.DAY_OF_WEEK); // 获取周几,周日是1,周一是2,周二是3...周六是7

/****** 时间的计算 ******/
cal.add(Calendar.YEAR, 1); // 计算1年后的日期
cal.add(Calendar.MONTH, -1); // 计算一月前的日期

要注意的是,西方的时间表达和我们中国的时间表达习惯不一样,程序中的时间表达如下:
月份:一月是0,二月是1,三月是2...十二月是11
星期:周日是1,周一是2,周二是3...周六是7

你可能感兴趣的:(Java学习——day 06)