1.以下java程序代码,执行后的结果是()
java.util.HashMap map=new java.util.HashMap();
map.put("name",null);
map.put("name","Jack");
System.out.println(map.size());
答案:1
解析:
1.HashMap 可以插入 null 的 key 或 value。
2.插入的时候,检查是否已经存在相同的 key,如果不存在,则直接插入,如果存在,则用新的 value 替换旧的 value。
3.在本题中,第一条 put 语句,会将 key / value 对插入 HashMap,而第二条 put,因为已经存在一个 key 为 name 的项,所以会用新的 value 替换旧的 vaue,因此,两条 put 之后,HashMap 中只有一个 key / value 键值对。那就是(name,jack)。所以,size为 1。
2.下面程序的运行结果是()
String str1 = "hello";
String str2 = "he" + new String("llo");
System.err.println(str1 == str2);
答案:false
解析:
str1 指向的常量分配在字符串常量池中
“he” 在编译期分配在字符串常量池中,new String("llo") 指向的常量 “llo” 也分配在字符串常量池中。
虽然 str2 也是经过初始化,但是无法判断 new String("llo") 到底是什么,进而不会将 = 号右侧的内容存于常量池,而是在通过构造时在堆区中的常量池外的内存中声明,至此 str2 与 str1 不止是分配内存的时期不同(一个在编译期,一个在运行期)而且在内存空间的区域也不同。
3.以下代码执行后输出结果为( )
public class ClassTest{
String str = new String("hello");
char[] ch = {'a','b','c'};
public void fun(String str, char ch[]){
str="world";
ch[0]='d';
}
public static void main(String[] args) {
ClassTest test1 = new ClassTest();
test1.fun(test1.str,test1.ch);
System.out.print(test1.str + " and ");
System.out.print(test1.ch);
}
}
答案:hello and dbc
解析:
1.Java 中都是按栈中的值传递,基本数据类型栈中的值就是实际存储的值,引用类型栈中的值就是指向堆中的地址。
2.String 和 char[ ] 都是引用类型,所以在方法中传递的都是指向真实数据的地址。
3.String 在源码中的是这么写的:public final class String,final 类型不可改变。fun() 方法是开辟一块新的内存,将 world 放入内存,然后把新的地址给 fun() 方法中的 str(形参)。也就是说,fun() 方法中根本没有改变初始存放 “hello” 的内存(地址)值,当这个方法返回时,main 方法中的 str 依然是那个没修改前的引用,当然还是输出 “hello” 了。
4.Java 的跨平台特性是指编译后的文件(字节码文件,即 class 文件)跨平台,而不是源程序跨平台。该 class 文件与平台无关,而 class 文件经过解释执行之后翻译成最终的机器码,这是平台相关的。
5.JSP分页代码中,正确的步骤次序
1.count(*) 得到总记录数
2.计算总页数
3.过滤显示本页数据
6.Servlet的生命周期一般可以用三个方法来表示:
1.init():仅执行一次,负责在装载 Servlet 时初始化 Servlet 对象
2.service():核心方法,一般 HttpServlet 中会有 get,post 两种处理方式。在调用 doGet 和 doPost 方法时会构造 servletRequest 和servletResponse 请求和响应对象作为参数。
3.destory():在停止并且卸载 Servlet 时执行,负责释放资源
初始化阶段:Servlet 启动,会读取配置文件中的信息,构造指定的 Servlet 对象,创建 ServletConfig 对象,将 ServletConfig 作为参数来调用 init() 方法。