1.寄存器-最快的存储区,位于处理器内部,无法直接控制
2.堆栈:位于RAM,随机访问存储器中,可通过堆栈指针从处理器那里获得直接支持;堆栈指针,向上移动,则分配内存;向下移动, 则释放内存;不过创建程序时,Java系统必须知道存储在堆栈内所有项的生命周期,以便上下移动堆栈指针;这一约束,限制了程序的灵活性;
Java对象引用存储于堆栈中;而Java对象不存储于其中
3.堆:一种通用的内存区,也位于RAM区,用于存放所有的Java对象;堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间;因此在堆里存储有很大的灵活性;当需要一个对象时,只需要new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配;
用堆进行存储分配和清理可能比堆栈进行存储分配需要更多的时间;
4.常量存储:常量值通常存储在程序代码内部,这样做是安全的,因为他们永远不会被改变;
5.非RAM存储:
如流对象和持久化对象;在流对象中,对象转换成字节流,通常被发送给另一台机器;在“持久化”对象中,对象被存放于磁盘上;这种存储方式的技巧在于把对象可以转化为其他媒介上的事物,他们仍可以保持自己的状态,在需要时,可以恢复成常规的,基于RAM的对象;Java提供了对轻量级持久化的支持,而诸如JDBC和HIBERNATE这样的机制提供了更加复杂的对在数据库存储和读取对象信息的支持.
2.基本类型是特例:
小,简单;不用new来创建变量,而是创建一个并非引用的“自动”变量,这个变量直接存储值,并置于堆栈中,因此更加高效;
因为new将对象存储在“堆”中,故用new创建一个对象,特别是小的简单的变量,往往不是很有效;
3.所有数值类型都有正负号-每种基本类型所占存储空间的大小都是不变的
char:16bits
byte:8bits
short:16bits
int:32bits
long:64bits
float:32bits
double:64bits
4.数组:当创建一个数组对象时,其实是创建了一个引用数组;并且每个引用会被自动初始化为一个特定值,null
对于用来存放基本类型的数组,编译器也能确保这种数组的初始化,因为它会将会这种数组所占的内存全部置0
5.二进制码补充学习
2 二进制 为10
其实全部显示为00000000000000000000000000000010,高位为0,表示为正
-2 二进制为11111111111111111111111111111110
其计算方法为:
1.首先是找到正数2的二进制形式00000000000000000000000000000010
2.按位取反->111111111111111111111111111111101
3.加1->11111111111111111111111111111110
将11111111111111111111111111111110变为整数
1.首先判断其为负数,按位取反->0000000000000000000000000000001
2.加1->00000000000000000000000000000010
3.2步骤后,得结果为2,然后因为是负数,所以加一个符号,得-2
所以补码的设计目的是:
⑵ 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。
(3)为了统一正0和负0
有符号数:
最高位是符号位,0表示正,1表示负
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
原码表示虽然很简单,用原码来进行加减运算会出问题,
问题出在带符号位的负数上
反码表示,将加减数都表示成反码后,减法可以直接表示成加法
问题出在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的,于是就出现了补码,正数的补码不变,负数的补码是将其反码加1
原码和反码中,+0与-0的表示并不相同,所以计算机中一般使用补码。还有利用高位溢出,将减法运算变成加法运算
模的概念:把一个计量单位称之为模或模数。例如,时钟是以12进制进行计数循环的,即以12为模。在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。14点钟在舍去模12后,成为(下午)2点钟(14=14-12=2)。从0点出发逆时针拨10格即减去10小时,也可看成从0点出发顺时针拨2格(加上2小时),即2点(0-10=-10=-10+12=2)。因此,在模12的前提下,-10可映射为+2。由此可见,对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。10和2对模12而言互为补数。
同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为8=256。在计算中,两个互补的数称为“补码”。
a. 采用补码后,可以方便地将减法运算转化成加法运算,运算过程得到简化。正数的补码即是它所表示的数的真值,而负数的补码的数值部份却不是它所表示的数的真值。采用补码进行运算,所得结果仍为补码。
b. 与原码、反码不同,数值0的补码只有一个,即 [0]补=00000000B。
c. 若字长为8位,则补码所表示的范围为-128~+127;进行补码运算时,应注意所得结果不应超过补码所能表示数的范围。
6.部分
源码
package com.book.chap2.operator;
/**
*
*直接常量
*
byte,short,int,long均有符号和无符号之分,如byte[-128-127]
*
Integer.toBinaryString
*
*@author landon
*@since JDK1.6
*@version 1.0 2012-3-21
*
*/
public class Literals
{
p