今天的博客主题
Java编程基础 ——》Java数据类型
数据类型就是指数据的类型。
Java是强类型语言,所以Java对数据类型的规范相对的严格些。
Java数据类型分两种:基本数据类型和引用数据类型
基本数据类型
在程序设计中经常会用到一系列的类型,需要特殊对待。
对于这些类型Java就不使用new关键字来创建变量,而是创建一个并非引用的自动变量,这个变量直接存储值,至于堆栈中,因此更加高效。因为new将对象存在堆里,如果用new来创建,对这些小的,简单的变量不是很有效。所以就出现了基本数据类型,不用new,直接存储。
Java要确定基本数据类型所占存储空间的大小。
这些大小不像其他语言随机器硬件架构的变化而变化。
这种所占存储空间大小的不变性是Java程序比其他大多语言编写程序更具可移植性的原因之一
所以说Java是强类型的语言。
Java中的数据类型分为字符型和非字符型,共8种
字符型:字节型(byte)和字符型(char)
非字符型里又分了数字类型和非数字类型
数字类型:整型(int)短整型(short)长整型(long)浮点型(float)双精度型(double)
非数字类型:布尔型(boolean)
这些就是Java八大基本数据类型,每种数据类型都有它的边界,无需强制记。
不同的类型变量在内存中分配的字节数不同,存储方式也是不同。
所以在给变量赋值前需要先确定变量的类型,确定了变量的类型,也就确定了数据需分配内存空间的大小,数据在内存的存储方式。
存储的原理:上面也提了基本数据类型都是直接存储在内存中栈空间里面的。
Java数据类型是存储模型,不存在引用的概念。对象才存在引用的概念。
基本数据类型具有包装器类,使的可以在堆中创建一个非基本对象,用来表示对应的基本类型。
也叫包装数据类型,可以看做是对基本数据类型的封装。
基本类型 | 大小 | 最小值 | 最大值 | 包装类型 |
byte | 8 bits | -128 | +127 | Byte |
char | 16 bits | Unicode o | Unicode 2^16-1 | Character |
int | 32 bits | -2^31 | +2^31-1 | Integer |
short | 16 bits | -2^15 | +2^15-1 | Short |
long | 64 bits | -2^63 | +2^63-1 | Long |
float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
boolean | —— | —— | —— | Boolean |
boolean类型所占存储空间没有明确定义,因为只有两个值true和false
基本数据类型定义使用
// 先定义(声明)在赋值
int i;
i = 99;
// 在定义的同时并赋值
int i = 88;
// 同时定义多个
int a,b,c,d;
// 同时定义多个并赋值
int a = 1, b = 2, c = 3, d = 4;
// 同时定义多个某些赋值
int a = 1, b, c, d = 4;
以上定义声明变量适用于所有基本数据类型
值得注意的是:
// byte类型赋值时,必须使用单引号,因为它只能存放一个字节的东西
// 所输出的是所放数据的阿斯科码(ascii)
byte b = 'a';
// char类型赋值时,也必须用单引号,只能放一个字母或汉字
char c = 'a';
char cc = '中';
// 在定义long、float、double类型数据的时候,数值后必须加类型首字母小写
long a = 1234l;
float b = 12.34f;
double c = 12.34567d;
基本数据类型之间的转换
这些数据类型都是可以相互转换的,因为这是Java允许的。除boolean类型外
低转高:byte,char,short ---》int ---》long ---》float ---》double
想转就转,无需强制,不会损失
int i = 987; double b = i;
高转低:必须强转,可能会损失精度
double a = 12.3456; int i = (int) a; // 这里转换会进行截尾,即丢失。
包装数据类型
包装数据类型是对基本数据类型的封装。
待补充
引用数据类型
引用数据类型有:类、接口、数组
类可以是Java提供好的,比如String、Date、Random等。也可以是自己创建的Java类,按照类的定义标准,在类中包含多个方法与属性,提供使用。
也可以这么说,在Java中除了基本数据类型,其他的都属于引用数据类型。
接口为什么是引用数据类型?
两种数据类型的区别
基本数据类型 | 引用数据类型 |
创建时被分配到栈空间当中 | 创建时先在栈上给其引用(句柄)分配一块内存,对象的具体信息存储在堆内存上,由栈上面的引用指向堆中对象的地址。栈的读写速度要比堆快。 |
变量名指向具体的数值 | 变量名指向存储数据对象的内存地址。 |
变量声明之后Java立刻分配内存给它 | 以特殊的方式指向对象实体(具体的值),声明时不分配内存,只存储内存地址。 |
基本类型之间的赋值就是创建新的拷贝 | 对象之间赋值只是传递引用 |
== 和 != 是比较数值 | == 和 != 是比较内存地址。如果比较数值,则需要需要重写对象equals()方法 |
创建和销毁都会很快 | 需要JVM销毁 |
高精度数字
Java提供了用于高精度计算的类:BigInteger 和 BigDecimal 大体上是属于包装类器的范围,却都没有对应的基本数据类型。
不过。这两个类包含的方法,提供的操作与对基本数据类型所能执行的操作相似,也就是说能作用于int 或 float 的操作,同样也能作用于自己,只不过得以方法的方式来取代运算符方式来实现。
这样做会复杂了许多,速度会慢些,但是换来的却是精度。
用速度换精度。
BigInteger支持任意精度的整数,在运算中,可以准确的表达任何大小的数值,不会丢失任何信息。
BigDecimal支持任何精度的定点数。比如,用来做货币的计算。
至于具体的使用,自行查询文档或姑哥度娘。