Java基础
下列哪个修饰符可以使在一个类中定义的成员变量只能被同一包中的类访问?
- private
- 无修饰符
- public
- protected
无修饰符就是默认权限,也叫包访问权限,只能被同一包内类访问
名称 | 说明 | 备注 |
---|---|---|
public | 可以被任何类访问 | |
private | 只能够被当前类的方法访问 | |
protected | 可以被同一包中的所有类访问 可以被所有子类访问 | 子类没有在同一包中也可以访问 |
缺省 无访问修饰符 |
可以被同一包中的所有类访问 | 如果子类没有在同一个包中,也不能访问 |
下面有关servlet和cgi的描述,说法错误的是?
- servlet处于服务器进程中,它通过多线程方式运行其service方法
- CGI对每个请求都产生新的进程,服务完成后就销毁
- servlet在易用性上强于cgi,它提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等
- cgi在移植性上高于servlet,几乎所有的主流服务器都直接或通过插件支持cgi
CGI不可移植,为某一特定平台编写的CGI应用只能运行于这一环境中。每一个CGI应用存在于一个由客户端请求激活的进程中,并且在请求被服务后被卸载。这种模式将引起很高的内存、CPU开销,而且在同一进程中不能服务多个客户。
以下关于对象序列化描述正确的是
- 使用FileOutputStream可以将对象进行传输
- 使用PrintWriter可以将对象进行传输
- 使用transient修饰的变量不会被序列化
- 对象序列化的所属类需要实现Serializable接口
使用ObjectOutputStream和ObjectInputStream可以将对象进行传输.
声明为static和transient类型的成员数据不能被串行化。因为static代表类的状态, transient代表对象的临时数据。
下面哪些描述是正确的
public class Test {
public static class A {
private B ref;
public void setB(B b) {
ref = b;
}
}
public static Class B {
private A ref;
public void setA(A a) {
ref = a;
}
}
public static void main(String args[]) {
…
start();
…
}
public static void start() {
A a = new A();
B b = new B();
a.setB(b);
b = null;
a = null;
…
}
}
- b = null执行后b可以被垃圾回收
- a = null执行后b可以被垃圾回收
- a = null执行后a可以被垃圾回收
- a,b必须在整个程序结束后才能被垃圾回收
- 类A和类B在设计上有循环引用,会导致内存泄露
- a, b 必须在start方法执行完毕才能被垃圾回收
其实是一个找GC Root的过程
下面关于面向对象的一些理解哪些是错误的
- 面向对象的最重要的特性是支持继承、封装和多态
- 系统设计应该遵循开闭原则,系统应该稳定不不可修改,但应支持通过继承、组合等方式进行扩展
- 函数式的语言必然是面向对象的语言
- 面向对象设计时,每个类的职责应该单一,不要再一个类中引入过多的接口
- 过程式语言和面向对象的语言各有其优势,过程式语言更加灵活,面向对象语言更加强调抽象和封装
- Java和C++都是静态类型的面向对象编程语言
C语言不是面向对象,但是函数式; Java和C++都是静态类型的面向对象编程语言
下列哪些方法是针对循环优化进行的
- 强度削弱
- 删除归纳变量
- 删除多余运算
- 代码外提
常见的代码优化技术有:复写传播,删除死代码,强度削弱,归纳变量删除,代码外提
下列说法正确的是
- java中包的主要作用是实现跨平台功能
- package语句只能放在import语句后面
- 包(package)由一组类(class)和接口(interface)组成
- 可以用#include关键词来标明来自其它包中的类
A:java中"包"的引入的主要原因是java本身跨平台特性的需求。实现跨平台的是JVM。
B:package语句是Java源文件的第一条语句。(若缺省该语句,则指定为无名包。),如果想在另一个类里面引用包里面的类,要把名字写全。(相当用文件的绝对路径访问)或者用import导入。
D:java中并无#include关键字, 如果想在另一个类里面引用包里面的类,要把名字写全。(相当用文件的绝对路径访问)或者用import导入。
关于 Socket 通信编程,以下描述错误的是
- 服务器端通过new ServerSocket()创建TCP连接对象
- 服务器端通过TCP连接对象调用accept()方法创建通信的Socket对象
- 客户端通过new Socket()方法创建通信的Socket对象
- 客户端通过new ServerSocket()创建TCP连接对象
**Socket套接字 **
就是源Ip地址,目标IP地址,源端口号和目标端口号的组合
服务器端:ServerSocket提供的实例
ServerSocket server= new ServerSocket(端口号)
客户端:Socket提供的实例
Socket soc=new Socket(ip地址,端口号)
在jdk1.5之后,下列 java 程序输出结果为______。
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
- true,false
- true,true
- false,true
- false,false
- 对于不同的环境结果不同
- 程序无法执行
本题是一个自动拆装箱的考题(自动拆装箱JDK需在1.5上),下面的讨论都不针对新开辟对象的情况:
1、基本型和基本型封装型进行“ == ”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;
2、两个Integer类型进行“ == ”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。
3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。
运用下列哪个命令能够获取JVM的内存映像
- jinfo
- jmap
- jhat
- jstat
1、jps:查看本机java进程信息。
2、jstack:打印线程的栈信息,制作线程dump文件。
3、jmap:打印内存映射,制作堆dump文件
4、jstat:性能监控工具
5、jhat:内存分析工具
6、jconsole:简易的可视化控制台
7、jvisualvm:功能强大的控制台
计算机网络
一IP地址为(201.222.5.121),子网掩码为(255.255.255.248),求网络地址,广播地址,IP范围
IP:201.222.5.121 (01111001)
掩码:255.255.255.248(11111000)
与得:201.222.5.120 为网络地址
则:201.222.5.127 (01111111,主机位全1)为广播地址
IP范围:201.222.5.121--------201.222.5.126
现需要将一个网络划分为5个子网,每个子网至少有16个主机。则应该使用下列哪一个子网掩码?
- 255.255.255.192
- 255.255.255.224
- 255.255.255.240
- 255.255.255.248
至少需要log2(16)=4个二进制位才能在同一个网络中区分出16个主机。而IPv4中全0代表网络号,因此全0地址不能用于表示主机地址,所以至少需要5个二进制位。因此32位子网掩码最后8位应该是(1110 0000),换成十进制是224。
主机数量=2^n-2,其中n是主机号位数。
子网数=2^n,其中n是子网号位数。
主机数 = 256-子网掩码-2
数据结构与算法
优先级队列被实现为最大堆。最初它有5个元素,堆的层次遍历是10,8,5,3,2。现按照顺序将两个新元素1和7插入到堆中。则插入新元素后,堆的层次遍历结果是什么?
- 10, 8, 7, 3, 2, 1, 5
- 10, 8, 7, 1, 2, 3, 5
- 10, 8, 7, 2, 3, 1, 5
- 10, 8, 7, 5, 3, 2, 1
最大堆层次遍历:10,8,5,3,2
10
/ \
8 5
/ \
3 2
插入1
10
/ \
8 5
/ \ /
3 2 1
插入7
10
/ \
8 5
/ \ / \
3 2 1 7
变换
10
/ \
8 7
/ \ / \
3 2 1 5