1. 函数参数传递的是值
StringBuffer a = newStringBuffer("A");
StringBuffer b = newStringBuffer("B");
此时内存中的状态如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/82969fdf14af7e34a9861d6fcf071f7d.jpeg)
publicstaticvoidoperator(StringBuffer x, StringBuffer y) {
x.append(y); y = x;
}
进入如下方法后,内存中的状态为:
![](https://i-blog.csdnimg.cn/blog_migrate/b7067d049af485b1c13ff77f01f7df88.jpeg)
x.append(y);
这条语句执行后,内存的状态为:
![](https://i-blog.csdnimg.cn/blog_migrate/1d75ba45a7e2b6879b947d0201d66056.jpeg)
y = x;
这条语句执行后,内存的状态为:
![](https://i-blog.csdnimg.cn/blog_migrate/4b796f1d0c297e82f60c5079a8d8834f.jpeg)
当operator方法执行完毕后内存中的状态为:因为方法执行完毕,局部变量消除。
![](https://i-blog.csdnimg.cn/blog_migrate/4f6fd7238ea4bc1189ab2897b26943eb.jpeg)
有内存中的状态,可以知道最后的结果。
前21位为网络地址,后12位为主机地址。
110 对应前8位,10对应第二个8位,因此200对应第3个8位
又200的二进制表示为1100 1000
前面已经有了16位,因此11001 是属于网络地址的。000是属于主机地址 那么,最大的地址为
【110(十进制)】【10(十进制)】【11001 111】【 11111111】转换为十进制为110.10.207.255
故网络的地址范围为
110.10.200.0~110.10.207.255
3.HashMap的key不能重复
C.HashMap是Map接口的实现类,并且不保证元素的顺序恒久不变,它的底层使用的是数组和链表,通过hashCode()方法和equals方法保证键的唯一性
HashMap允许null键和null值
使用put方法向HashMap中添加元素时,如果键不存在,则添加该元素,并返回null;如果键已经存在,则把该键对应的值进行覆盖,返回原来的键,由于键都是"name",所以第二次添加的会把第一次的值覆盖,并返回第一次的键,所以HashMap中还是只有一个元素
4.类型转换
代码片段:
byteb1=1,b2=2,b3,b6;
finalbyte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2);
System.out.println(b3+b6);
关于上面代码片段叙述正确的是()
表达式的数据类型自动提升, 关于类型的自动提升,注意下面的规则。
①所有的byte,short,char型的值将被提升为int型;
②如果有一个操作数是long型,计算结果是long型;
③如果有一个操作数是float型,计算结果是float型;
④如果有一个操作数是double型,计算结果是double型;
而声明为final的变量会被JVM优化,第6行相当于 b6 = 10
5. 异常检查语句
下面代码运行结果是()
public class Test{
public int add(int a,int b){
try{
return a+b;
}
catch(Exception e) {
System.out.println("catch语句块");
}
finally{
System.out.println("finally语句块");
}
return 0;
}
public static void main(String argv[]){
Test test =new Test();
System.out.println("和是:"+test.add(9, 34));
}
}
程序先执行try块中return之前(包括return语句中的表达式运算)的代码;
再执行finally块,最后执行try块中的return; 而
finally块之后的return语句,因为程序在try块中已经return了,所以不再执行。
6.逻辑题
计算斐波那契数列第n项的函数定义如下:
intfib(intn){
if(n==0)
return1;
elseif(n==1)
return2;
else
returnfib(n-1)+fib(n-2);
}
若执行函数调用表达式fib(10),函数fib被调用的次数是:
C(0) = 1;
C(1) = 1;
C(n) = C(n-1) + C(n-2) + 1; n>=2;
故:
C(0) = 1;
C(1) = 1;
C(2) = 1 + 1 + 1 = 3;
C(3) = 3 + 1 + 1 = 5;
C(4) = 5 + 3 + 1 = 9;
C(5) = 9 + 5 + 1 = 15;
……
7. Static变量
public class B
{
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("构造块");
}
static
{
System.out.println("静态块");
}
public static void main(String[] args)
{
B t = new B();
}
}
静态块:用static申明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>main()>构造块>构造方法
静态块按照申明顺序执行,所以先执行publicstaticB t1 = newB();该语句创建对象,则又会调用构造块,输出构造块
接着执行public
static
B t1 = new
B();输出构造块
再执行
static
{
System.out.println("静态块");
}输出静态块
最后main方法执行,创建对象,输出构造块。
8. Servlet
init方法: 是在servlet实例创建时调用的方法,用于创建或打开任何与servlet相的资源和初始 化servlet的状态,Servlet规范保证调用init方法前不会处理任何请求
service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用, 根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法
destory方法:是在servlet实例被销毁时由web容器调用。Servlet规范确保在destroy方法调用之 前所有请求的处理均完成,需要覆盖destroy方法的情况:释放任何在init方法中 打开的与servlet相关的资源存储servlet的状态
servlet在多线程下其本身并不是线程安全的。
如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。