基本数据类型包装类
基本数据类型(8)
数值型:byte、short、int、long、float、double
字符型:char
布尔型:boolean
基本数据类型都是存储栈中,栈中存储的就是值本身,赋值、参数传递的时候操作的也是值本身。
Java是面向对象的,对象都有属性和方法,基本数据类型只有值,没有方法,不遵循面向对象。Java为了完善,为了提供更多的方法去操作基本数据数据
就提供出来了包装类。
包装类:
byte--- Byte
short---Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
除了int--Integer、char--Character,其它的都是首字母变大小
包装类的继承关系
Object
--Number(abstract父类)
--Byte、Short、Integer、Long、Float、Double
--Character
--Boolean
Integer以此为例
public final class Integer extends Number implements Comparable<Integer>
1、final 不能继承
2、extends Number 未继承很多功能
3、Comparable<Integer> 可比较的 Arrays.sort()
public int compareTo(T o);
返回值:负数:小于 正数:大于 0:等于
属性 field
MIN_VALUE -2147483648 -2^31
MAX_VALUE 2147483647
TYPE 获取int类对象
SIZE = 32; int数据占32位
BYTES = SIZE / Byte.SIZE int数据占多少字节
程序中使用的话,直接用常量,可以节约资源
private final int value; 存储的就是Integer类的数据,本质上就是int value
value一旦赋值,不能更改,靠什么达到像String对象的共享?---稍后
构造
Integer(int value)
Integer(String s)---要求s必须能转换成int,否则NumberFormatException: For input string: "a25"
方法
static int parseInt(String s)
static int parseInt(String s, int radix) 就是把字符串转换成int ,radix进制可选
不支持Integer.parseInt("0x10",16) 但是Integer.parseInt("10",16)
------------------------------------------------------------------
static Integer valueOf(String s) 、
static Integer valueOf(int i)
valueOf系列方法,把其它数据类型转换成当前类型
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
以上方法意思就是,如果传入的整数是-128-high之间的数,直接从缓存中返回对象。否则新创建
原来,Integer类中有一个静态内部类 IntegerCache,内部类中有一个cache,当Integer加载的时候,就会初始化此类,缓存
-128-high(一般就是127)之间的数。
如果你需要Integer类型的对象,优先使用valueOf,而不是构造方法
其它包装类?
public static Float valueOf(float f) {
return new Float(f);
}
Float、Double类的valueOf()没有缓存。为什么不呢?[-128-127] 整数数量是固定的,小数是无穷的。
Boolean类
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
总结:
1、Byte、Short、Integer、Long的valueOf方法都有缓存,【-128,127】
2、Float、Double的valueOf方法没有缓存,每次都会新创建对象
3、Character 的valueOf方法 有缓存,【0,127】
4、Boolean 的valueOf方法 有缓存,有静态的常量true,false,直接返回
-------------------------------------
xxx(基本数据类型) xxxValue() 获取包装类中的基本数据类型的值 value
-------------
toString()
static String toString(int i)---建议看源码
------------
equals方法主要来判断值是否相等
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Integer 中equals方法:当类型相同且值相等,才返回true
-----------------
进制间转换 把10进制的数转换成其它进制
static String toHexString(int i) --16进制
static String toOctalString(int i) --8进制
static String toBinaryString(int i)--2进制
------
static int reverse(int i) 反转 不是这样的效果123---321
总结:1、数据类型转换
int--String
1)a+""
2)String.valueOf()
3)Interger:String toString(int i)
String--int
1)Integer.parse(String)
Integer-String
1)toString()
String--Integer
1)Integer valueOf(String s, int radix)
2)Integer(String s)
int--Integer
1)Integer(int i)
2)Integer valueOf(int i)
Integer--int
1)int intValue()
2、进制转换
------------------------
装箱:基本数据类型--->包装类型 自动转换
本质:Integer.valueOf()
Integer i=12;
Integer i2=Integer.valueOf(12);
以上代码效果相同
---
Integer num1=12;
Integer num2=12;
System.out.println(num1==num2);//true
说明num1和num2地址相同,因为num1和num2都是从缓存中取的同一个地址
--
Integer num1=129;
Integer num2=129;
System.out.println(num1==num2);//false
129没有缓存,每次都需要重写创建,所以num1和num2地址不同
--
Double num1=12d;
Double num2=12d;
System.out.println(num1==num2);//false
因为Double 没有缓存
拆箱:包装类型--基本类型 自动转换
本质:Integer.intValue()
int num=i;//拆箱
注意:如果可以的话,不要频繁地装拆箱
什么时候装箱、拆箱?
Integer num1=400;
int num2=400;
System.out.println(num1==num2);//true
返回true就可以说明num1发生了拆箱操作。换一句话来说,==链接包装类和基本数据类型的时候,就拆箱
Integer num1=400;
int num2=400;
System.out.println(num1.equals(num2));//true
返回true就可以说明num2进行了拆箱
Long num1=400l;
int num2=400;
System.out.println(num1.equals(num2));//false
原因:long类型的equals方法要求类型相同且值相同才返回true,而num2自身装箱成了Integer类型
Integer num1=400;
int num2=400;
System.out.println(num1*num2);
当+、-、*、/、%链接包装类和基本数据类型的时候,是拆箱
拆箱的时候注意避免空指针异常
Integer num1=null;
int num2=num1;//java.lang.NullPointerException
就是拆箱实际在执行intValue()
Character
System.out.println(Character.isDigit('a'));
System.out.println(Character.isLetter('a'));
System.out.println(Character.isWhitespace(' '));
System.out.println(Character.isUpperCase('A'));
System.out.println(Character.isLowerCase('b'));
System.out.println(Character.toLowerCase('U'));
BigInteger
做权限控制
BigInteger setBit(int n) bi+2^n
boolean testBit(int n)
BigDecimal