java 数据类型
转载请注明出处:https://www.cnblogs.com/guoapeng/p/13783339.html
第一章:java 基本数据类型
Java 中的基本数据类型只有以下8 个,除了基本类型(primitive type),剩下的都是引用类型(reference type)。
原始类型:boolean,char,byte,short,int,long,float,double。
包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double。
1. 布尔型:
原始类型(primitive type):
boolean:
说明:boolean数据类型表示一位的信息, 但是由于虚拟机处理的最小单位是byte, 所以存储一位的boolean信息仍然需要1byte。
存储字长:1byte
值范围:false, true
包装类型(reference type):
Boolean(java.lang.Boolean)
包装类型存储字长:
对象头(Header)(Markword + 类指针kclass):
32位系统上占用8bytes,64位系统上占用16bytes
实例数据(Instance Data):1byte
对齐填充(Padding):7bytes
总共:32位系统上占用16bytes,64位系统上占用24bytes
值范围:Boolean.FALSE, Boolean.TRUE
2. 整型:
8位:
原始类型(primitive type):
byte:
说明:byte 数据类型是8bit、有符号的,以二进制补码表示的整数;
存储字长:1byte
值范围:-128(-2^7)到 127(2^7-1)
默认值:0
包装类型(reference type):
Byte(java.lang.Byte):
存储字长:32位系统上占用16bytes,64位系统上占用24bytes(参考Boolean对象存储结构推算)
16位:
原始类型(primitive type):
short:
说明:short 数据类型是 16 位、有符号的以二进制补码表示的整数
存储字长:2byte
值范围:-32768(-2^15)到 32767(2^15-1)
默认值:0
包装类型(reference type):
Short(java.lang.Short)
存储字长:32位系统上占用16bytes,64位系统上占用24bytes(参考Boolean对象存储结构推算)
32位:
基本类型(primitive type):
int
说明:int 数据类型是32位、有符号的以二进制补码表示的整数;
存储字长:4byte
值范围:-2,147,483,648(-2^31)到 2,147,483,647(2^31-1)21亿多, 助记:比中国人口多约二分之一,约是世界人口的三分一
默认值:0
包装类型(reference type):
Integer(java.lang.Integer)
存储字长:32位系统上占用16bytes,64位系统上占用24bytes(参考Boolean对象存储结构推算)
64位:
原始类型:
long
说明:long 数据类型是 64 位、有符号的以二进制补码表示的整数;
值范围:-9,223,372,036,854,775,808(-2^63)到 9,223,372,036,854,775,807(2^63 -1)什么概念?
包装类型(reference type):
大于64位
对于某些科学计算,64位整数依然不够用, 比如本人曾经就遇到64位不够用的情况,用计算机尽可能快地求出尽可能多的素数,然而对于大于64位的整数java没有提供原始类型,此时可以使用java 类库提供的包装类型BigInteger(java.math.BigInteger) 该类是Number(java.lang.Number)的子类。
BigInteger bi = new BigInteger("1234567890");
System.out.println(bi.pow(5)); // 2867971860299718107233761438093672048294900000
BigInteger:
说明:BigInteger
内部用一个int[]
数组来模拟一个非常大的整数,BigInteger
用于表示任意大小的整数;
BigInteger
是不变类,并且继承自Number
;
将BigInteger
转换成基本类型时可使用longValueExact()
等方法保证结果准确,但是要处理ArithmeticException;
将BigInteger
转换成基本类型时也可使用longValue()
等方法,如果BigInteger
表示的范围超过了基本类型的范围,转换时将丢失高位信息,即结果不一定是准确的。
3. 浮点型:
32位
原始类型(primitive type):
float
说明:float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;浮点数不能用来表示精确的值,如货币;
值范围:IEEE745 ~ IEEE754
默认值是 0.0f;
包装类型(reference type):
Float(java.lang.Float)
64位
原始类型(primitive type):
double
说明:double类型同样不能表示精确的值,如货币;
值范围:IEEE745 ~ IEEE754
默认值是 0.0d;
包装类型(reference type):
Double
大于64位
java未提供大于64位浮动数的原始类型,但是在Java类库中提供了包装类型BigDecimal(java.math.BigDecimal)
货币单位建议使用java类库提供的包装类型BigDecimal
MYSQL数据库选择decimal类型,注意默认值 一定写成0.00, 不要用默认的NULL, 否则在进行加减排序等操作时, 会带来转换的麻烦!
4. 字符型:
原始类型(primitive type):
char
说明:char类型是一个单一的 16 位 Unicode 字符
值范围:Unicode 0 ~ Unicode 2^16
默认值:u0000 (Unicode 0)
包装类型(reference type):
Character(java.lang.Character)
5. 字符串类型:
在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
String实例的值是通过字符数组实现字符串存储的。
7. 数据类型小实验
浮点数为什么不能用来表示货币?
注:根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确。只能无限接近于那个值.
8. 参考文档:
https://www.runoob.com/java/java-basic-datatypes.html
java一个对象占用多少字节?
java 中 BigDecimal 详解
https://blog.csdn.net/qq_35868412/article/details/89029288
BigInteger:
https://www.liaoxuefeng.com/wiki/1252599548343744/1279767986831393
深入理解Java String类