常用类:包装类、时间日期类、属性文件

155 阅读8分钟

常用类

复习

  1. String是一个特殊的引用数据类型,除了所有引用数据类型支持的new的方式以外,它还可以直接赋值一个字面常量(也就是双引号的字符串常量)。--- 这个特点引出了“字符串常量池” --- String在用"=="比较的时候,有时候也能得到true。
  2. String的内容不可变。 原因:不是因为String类是final的,而是它内部装字符的数组是final的。 --- 额外需要知道的这个数组以前是char[], 现在是byte[]。
  3. 为了解决String内容不可变,那么又提出了StringBuffer和StringBuilder。它们两个都是内容可变的字符串序列类型,提供的方法也主要用于字符串内容的修改(append\insert\delete\replace)。--- 当我们在程序中需要大量操作字符串内容改变的动作时,可以考虑使用这两个类。 --- 它们两个的区别是是否“线程安全”。
  4. 掌握常用的String类的API方法!--- 其中单独讲解了“正则表达式”。

包装类

在Java当中两类数据类型:基本和引用。目前来看,这两类数据类型是割裂的,因为无论是它们的存放结构 还是 提供的内容,都让它们是分开的两个体系。

包装类的出现 主要的任务就是在基本数据类型和引用数据类型之间 搭建一个“桥梁”。

4类8种基本数据类型,各有一个包装类与之对应。

byte Byte

short Short

int Integer

long Long

float Float

double Double

char Character

boolean Boolean

所有的包装类的使用方式都是一样的,只要掌握了一个,其他都是相似的。

//基本 -->  包装
int num = 100;
//直接调用Integer带参构造
Integer in = new Integer(num);
//自动封箱 -- JDK1.5之后的语法 --- 语法糖
in = num;

//包装 -->  基本
Integer in = 200;
//调用Integer对象的intValue()
int num = in.intValue();
//自动拆箱 -- JDK1.5之后的语法糖
int num = in;

//String --> 基本
String str = "300";
int num = Integer.parseInt(str);

//基本 --> String
int num = 400;
String str = Integer.toString(num);

//包装 --> String
Integer in = 500;
String str = in.toString();

//String --> 包装
String str = "111";
//JDK9开始过时
Integer in = new Integer(str);
//把任意进制的数值(字符串类型),转成Integer对象
Integer in  = Integer.parseInt(str,10);

时间日期类

时间和日期是任何一个程序当中都不可能不涉及的数据,另外在很多加密算法或随机数算法中,都涉及到了使用时间来作为计算的种子元素。

时间的本质

在计算机内部,时间的本质不是一个字符串。我们所能看到"年月日"只是它的一个显示形式,这种形式会很多,"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、数据库

属性文件是所有文件操作中最简单的一种。
属性文件指的是一种特殊格式的文件,它里面的文件内容全是"键=值"的形式存在。
//产生一个Properties对象
Properties props = new Properties();
//props集合中的元素个数
System.out.println(props.size());

//操作集合中的记录
//1、通过key获取值
String value = props.getProperty("zhang3");
//如果key不存在,返回null
value = props.getProperty("wang8");
System.out.println(value);

//2、通过key修改值
props.setProperty("zhang3","65");
//如果key不存在,相当于新增
props.setProperty("wang8","72");