数据类型
Java有八种基本数据类型,其中有四种整型,三种浮点型,一种字符类型,还有一种表示真值的boolean型。 此外Java还有很多表示数据的类,比如String,大数之类的。
整型
整型包括Interesting,收人头,龙,byte四种
byte:
byte 数据类型是8位,有符号的,以二进制补码表示的整数;byte只占据一个字节。其最小值是 -128(-2^7);最大值是 127(2^7-1);默认值是 0。 byte变量占用的空间只有int类型的四分之一,所以多用在大型数组中节约空间,主要代替整数。
short:
short 数据类型是 16 位、有符号的以二进制补码表示的整数。short占据两个字节。最小值是 -32768(-2^15),最大值是 32767(2^15 - 1);short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一。其默认值是 0;最常用的下面的int,short,byte都用在特定场合。
int
int 数据类型是32位、有符号的以二进制补码表示的整数。占据4个字节。最小值是 -2,147,483,648(-2^31), 最大值是 2,147,483,647(2^31 - 1)。一般地整型变量默认为 int 类型,毕竟这是最常用的。默认值是 0 ;
long
long 数据类型是 64 位、有符号的以二进制补码表示的整数.double占据8个字节。最小值是 -9,223,372,036,854,775,808(-2^63),最大值是 9,223,372,036,854,775,807(2^63 -1)。注意,double类型有一个后缀L(l),初始值0l.
浮点类型
flaot
float 数据类型是单精度(6~7位)、32位的浮点数,占据4个字节。float的范围在+-3.402 823 47E+38F间。float 在储存大型浮点数组的时候可节省内存空间。默认值是 0.0f,没错,flaot有一个后缀F(f).
double
double 数据类型是双精度、64 位、的浮点数,其占据8个字节。那么double的范围是+-1.797 693 134 862 315 70E+208.浮点数的默认类型就是double 类型。double的后缀是D(d),所以默认值是 0.0d
浮点数满足IEEE 754规范。有用于表示一处和出错情况的三个特殊浮点数值。
正无穷:Double.POSITIVE_INFININITY 负无穷大:Double.NEGATIVE_INFINITY NaN:Double.NaN[计算0、0,负数的平方根]
char类型
char类型是一个单一的16位Unicode 字符,最小值是 \u0000(十进制等效值为 0),最大值是 \uffff(即为 65535)。char 数据类型可以储存任何字符,char类型的字面量要使用''(单引号)包起来。 char类型与Unicode的关系很复杂,char实际上描述了UTF-16编码中的一个代码单元。
有一些用于表示特殊字符的转义字符,比如:
boolean类型
boolean数据类型表示一位的信息,他只有两个取值:true 和 false,一看就代表正误,判断逻辑条件。这种类型只作为一种标志来记录 true/false 情况。默认值是 false。注意这里的false不等于0。
常量
常量在程序运行时是不能被修改的。(习惯上,常量名使用全大写)
在 Java 中使用 final 关键字来修饰常量,声明方式和变量类似,而且常量值通常直接放在程序代码中。
比如:final double PI = 3.1415927;
数据储存
有五个地方可以储存数据
寄存器(Registers)最快的存储区域,位于 CPU 内部 ^2。然而,寄存器的数量十分有限,所以寄存器根据需求进行分配。我们对其没有直接的控制权,也无法在自己的程序里找到寄存器存在的踪迹(另一方面,C/C++ 允许开发者向编译器建议寄存器的分配)。
栈内存(Stack)存在于常规内存 RAM(随机访问存储器,Random Access Memory)区域中,可通过栈指针获得处理器的直接支持。栈指针下移分配内存,上移释放内存。这是一种仅次于寄存器的非常快速有效的分配存储方式。创建程序时,Java 系统必须知道栈内保存的所有项的生命周期。这种约束限制了程序的灵活性。因此,虽然在栈内存上存在一些 Java 数据(如对象引用),但 Java 对象本身的数据却是保存在堆内存的。
堆内存(Heap)这是一种通用的内存池(也在 RAM 区域),所有 Java 对象都存在于其中。与栈内存不同,编译器不需要知道对象必须在堆内存上停留多长时间。因此,用堆内存保存数据更具灵活性。创建一个对象时,只需用 new 命令实例化对象即可,当执行代码时,会自动在堆中进行内存分配。这种灵活性是有代价的:分配和清理堆内存要比栈内存需要更多的时间(如果可以用 Java 在栈内存上创建对象,就像在 C++ 中那样的话)。随着时间的推移,Java 的堆内存分配机制现在已经非常快,因此这不是一个值得关心的问题了。
常量存储(Constant storage)常量值通常直接放在程序代码中,因为它们永远不会改变。如需严格保护,可考虑将它们置于只读存储器 ROM (只读存储器,Read Only Memory)中 ^3。
非 RAM 存储(Non-RAM storage)数据完全存在于程序之外,在程序未运行以及脱离程序控制后依然存在。两个主要的例子:(1)序列化对象:对象被转换为字节流,通常被发送到另一台机器;(2)持久化对象:对象被放置在磁盘上,即使程序终止,数据依然存在。这些存储的方式都是将对象转存于另一个介质中,并在需要时恢复成常规的、基于 RAM 的对象。Java 为轻量级持久化提供了支持。而诸如 JDBC 和 Hibernate 这些类库为使用数据库存储和检索对象信息提供了更复杂的支持。
通常 new 出来的对象都是保存在堆内存中的,但是基础数据类型都比较小,所以直接放在栈内。
数值类型转换
平时经常需要将一种数值类型转换为另一种数值类型,比如int转为double.下面是可以顺利转化的:
中有 6 个实心箭头,表示无信息丢失的转换;有 3 个虚箭头, 表示可能有精度 损失的转换。数值转化常常用在计算中,比如两数相加,如果有一个数位double,那么另一个数也将被转化位double.若没有double ,那么有float就转化为float.
强制类型转化
在必要的时候, int 类型的值将会自动地转换为 double 类型。但另
一方面,有时也需要将 double 转换成 int只是会损失一些信息。这个时候就要用到强制类型转化。
比如duble = 997; int nx = (int) x;
大数
如果基本的整数和浮点数精度不能够满足需求, 那么可以使用jaVa.math 包中的两个
很有用的类:Biglnteger 和 BigDecimaL 这两个类可以处理包含任意长度数字序列的数值。
Biglnteger 类实现了任意精度的整数运算, BigDecimal 实现了任意精度的浮点数运算。
使用静态的 valueOf方法可以将普通的数值转换为大数值:
Biglnteger a = Biglnteger.valueOf(100);对于更大的数字,可以使用一个带字符串参数的构造器。
BigInteger reallyBig = new BigIntager("45326837572385678293457");
但是大数不能使用+-,而需要使用add(),multiple,subtract(),divide(),compareTo(),sqrt(),mod(),。