1、heap和stack有什么区别?
栈(stack),是限定仅在表尾进行插入或删除操作的线性表,栈的修改是按照后进先出(LIFO)原则进行的,因此栈又称为后进先出线性表。在java中栈驻留于常规RAM(随机访问存储器)区域,可通过“栈指针”获得处理的直接支持。栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里,如对象的引用(句柄)、局部变量、形式参数等,但java对象并不放在其中。
堆(heap),是一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和栈不同之处在于,堆的存储空间是在程序执行过程中动态分配的,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!
2、error和exception的区别?
error是指与系统有关的错误,这种错误一般是不可恢复,或恢复起来很困难的,如内存溢出错误,是不可能由程序来处理的。
exception是指在程序执行过程中发生的,需要程序捕获和处理的运行时错误,在程序运行正常的情况下,是不会发生的。当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。
3、如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)。
public class BigInt {
/** 用于保存超大整数 */
private int[] intArr = null;
/** 无参构造方法构造一个初始化为0的大数 */
public BigInt() {
this("0");
}
/** 构造一个带参大数 */
public BigInt(String s) {
if(intArr != null) {
intArr = null;
}
setArr(s);
}
/** 设置大数 */
public void setArr(String s) {
intArr = new int[s.length()];
for(int i=0;i<s.length();i++){
int intTemp = s.charAt(i) - '0';
if(intTemp <= 9) {
intArr[i] = intTemp;
}
}
}
/** 取得数的字符串类型的表示 */
public String getArr() {
StringBuffer strBuf = new StringBuffer();
for(int i=0; i<intArr.length; i++) {
strBuf.append(intArr[i]);
}
return strBuf.toString();
}
/** 返回数的大小 */
private int length() {
int len = 0;
if(intArr != null) {
len = intArr.length;
}
return len;
}
private static BigInt fillZero(BigInt arr, int int0){
BigInt temp = arr;
for(int i=0; i<int0; i++){
temp = new BigInt("0" + temp.getArr());
}
return temp;
}
/** 对两个BigInt型对象做加法运算,返回结果为BigInt型 */
public static BigInt add(BigInt one, BigInt two) {
BigInt arrSum = null;
BigInt arr = null;
if(one.intArr.length > two.intArr.length) {
arrSum = one;
arr = fillZero(two, one.intArr.length - two.intArr.length);
} else if(one.intArr.length == two.intArr.length) {
arrSum = two;
arr = one;
} else {
arr = two;
arrSum = fillZero(one, two.intArr.length - one.intArr.length);
}
int i=arr.intArr.length-1;
for(; i>=1; i--){
int intTemp = arrSum.intArr[i] + arr.intArr[i];
arrSum.intArr[i] = intTemp%10;
if(intTemp>9){
arrSum.intArr[i-1] = arrSum.intArr[i-1] + intTemp/10;
}
}
int intTemp = arrSum.intArr[0] + arr.intArr[0];
arrSum.intArr[i] = intTemp%10;
if(intTemp>9){
return new BigInt("1" + arrSum.getArr());
} else {
return arrSum;
}
}
/** 程序入口,格式化输出 */
public static void main(String[] args) {
try {
BigInt one = new BigInt(args[0]);
System.out.println(" " + one.getArr());
BigInt two = new BigInt(args[1]);
System.out.println("+ " + two.getArr());
System.out.println("----------------------------");
BigInt sum = BigInt.add(one, two);
System.out.println(" " + sum.getArr());
} catch(java.lang.ArrayIndexOutOfBoundsException e) {
System.out.println("数组下标越界");
}
}
}
posted on 2006-03-28 23:58
水秀清灵 阅读(780)
评论(4) 编辑 收藏 所属分类:
学习笔记