目录
回顾:
八种基本数据类型:
数值:
整型:int、byte、short、long
浮点型:float、double
字符:char
布尔:boolean
包装类
1.什么是包装类:
Java是面对对象语言,所有的对象都是继承自Object。对象都有属性和方法,但是基本数据类型只有数据。为了完善这一点,就引入了包装类。目的就是封装基本数据类型,提供更多的操作数据的方法。
基本数据类型 | 包装类 |
int | Integer |
byte | Byte |
short | Short |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
注意:
1.大多数基本数据类型的包装类的名称与对应的基本数据类型名称一样,第一个首字母
大写。处理Integer和Character。
2.Integer、Byte、Short、Long、Float、Double包装类是继承Number类的,然
后Number类再继承Object类。而Character和Boolean包装类是直接继承Object类。
包装类的基本操作:
以Integer为例
源码:
由以上源码可知:
1.Integer类不能被继承(被final修饰的类都是最终类)
2.继承子Number类
3.实现了compara接口(比较)
接口中的要实现的方法:
返回值:若为0,则表示等于;若为负值,则表示小于;若为正值,则表示大于。
常用方法:
常用构造方法:
Integer (int value)
Integer(Strig s) //s必须是整型的,比如:"123"
普通方法
static int parseInt(String s, int radix)按照一定的进制把字符串转换int
valueOf()系列 把int,String转换成Integer类型对象
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
内部维护了一个静态内部类IntegerCache,这个内部类中事先初始化了-128~127
范围内的Integer对象。当调用valueOf的时候,i如果是-128~127的,则不再创建新的对象了
IntegerCache.low 的值为-128 IntegerCache.high的值为127(感兴趣可以去看一下源码)
Integer | -128 ~ 127 |
Byte | -128 ~ 127 |
Long | -128 ~ 127 |
Short | -128 ~ 127 |
Float | 没有缓存 |
Double | 没有缓存 |
Character | 0 ~ 127 |
Boolean | Ture、False |
返回值 | 方法名 | 解释 |
byte | byteValue() | 将该integer类型转为byte类型 |
double | doubleValue() | 将该integer类型转为double类型 |
float | floatValue() | 将该integer类型转为float类型 |
int | intValue() | 将该integer类型转为int类型 |
long | longValue() | 将该integer类型转为long类型 |
static int | parseInt(String s) | 将字符串转为int类型 |
String | toString() | 转为字符串类型 |
static Integer | valueOf(String s) | 将字符串转为Integer类型 |
代码实例:
public class Demo1 {
public static void main(String[] args) {
Integer num1 = new Integer(123);
Integer num2 = new Integer(123);
System.out.println(num1==num2);
Integer i1 = Integer.valueOf(123);
Integer i2 = Integer.valueOf(123);
System.out.println(i1 == i2);
Integer i3 = Integer.valueOf(129);
Integer i4 = Integer.valueOf(129);
System.out.println(i3 == i4);
System.out.println(num1 == i1);
}
}
上述代码中,(==是比较地址),num1与num2相当于在堆内存中new了两个新对象(开辟了两个新的空间),与储存池无关,所有输出“false”;i1与i2相当于都指向了储存池的123,所有输出为“true”;i3与i4都不是被new出来的,但是我们要考虑缓存池的范围,缓存池的范围是“-128~127”,所以输出“false”;num1与i1一个是堆内存的值,一个是缓存池的地址,所以输出“false”。
执行结果:
---进制间的转换
static String toString(int i) 转换成10进制字符串
static String toHexString(int i) 转换成16进制字符串
static String toOctalString(int i)转换成8进制字符串
static String toBinaryString(int i) 转换成2进制字符串
int、Integer、String之间的转换
拆箱与装箱
(自动拆装箱是jdk1.5之后引入的)
JDK1.5 为Integer 增加了一个全新的方法:
public static Integer valueOf(int i)
在自动装箱过程时,编译器调用的是static Integer valueOf(int i)这个方法 于是Integer a=3;
==>Integer a=Integer.valueOf(3);
。此方法与new Integer(i)的不同处在于:
方法一调用类方法返回一个表示 指定的 int 值的 Integer 实例。方法二产生一个新的Integer 对象。
装箱:把基本数据类新转换成包装类
--自动装箱
--手动装箱
拆箱:把包装类转换成基本数据类型
--自动拆箱
--手动拆箱
public class WrapDemo1 {
public static void main(String[] args) {
//自动装箱
int t1 = 10;
Integer t2 = t1;
//手动装箱
Integer t4 = new Integer(t1);
System.out.println("int类型t1的值是:" + t1);
System.out.println("Integer类型t2的值是:" + t2);
System.out.println("Integer类型t4的值是:" + t4);
System.out.println("===================");
//自动拆箱
int t3 = t2;
//手动拆箱
int t5 = t4.intValue();
System.out.println("int类型t3的值是:" + t3);
System.out.println("int类型t5的值是:" + t5);
}
}
执行结果是:
包装类与基本数据类型的使用场景:
--使用方法、集合的时候就使用包装类
--使用+-*/等运算时使用基本数据类型
什么时候会拆箱,什么时候会装箱:
--在进行+-*/运算的时候,会拆箱。
--在进行==运算的时候,会拆箱
--在调用对象方法的时候,会装箱
public class TestWrap2 {
public static void main(String[] args) {
Integer i1=23;
int i2=45;
int sum=i1-i2;//拆箱
System.out.println(sum);
Integer i3=200;
int i4=200;
System.out.println(i3==i4);
//在使用方法的使用,因为equals括号里的参数是对象,所以在使用方法时会自动装箱
System.out.println(i3.equals(i4));//装箱
//会报错,因为i2是基本数据类型,不能都调用equals方法
// System.out.println(i4.equals(i3));
//在装箱的时候,基本数据类型只能装成对应的包装类类型
Long ll=100L;
int ll2=100;
System.out.println(ll.equals(ll2));
}
}
执行结果:
补充(BigInteger 、 BigDecimal):
Biglnteger 类和 BigDecimal 类可以用于表示任意大小和精度的整教或者十进 制数。
都适用超大数据的计算,特别是科学计算。它们都是不可变的。long 类型的最大整数值为 long.MAX _ VALUE (即 9223372036854775807)。Biglnteger 的实例可以表示任意大小的整数。
BigInteger
其中维护了一个int[]
用途:
进行权限验证
BigInteger setBit(int n)
boolean testBit(int n)
BigDecimal