一、java基本数据类型

1、基本数据类型介绍

java基本数据类型就8种,记住就好了。除了这些都是引用型的了。,如下图(网络图片)

java 归类 java各种类型的数据_静态工厂方法


java四类八种基本数据类型:

第一类:整型 byte short int long 

第二类:浮点型 float double

第三类:逻辑型 boolean(它只有两个值可取true false)

第四类:字符型 char

在栈中可以直接分配内存的数据是基本数据类型。 
引用数据类型:是数据的引用在栈中,但是他的对象在堆中。 
要想学好Java必须知道各种数据的在内存中存储位置。 
对内存有了很好的了解,可以有助你分析程序。

2、基本数据类型占用空间

boolean 布尔型

1或8,该类型随编译环境而定

byte 字节类型  

1

char 字符型  

2  一个字符能存储一个中文汉字 

short 短整型 

2

int 整数类型


float 浮点类型(单精度)

4

long 长整形   


double 双精度类型(双精度)

8

第一类:整型 byte short int long 

byte类型占1个字节,从-128到127
short从-32768到32767
int从-2147483648,到2147483647共10位
long从-9223372036854775808到9223372036854775807共19位

java 归类 java各种类型的数据_静态工厂方法_02

扩展说明:

那么为什么byte类型中1个字节的取值的范围是-128~127呢,计算机存储是利用二进制进行编排存储的,下图是计算一个正整数122的计算二进制过程,求其原码,补码和反码

java 归类 java各种类型的数据_基本数据类型_03

java里不能这样表示二进制,只能是   8,10,16进制 

java 归类 java各种类型的数据_java_04

第二类:浮点型 float double

在数学中0到1有无数个浮点数;而计算机是离散的,所以表示的时候有误差,计算机用精度(小数点后几位来表示正确),比较浮点数时a==0.1是不合适的,应该a-0.1==0;如果a是0.1,则即使有误差 a-0.1==0因为a和0.1都被表示为一个有误差的计算机二进制

java 归类 java各种类型的数据_java_05

java 归类 java各种类型的数据_java_06

第三类:逻辑型 boolean(它只有两个值可取true false)

java 归类 java各种类型的数据_静态工厂方法_07

第四类:字符型 char

java 归类 java各种类型的数据_基本数据类型_08

三、基本类型对应包装类源码分析

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类型比较复杂,所以后续会单个提出一章来讲解