Java经典面试题

精选30到Java面试题

1. 函数参数传递的是值

StringBuffer a = newStringBuffer("A"); 
StringBuffer b = newStringBuffer("B"); 
此时内存中的状态如下图所示:
 
publicstaticvoidoperator(StringBuffer x, StringBuffer y) { 
    x.append(y); y = x; 
}
进入如下方法后,内存中的状态为:
 
 x.append(y);
这条语句执行后,内存的状态为:
 
 y = x; 
这条语句执行后,内存的状态为:
 
当operator方法执行完毕后内存中的状态为:因为方法执行完毕,局部变量消除。
 
有内存中的状态,可以知道最后的结果。
2. IP地址及其子网掩码

前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);
关于上面代码片段叙述正确的是()
第4行编译错误, 没有final修饰的变量相加后会被自动提升为int型,与目标类型byte不相容,需要强制转换(向下转型)。

表达式的数据类型自动提升, 关于类型的自动提升,注意下面的规则。

①所有的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(n) 表示计算次数,则 
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中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值