一、java基本数据类型
1、基本数据类型介绍
java基本数据类型就8种,记住就好了。除了这些都是引用型的了。,如下图(网络图片)
java四类八种基本数据类型:
第一类:整型 byte short int long
第二类:浮点型 float double
第三类:逻辑型 boolean(它只有两个值可取true false)
第四类:字符型 char
在栈中可以直接分配内存的数据是基本数据类型。
引用数据类型:是数据的引用在栈中,但是他的对象在堆中。
要想学好Java必须知道各种数据的在内存中存储位置。
对内存有了很好的了解,可以有助你分析程序。
2、基本数据类型占用空间
boolean 布尔型 | 1或8,该类型随编译环境而定 |
byte 字节类型 | 1 |
char 字符型 | 2 一个字符能存储一个中文汉字 |
short 短整型 | 2 |
int 整数类型 | 4 |
float 浮点类型(单精度) | 4 |
long 长整形 | 8 |
double 双精度类型(双精度) | 8 |
第一类:整型 byte short int long
byte类型占1个字节,从-128到127
short从-32768到32767
int从-2147483648,到2147483647共10位
long从-9223372036854775808到9223372036854775807共19位
扩展说明:
那么为什么byte类型中1个字节的取值的范围是-128~127呢,计算机存储是利用二进制进行编排存储的,下图是计算一个正整数122的计算二进制过程,求其原码,补码和反码
java里不能这样表示二进制,只能是 8,10,16进制
第二类:浮点型 float double
在数学中0到1有无数个浮点数;而计算机是离散的,所以表示的时候有误差,计算机用精度(小数点后几位来表示正确),比较浮点数时a==0.1是不合适的,应该a-0.1==0;如果a是0.1,则即使有误差 a-0.1==0因为a和0.1都被表示为一个有误差的计算机二进制
第三类:逻辑型 boolean(它只有两个值可取true false)
第四类:字符型 char
三、基本类型对应包装类源码分析
1、Byte类
(1)Byte中主要提供的方法有
public final class Byte extends Number implements Comparable<Byte> {
Byte(byte value);构造方法
int compare 比较大小 静态工厂方法
Byte decode 解码方法,包括二进制、八进制、十六进制 静态工厂方法
int hashCode 计算hashcode码
byte parseByte 转换为Byte类型
String toString 转换成字符串
int toUnsignedInt byte转int
Byte valueOf 转换为Byte类型 静态工厂方法
boolean equals 比较byte大小
}
需要注意toUnsignedInt方法:
1.计算机中数据按照补码存储
2.byte是8位,int是32位,byte转换为int后是32位,如果不和0xff进行与运算,
例如:byte=-1 那么转为int的补码就是11111111 11111111 11111111 11111111,toHexString()后就是ff ff ff ff 跟原来的相比较多了三个ff。
byte为负数,高3字节就填充1,整数就补0,所以,如果byte是正数那么是否进行&0xff结果都一样;如果是负数就一定需要&0xff。
(2)Byte的属性域
//最小值
public static final byte MIN_VALUE = -128;
//最大值
public static final byte MAX_VALUE = 127;
//声明类型
//获取JVM本地类型
public static final Class<Byte> TYPE = (Class<Byte>) Class.getPrimitiveClass("byte");
//二进制长度
public static final int SIZE = 8;
//java8新属性,补充二进制
public static final int BYTES = SIZE / Byte.SIZE;
//byte存储
private final byte value;
//静态内部类
private static class ByteCache {
//不提供实例化方法
private ByteCache(){}
//缓存byte的所有值
//好处显而易见,使用比较多时节省内存空间
static final Byte cache[] = new Byte[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Byte((byte)(i - 128));
}
}
(3)主要方法
//主要调用了Integer的parseInt方法
public static byte parseByte(String s, int radix)
throws NumberFormatException {
int i = Integer.parseInt(s, radix);
if (i < MIN_VALUE || i > MAX_VALUE)
throw new NumberFormatException(
"Value out of range. Value:\"" + s + "\" Radix:" + radix);
return (byte)i;
}
//调用了Integer.decode 八进制、十六进制转换
public static Byte decode(String nm) throws NumberFormatException {
int i = Integer.decode(nm);
if (i < MIN_VALUE || i > MAX_VALUE)
throw new NumberFormatException(
"Value " + i + " out of range from input " + nm);
return valueOf((byte)i);
}
//转换其他类型,直接进行强制转换,低级变量向高级变量转换
public double doubleValue() {
return (double)value;
}
(4)parseByte 与 valueOf方法的区别
//返回值是byte,相当于在栈中划分新的内存空间
public static byte parseByte(String s, int radix)
throws NumberFormatException {
int i = Integer.parseInt(s, radix);
if (i < MIN_VALUE || i > MAX_VALUE)
throw new NumberFormatException(
"Value out of range. Value:\"" + s + "\" Radix:" + radix);
return (byte)i;
}
//静态工厂方法,返回包装类,实际存储内容已经缓存在静态内部类中
public static Byte valueOf(String s, int radix)
throws NumberFormatException {
return valueOf(parseByte(s, radix));
}
2、Short类
short属性域与Btye类似的,所差别的主要是值域范围
short的主要方法也类似于btye,调用的是Integer的方法
3、由于Integer类型比较复杂,所以后续会单个提出一章来讲解