包装类、数学类和日期类
包装类(Package class)
1、定义
给每种基本类型提供一个对应的类形式这些类我们称之为包装类。
之前说过void,这里我也把它加上了。
byte | short | int | long | float | double | char | boolean | void |
---|---|---|---|---|---|---|---|---|
Byte | Short | Integer | Long | Float | Double | character | Boolean | Void |
int和char对应的包装类发生变化。
数值类的顶级父类是Number class。
2、特点
1.包装类底层对toString()方法做过重写,直接打印出数值。
2.包装类底层将字符串转化为一个字符数组,首先判断数组的首位是否是+、-,再依次判断每一位是否是一个数字字符。
3、自动封箱:
1.定义
将一个基本类型的变量转化为了对应的引用类型对象的过程叫封箱/装箱。
将一个基本类型的变量来直接赋值给对应的引用类型对象的过程叫自动封箱/自动装箱。自动封箱实际上是调用了对应类的valueOf方法。
int i = 0x15;
// 将一个基本类型的变量转化为了对应的引用类型的对象---封箱/装箱
Integer in = new Integer(i);
// 说明底层对toString方法做过重写
System.out.println(in);
int i = 5;
// 将一个基本类型的变量直接赋值给对应的引用类型的对象--自动封箱
// 自动封箱在底层实际上调用了valueOf方法
Integer in = Integer.valueOf(i);
Integer in = i;
System.out.println(in);
4、自动拆箱:
1.定义
将一个引用类型的对象来直接赋值给对应的基本类型变量的过程叫自动拆箱。自动拆箱实际上是调用了对应对象的***Value方法。
Integer in = new Integer(120);
// 将一个引用类型的对象直接赋值给对应的基本类型的变量---自动拆箱
// 自动拆箱在底层实际上调用了intValue方法
// int i = in.intValue();
int i = in;
System.out.println(i);
自动封箱/拆箱是JDK1.5的特性之一
Integer in1 = 150; // new Integer(150)
Integer in2 = 150; // new Integer(150)
System.out.println(in1 == in2);
5、注意
由于自动封箱的问题,所以值在-128到127之间的时候会进行判断,如果值在-128到127之间,会直接指向常量池。如果不在这个范围内,会在底层new integer(value)实际上指向了堆内存。
如果是基本类型和引用类型进行运算,引用类型会进行自动拆箱。
Integer i1 =1000;
Int i = 1000;
System.out.println(i1 == i);//结果为true
6、构造函数
Package(package p);
Byte(byte value);
Short(short value);
Integer(int value);
Long(long value);
Double(double value);
Float(double value); Float(float balue);
Character (char value);
Boolean(boolean value);
如果字符串不是“true”那么结果就是false。
Package(String s);
Byte(String s);
Short(String s);
Integer(String s);
Long(String s);
Double(String s);
Float(String s);
Boolean(String s);
将一个字符串转化为一个包装类。底层调用的是pares***方法。
包装类底层将字符串转化为一个字符数组,首先判断数组的首位是否是+、-,再依次判断每一位是否是一个数字字符。
Character没有提供字符串转化,所以可以用下面的方法转化:
“a” -> ‘a’ “a”.charAt(0) -> ‘a’ “a”.toCharArray()[0]
底层过程
1.调用来parse***方法。
2.获取这个字符串的第一个字符,判断是否是+/-。
3.遍历这个字符串的每一位,依次判断每一位是否是一个数字字符。
4.如果不是数字字符,则报错:NumberFormatException。
7、重要方法
parse基本数据类型(String s);
parseByte(String s);
parseShort(String s);
parseInt(String s);
parseLing(String s);
ParseFloat(String s);
parseDouble(String s)
parseBoolean(String s);
将一个字符串转化为一个包装类。
hashCode();
Integer类型的哈希码是其实际值。包括baty,short,int。
Long类型的哈希码是其实际值(int)((value)^(value>>>32))。
Double 类型的哈希码也是固定的。
小数的哈希码需要经过计算;
字符的哈希码是其对应的编码;
布尔类型的哈希码是返回一个特殊值—true:1231 false:1237
包装类对象的哈希码都是固定的。
八种基本类型的哈希码都是固定值。
数学类
1、Math class
Math class是一个最终类,构造函数是私有的,提供了一系列的静态方法来操作数据。是一个完全的工具类。提供了基本的数学运算,运算的是基本类型。
1.字段摘要
1.E:自然底数。比任何其他值都更接近 e(即自然对数的底数)的 double 值。
2.PI:圆周率。比任何其他值都更接近 pi(即圆的周长与直径之比)的 double 值。
2.重要方法
abs(int/long/double/float i);
绝对值。
cbrt();
立方根。
ceil(double d)
向上取整。结果是doulble类型。
floor(double d)
向下取整。结果是double类型。
max(int/long/float/double m,int/long/float/double m)
返回两个数中的最大数。
min(int/long/float/double m,int/long/float/double m)
返回两个数中的最小数。
round(double d)
四舍五入。结果是long类型。
sqrt(double d)
求平方根。
pow(double d , double a)
求d的a次方。结果是double类型。
random()
返回一个[0,1)伪随机数。
public static void main(String[] args) {
System.out.println(Math.E);
// 向上取整
System.out.println(Math.ceil(3.1));
// 向下取整
System.out.println(Math.floor(-3.999));
// 四舍五入
System.out.println(Math.round(3.45));
// 平方根
System.out.println(Math.sqrt(3));
// 幂 ---pow(double a, double b) -> a^b
System.out.println(Math.pow(-1, 0.5));
// 返回一个[0,1)的伪随机数
System.out.println(Math.random());
for (int i = 0; i < 10000; i++)
if (Math.random() * Math.random() > 0.95) {
System.out.println("亲,你中奖了~~~");
}
}
2、strictfp关键字(80位)
小数在运算过程中是以64位二进制来进行计算,当用strictfp修饰方法的的时候,表示在方法执行的过程中,以80位二进制来运算小数,最后的结果依然会保存为64位。
3、BigDecimal class(大十进制类)
可以精确表示任意一个小数。
用于精确运算小数的类。不能使用以前的运算符进行计算,而是调用方法,在使用的时候需要将参数以字符串形式传入。
System.out.println(3 - 2.89);
BigDecimal bd1 = new BigDecimal("3");
BigDecimal bd2 = new BigDecimal("2.89");
System.out.println(bd1.subtract(bd2));
1.构造方法
Bigdecimal(int/long/double/String o);
2.重要方法
abs();
绝对值。
add(BigDecimal dibisor);
加法。
divide();
除法。
multiply();
乘法。
日期类
1、Date class
这个类中大部分方法已经过时。
deprecation 表示此方法已过时。
1.构造函数
Date();
获取当前系统时间。
Thu Nov 16 10:28:31 CST 2017
星期 月份 日期 时间 时区 年份
China standard timezone 中国标准时区。
从打印对象就能看出,Date class底层对toString做来重写。
Date(2000,2,1);
在1900年1月来累加参数,指定时间。
Thu Mar 01 00:00:00 CST 3900
2、DateFormat class
是一个抽象类。
1.SimpleDateFormat class
继承了DateFormat class。
日期标识符
字母 | 日期或时间元素 | 表示 | 示例 |
---|---|---|---|
G | Era | 标志符 | Text AD |
y | 年 | Year | 1996; 96 |
M | 年中的月份 | Month | July; Jul; 07 |
w | 年中的周数 | Number | 27 |
W | 月份中的周数 | Number | 2 |
D | 年中的天数 | Number | 189 |
d | 月份中的天数 | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天数 | Text | Tuesday; Tue |
a | Am/pm 标记 | Text | PM |
H | 一天中的小时数(0-23) | Number | 0 |
k | 一天中的小时数(1-24) | Number | 24 |
K | am/pm 中的小时数(0-11) | Number | 0 |
h | am/pm 中的小时数(1-12) | Number | 12 |
m | 小时中的分钟数 | Number | 30 |
s | 分钟中的秒数 | Number | 55 |
S | 毫秒数 | Number | 978 |
z | 时区 | General time zone | Pacific Standard Time; PST; GMT-08:00 |
Z | 时区 | RFC 822 time zone | -0800 |
构造函数
SimpleDateFormat();
用默认的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。
SimpleDateFormat(String pattern);
重要方法
Format(Date date, StringBuffer toAppendTo, FieldPosition pos);
将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer。
parse(String text,ParsePosition pos);
解析字符串的文本,生成 Date。
// 将字符串转化为日期对象
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2000-02-01 12:42:15");
// XX年XX月XX日
// 将日期对象转化为字符串
String str = new SimpleDateFormat("yyyy年MM月dd日").format(date);
System.out.println(str);
3、Calendar class(日历类)
也是一个抽象类。有一个子类:GregorianCalendar。
Calendar c = Calendar.getInstance();
Calendar c = Calendar.getInstance();
System.out.println(c);