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