目录
包装类
在Java当中两类数据类型:基本和引用。目前来看,这两类数据类型是割裂的,因为无论是它们的存放结构 还是 提供的内容,都让它们是分开的两个体系。
包装类的出现 主要的任务就是在基本数据类型和引用数据类型之间 搭建一个“桥梁”。
4类8种基本数据类型,各有一个包装类与之对应。
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
所有的包装类的使用方式都是一样的,只要掌握了一个,其他都是相似的。
时间日期类
时间和日期是任何一个程序当中都不可能不涉及的数据,另外在很多加密算法或随机数算法中,都涉及到了使用时间来作为计算的种子元素。
时间的本质
在计算机内部,时间的本质不是一个字符串。我们所能看到"年月日"只是它的一个显示形式,这种形式会很多,"22-4-25" ,"4/25/2022"。
时间在计算机当中,它的本质是一个整型数字,而且是一个long类型的数字。它是在时间轴上选择了一个时间点作为“时间元点”,然后把其他时间记录为距离这个时间元点过了多少毫秒。(1秒 = 1000毫秒)。
初期 -- 时间元点统一为"1900年1月1号 00:00:00:000" 现在 -- 时间元点统一推迟到"1970年1月1号 00:00:00:000"
在Java当中,System提供了一个叫做"currentTimeMills()",该方法可以返回当前系统记录的毫秒数。--- 应用:我们可以在一段代码的前后,分别获取这个毫秒数,然后利用两者之差得到这段代码执行消耗的时间。
Date
最早的在JDK1.0当中就设计出来的日期类型
//注意来自于java.util包
Date date = new Date();
上面代码就可以获取到代表当前时间的Date对象。
由于Date对象是在95年的时候设计的,当时仍然按照"1900年"作为时间元点,所以时至今日,Date对象虽然仍然能够获取到系统的毫秒数,并构建对象,但是通过毫秒数去计算“年、月、日、时、分、秒”这些动作,全部被标记为“过时”。
那么这个类我们还用不用? 要用,第一个原因:这个Date可以在数据库操作的时候与数据库需要用的"java.sql.Date"有更简单的转换方式。第二个原因:是在Java当中最开始提供的时间日期格式化类,是专门操作Date对象的。
SimpleDateFormat来自于java.text包,这个类的使用很简单。
SimpleDateFormat sf = new SimpleDateFormat("字符串形式的格式");
String str = sf.format(Date对象);
现在Date的功能: 1、获取当前时间 --- 没问题; 2、获取一个指定时间的Date对象 --- 有问题的,只能根据毫秒数构建; 3、日期格式化 --- 目前来看没问题 4、时间日期的运算操作 --- 有问题,只能获取到谁比谁大(小)。
Calendar
Calendar是在JDK1.1中设计的,其首先任务就是解决Date的时间元点是“1900”的问题,它的时间元点是"1970"。
Calender是一个抽象类,因为日历对于全世界来说有各种历法,Java所实现的“格里高利历”只是一种(公历)。
//获取到代表当前时间的Calendar对象
Calendar cal = Calendar.getInstance();
修改cal对象的数据值
//第一个参数用常量表示你要修改该日历对象的哪个字段,第二哥参数就是修改成的新值
cal.set(Calendar.YEAR,2021);
cal.set(Calendar.MONTH,3);
cal.set(Calendar.HOUR,12);
获取cal对象的某项数据值
int year = cal.get(Calendar.YEAR);
在操作Calendar的日历字段的时候,要注意:不是所有的字段都是按“国人”的想法来排列的顺序。比如:月份(Month),1月在Calendar是0,后面的依次推。星期(DAY_OF_WEEK),在Calendar当中,第一个是周天。
所以在设置月份的时候,要记住-1,而获取的时候要记住+1。 获取的时候最建议的方式不是自己去通过Calendar的方法一个一个去获取,最好能利用Date和SimpleDateFormat共同完成。因此,最好掌握把一个Calendar对象转换成Date的对象的API。
//方式一
Date date = new Date(cal.getTimeInMillis());
//方式二
Date date = cal.getTime();
java.time包
java当中的时间日期经历了Date时期,到Calendar时期,都不令人满意。而唯一好用的SimpleDateFormat也出问题了,它线程不安全。而Java目前的应用主要集中在服务器端,所以线程安全考虑是绕不过的。这让Java不得不推出新的时间日期API。
新的时间日期API被放在了java.time包当中。
Instant
Instant在Java当中专门设计的一个代表“瞬时”的类型。之前的JDK中,没有专门的类代表“瞬时”,而是用的long这个数据类型,代表当前毫秒数。 那么这个新的Instant也是其同样作用的,但是它的精度不是毫秒,而是纳秒。1秒 = 1000000000纳秒。
在Instant上有两个属性用来存放精确时间。一个是long类型的seconds,用来存放距离时间元点过了多少秒;一个是int类型的nanos,用来存放秒后面的精度,就是多少纳秒。所以它其实最终表示的方式是:距离时间元点过了"seconds.nanos"。
虽然用了Instant来代表某个瞬时,但是利用这个瞬时去计算“年月日,时分秒”是非常不方便的。因此,java.time包当中还专门设计了三个类专用于底层封装Instant,然后提供API供我们操作时间日期。
LocalDate
专用于表示本地“年月日”也就是日期。 常用方法:
//获取当前日期
LocalDate.now();
//获取指定日期
LocalDate.of(年,月,日);
//根据某一天获取它之前或之后的指定日期
LocalDate对象.plusDays(天数);
LocalDate对象.plusMonths(月数);
LocalDate对象.plusYears(年数);
LocalDate对象.minusDays(天数);
LocalDate对象.minusMonths(月数);
LocalDate对象.minusYears(年数);
LocalTime
专用于表示本地时间 常用方法:
//获取当前时间
LocalTime lt = LocalTime.now();
//设置指定的时间
LocalTime when = LocalTime.of(5,30);
//往后调6个小时
lt = lt.plusHours(6);
//往前调10分钟
lt = lt.minusMinutes(10);
LocalDateTime
同时表示本地的日期和时间 常用方法
//获取当前日期时间
LocalDateTime now = LocalDateTime.now();
//设置指定的日期时间
LocalDateTime when = LocalDateTime.of(2008,5,12,13,07,56);
/*
也包含各种plus和minus
*/
属性文件
把程序中的内存瞬时数据存入到硬盘上,这个动作---"持久化"。
持久化的技术很多,最常见的就是两种:1、文件;2、数据库
属性文件是所有文件操作中最简单的一种。
属性文件指的是一种特殊格式的文件,它里面的文件内容全是"键=值"的形式存在。
public class TestProperties {
public static void main(String[] args) {
Properties props = readFile();
System.out.println(props.size());//props集合中的元素个数
//操作集合中的记录
//1、通过key获取值
String value = props.getProperty("zhang3");
value = props.getProperty("wang8");//如果key不存在,返回null
System.out.println(value);
//2、通过key修改值
props.setProperty("zhang3","65");
System.out.println(props.size());
props.setProperty("wang8","72");//如果key不存在,相当于新增
System.out.println(props.size());
writeFile(props);
}
public static Properties readFile(){
//产生一个Properties对象
Properties props = new Properties();
try {
props.load(new FileInputStream("data/student.properties"));
} catch (IOException e) {
e.printStackTrace();
}
return props;
}
public static void writeFile(Properties props){
try {
props.store(new FileOutputStream("data/student.properties"),"");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}