包装类
概述
Java中为8种基本数据类型对应准备了8种包装类型,这8种包装类都属于引用类型。
public ststic void main(String[] args){
doSome();
}
public static void doSome(Object obj){
Systrm.out.print(obj);
}
当我们需求在调用doSome()方法的时候传递一个数字进去,但是数字属于基本数据类型,daSome()方法需要的是一个引用数据类型,很明显,是无法放进去的,此时,我们可以创建一个新的对象存储数字,然后把这个对象传递进去。
public class MyInt{
int value;
public MyInt(){
}
public MyInt(int value){
this.value = value;
}
}
这样我们就可以实现传递数字进去,这就是我们自己写的int类型的包装类型。事实上,这8中基本数据类型对应的8种包装类,SUN公司都已经写好了,我们直接用即可。
8种包装类
Integer使用最多,重点学习这个,其他的依葫芦画瓢即可。
Number
8种包装类中前六个都是继承自Number类,可以通过研究这个类来研究包装类。
Number是一个抽象类,提供了将引用数据类型转换为基本数据类型的方法。
装箱拆箱
基本数据类型转换为引用数据类型被称为装箱,引用数据类型转换为基本数据类型被称为拆箱。
Integer
创建对象
这两种方法在JDK9就已经过时了,出现横线就表示
已过时,但还是可以使用。
这里是不能将字符串创建为Integer类型的,会报错:NumberFormatException
常见报错:
- 空指针异常:
_NullPointerException_
- 类型转换异常:
_ClassCastException_
- 数组下标越界异常:
_IndexOutOfBoundsException_
- 数字格式化异常:
_NumberFormatException_
通过常量获取最大值最小值
包装类中提供了一些常量,我们可以利用这些常量求出该类型最大值和最小值。
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Byte.MAX_VALUE);
System.out.println(Byte.MIN_VALUE);
}
这样子就可以在需要的时候直接调出来,不需要记忆这堆数字了~
自动拆箱与自动装箱
在JDK1.5之后,Java支持自动装箱和自动拆箱
public static void main(String[] args) {
//自动装箱
Integer x = 100;
//自动拆箱
int y = x;
}
这里并不是将100这个基本数据类型赋值给Integer,而是通过自动装箱机制将int类型转换为integer类型再进行赋值,自动拆箱同理。
这个对象是一个引用,是一个变量,保存了一个对象的内存地址。System.out.println(x + 1);
运算的时候会自动拆箱,转换为基本数据类型来进行计算。
在进行比较的时候,不会进行自动拆箱,是直接将地址进行比较。但是Java中为了提高效率,将[-128到127]的包装对象提前创建好,放到一个整数型常量池(在方法区)中,此时就不需要再创建对象,比较地址的时候是一样的。
这个整数型常量池会在调用Integer类的时候就完成对256个对象的初始化!
池:cache,缓存机制。效率高但是耗费内存。
Integer常用方法
Java的API文档中提供了很多Integer的方法,这里挑选其中两个比较重要的学习:
通过这两个方法,可以实现Integer,int,String三种类型的互换:
剩下的7个包装类与Integer大同小异,依葫芦画瓢并借助API文档即可。
日期类
日期格式化
Java.util.Date
中提供了一些日期类帮助我们获取日期。
Date nowTime =new Date();
System.out.println(nowTime);
Fri Feb 03 10:41:03 CST 2023
这是默认的Date方法提供的日期格式,很明显不适合我们中国人的观看格式,为此,Java也提供了日期格式化的方法`SimpleDateFormat()
在日期格式中,除了y M d H m s这些字符不能随便写之外,其他的都可以随意组织~
这样我们就能够自己创建我们自己想要的格式,再通过format()
方法将格式赋给,实现将时间按照我们想要的格式输出。
Date nowTime =new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String NewTime = sdf.format(nowTime);
System.out.println(NewTime);
2023-02-03 10:50:32 036
这样的格式看着也舒服~
日期字符串与日期类的转换
上面我们是将日期类转换为日期字符串输出,那么反过来,我们需要将日期字符串转换为日期类,需要先创建一个格式与日期字符串对应的格式,再利用parse()
方法将字符串传给日期类即可。
String time = "2023-02-03 10:50:32 036";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
Date dateTime = sdf.parse(time)
System.out.println(dateTime);
Fri Feb 03 10:50:32 CST 2023
这里就实现了日期类和日期字符串的转换。
如果这里日期的格式和字符串格式不一样,那么会出现异常:
ParseException
统计方法执行时长
案例: 统计一个方法执行所耗费的时长。
想要统计一个方法的时长,我们可以在方法执行的开始记录一个时间,在结束的时候也调用一个时间,两个时间差就是我们这个方法执行的时间。
Java提供了一个currentTimeMillis()
方法让我们的得知从1970年1月1日0时0分0秒0毫秒到现在的时间总毫秒数,这个方法是在java.lang.System
包中。
public static void main(String[] args) throws ParseException {
long begin = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
System.out.println("i = " + i);
}
long end = System.currentTimeMillis();
System.out.println("执行时长为:"+(end-begin)+"毫秒");
}
通过这个方法,我们可以算出很多时间,只需要通过加减就可以实现。
通过毫秒构造Date对象
除了无参构造Date对象,Java中有两种有参的构造方法,但是由于第一种已经荒废,我们主要了解第二个。
public static void main(String[] args) throws ParseException {
Date time = new Date(1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String strTime = sdf.format(time);
System.out.println(strTime);
}
此时的输出结果为:1970-01-01 08:00:00 001
,从八点开始是因为我们处于东八区,时区导致它的开始时间不同。
数字类(了解)
数字的格式化
与日期的格式化类似,数字也有自己的格式来实现格式化:DecimalFormat()
数字的格式:
#
:表示任意数字。,
:表示千分位。.
:代表小数点。0
:代表不够的时候补零。
例如:###,##.##
public static void main(String[] args) throws ParseException {
DecimalFormat df = new DecimalFormat("#,###.####");
String s = df.format(1234.56);
System.out.println(s);
}
当精度需求很高的时候,我们可以使用BigDecimalFormat来实现格式化。