Java EE知识储备(六)

Java EE知识储备(六)

目录:

1、C++指针问题:

2、堆排序问题:

3、C语言变量存储在内存的地方:

4、程序调优方法:

5、Linux文件:

6、有int型变量a和b,在不引入新的变量的情况下,实现变量a和b的交换。

7、final、finalize和finally的不同之处?它们分别有什么作用?

8、在Java中,抽象类与接口之间有什么不同?

9、说明public static void main(String []args)这段声明里每个关键字的作用。

10、智力题:


1、C++指针问题:

#include <iostream>

using namespace std;

int main(){

int* p = 0;

p += 6;

cout << p << endl;

}求运行结果:

答:运行结果为:0x18,将p指针指向0地址处,由于指针是int类型,每次加1相当于移动4个字节,加6,移动24个字节,到地址为24处,十六进制表示未0x18。

 

2、堆排序问题:

答:(1)堆是一棵顺序存储的完全二叉树。

(2)其中每个节点的关键字都不大于其孩子节点的关键字的堆称为小根堆。

其中每个节点的关键字都不小于其孩子节点的关键字的堆称为大根堆。

(3)算法思想:

①根据初始数组去构造初始堆,构建一个完全二叉树,保证所有的父节点都比它的孩子节点数值大。

②每次交换第一个和最后一个元素,输出最后一个元素,然后把剩下元素重新调整为大根堆。

(4)示例:5,11,7,2,3,17建立的初始堆为:

 

图2.1 堆排序过程1


图2.2 堆排序过程2


图2.3 堆排序过程3


图2.4 堆排序过程4

所以初始堆为17,11,7,2,3,5

 

3、C语言变量存储在内存的地方:

答:(1)变量可以存储在内存中的不同地方,这依赖于它们的生命期。一个C、C++程序编译时内存分为五个区域:堆区、栈区、数据段区、文字常量区、程序代码区

(2)数据段(data segment):全局变量和静态变量,在程序的整个运行期间都存在。

(3)栈(stack):局部变量,调用的函数执行结束时这些存储单元自动被释放,栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(4)堆(heap):动态内存分配。malloc或new申请的内存,程序员负责在何时用free或delete释放内存。在堆上分配的空间必须回收,否则运行的程序会出现内存泄露,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

 

4、程序调优方法:

答:①改善数据访问方式,以提升缓存命中率,减少访问存储器的开销,可以加快服务响应速度。

②利用数据库连接池替代直接的数据库访问,减少频繁建立连接带来的时间消耗。

③利用迭代代替递归,减少栈空间的使用和中间值的保存。

④共享冗余数据提高访问效率,

 

5、Linux文件:

答:Linux下对所有文件(目录、字符设备、块设备、 套接字、打印机等)操作,读写都可用fopen()/fclose()/fwrite()/fread()等函数进行处理。屏蔽了硬件的区别,所有设备都抽象成文件,提供统一的接口给用户。这就是“一切皆是文件”的思想。

 

6、有int型变量a和b,在不引入新的变量的情况下,实现变量a和b的交换。

答:①a = a + b

b = a - b

a = a - b

②a = a ^ b

b = a ^ b

a = a ^ b

③a = a * b

b = a / b

a = a / b

 

7、final、finalize和finally的不同之处?它们分别有什么作用?

答:(1)final:final为用于标识常量的关键字,final标识的关键字存储在常量池中

(2)finalize:finalize()方法在Object中进行了定义,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

(3)finally:finally{}用于标识代码块,与try{}进行配合,不论try中的代码执行完或没有执行完(这里指有异常),该代码块之中的程序必定会进行;

 

8、在Java中,抽象类与接口之间有什么不同?

答:(1)使用抽象类是为了代码的复用,使用接口是为了实现多态性。

(2)注意事项:

抽象类和接口都不能直接实例化。

抽象类要被子类继承,接口要被类实现。

接口只能做方法声明,抽象类中可以做方法声明,也可以做方法实现

接口里定义的变量只能是public static final的,抽象类中的变量是普通变量。

抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

抽象方法只能声明,不能实现。abstract void a();不能写成abstract void a(){}。

抽象类里可以没有抽象方法。

如果一个类里有抽象方法,那么这个类只能是抽象类。

抽象方法要被实现,所以不能是静态的,也不能是私有的。

接口可继承接口,并可多继承接口,但类只能单继承。

 

9、说明public static void main(String []args)这段声明里每个关键字的作用。

答:(1)public:声明主函数为public就是告诉其他的类可以访问这个函数。

(2)static:告知编译器main函数是一个静态函数。main函数中的代码是存储在静态存储区的,即当定义了类以后这段代码就已经存在了。如果main()方法没有使用static修饰符,那么编译不会出错,但是如果你试图执行该程序将会报错,提示main()方法不存在。因为包含main()的类并没有实例化(即没有这个类的对象)。而使用static修饰符则表示该方法是静态的,不需要实例化即可使用。

(3)void:表明main()没有返回值

(4)String:命令行传进参数的类型,

(5)args:指命令行传进的字符串数组。

 

10、给出8个正整数 3 2 2 3 8 8 1 2。可以将这8个整数分成一组或多组。使得满足以下条件,不能打乱给出的整数的顺序,每一组的和不能超过18。显然,这样的划分有很多种。求这样的划分中,每一组的最大值的和形成的最小值是:

答:题目的断句读多三遍:每一组的【最大值的和】形成的最小值是:

(3、2、2、3)(8 、8)(1、2):3+8+2=13

或者(3 、2 、2 、3)(8、8、1)、(2):3+8+2=13

答案为13

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值