您的位置:首页 > 编程语言 > Java开发

深入源码-java数据类型-8种基本数据类型

2017-10-10 00:00 169 查看
一、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类型比较复杂,所以后续会单个提出一章来讲解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息