您的位置:首页 > 职场人生

java 笔试面试易错题

2015-10-13 11:39 253 查看
最近收集了几个java中易错的问题,后续还会继续更新。

1、存在使i + 1 < i的数吗?

答案:存在。

分析:如果i为int型,那么当i为int能表示的最大整数时,i+1就溢出变成负数了,此时不就<i了吗。

延伸:存在使i > j || i <= j不成立的数吗

答案:存在,比如Double.NaN或Float.NaN

2、不通过构造函数能否创建对象?

答案:能

分析:Java创建对象的几种方式(重要):

(1) 用new语句创建对象,这是最常见的创建对象的方法。

(2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。

(3) 调用对象的clone()方法。

(4) 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。(1)和(2)都会明确的显式的调用构造函数 ;(3)是在内存上对已有对象的影印,所以不会调用构造函数 ;(4)是从文件中还原类的对象,也不会调用构造函数。

3、下面的程序能正常运行吗?

public class NULL {

public static void haha(){
System.out.println("haha");
}
public static void main(String[] args) {
((NULL)null).haha();
}
}


答案:能,输出为haha

分析:因为null值可以强制转换为任何java类类型,(String)null也是合法的。但null强制转换后是无效对象,其返回值还是为null,而static方法的调用是和类名绑定的,不借助对象进行访问所以能正确输出。反过来,没有static修饰就只能用对象进行访问,使用null调用对象肯定会报空指针错了。

4、下面程序的运行结果?

public class Base {
private String name = "hello";
public Base() {
callName();
}
public void callName(){
System.out.println(name);
}
public static void main(String[] args) {
new Sub();
}
}

class Sub extends Base{
private String name="world";
public void callName(){
System.out.println(name);
}
}


答案:null

分析:程序执行的顺序是 main 》new Sub()》 创建子类对象》子类对象先调用父类的无参构造方法》再调用子类的构造方法。因为子类重写了父类的callName()方法,所以在调用父类的构造器的时候name在还没有被初始化,所以输出结果未null。

延伸:静态代码块,静态方法,非静态代码块,构造方法的执行顺序。

答案:静态代码块 》 非静态代码块 》 构造方法。

5、写sql语句,删除A表记录在B表中不存在的数据?

答案:

1. 采用not exists 执行速度快

delete from T_AD where not exists (select 1 from T_AD_PLAY where T_AD.N_CODE =T_AD_PLAY.N_CODE )

2. 采用not in 执行速度慢

Delete From T_AD Where N_AD Not In(Select N_AD From T_AD_PLAY)

延伸:

select 1 from mytable;与select anycol(目的表集合中的任意一行) from mytable;与select * from mytable 作用上来说是没有差别的,都是查看{是否有记录},一般是作条件用的。select 1 from 中的1是一常量,如果表中有值,那么查询出来的结果集合有多少个1代表表中有多少条表记录,但从效率上来说,1>anycol>*,因为不用查字典表。

6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错

答:s1是short类型的,1是int类型的,s1+1会将结果自动转换为int类型的,而你又用一个short类型的s1接受就会出错。

分析:java中类型的隐式转换和显示转换。

7、自动拆箱装箱

Integer i = 10; //int类型数据的自动装箱,实际上执行的代码是:Integer i = Integer.ValueOf(10);

int t = i //自动拆箱,实际上执行的代码是:int t = i.intValue();

8、下面不属于HttpServletRequest接口完成功能的是?

A 读取cookie

B 读取HTTP头

C 设定响应的content类型

D 读取路径信息

答:C 解析:HttpServletRequest类主要解析1.读取和写入HTTP头标2.取得和设置cookies3.取得路径信息4.标识HTTP会话。

而设定响应的content类型是有response来完成的。

9、下面有关java按值传递和引用传递,说法错误的是?

A char类型的传递属于按值传递

B Array类型的传递属于按引用传递

C 用户自定义类型的传递属于按引用传递

D String类型的传递属于按引用传递

解析:正确答案: D 大家可能看过这样的一句话,java中的传递都是值传递,所以在这儿不仔细分析就直接选择了A,其实是错的。(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。 (2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String
str = “Java”;

10、下面有关java hashmap的说法错误的是?

A HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。

B HashMap 的实现不是同步的,意味着它不是线程安全的

C HashMap通过开放地址法解决哈希冲突

D HashMap中的key-value都是存储在Entry数组中的

解析:正确答案C .解决冲突主要有三种方法:定址法,拉链法,再散列法

HashMap是通过拉链法来解决碰撞冲突的,就是将碰撞的元素加入到链表里。而开发地址发也是解决碰撞冲突的另一种办法,它是通过线性探索,如果当前位置碰撞了,就+1,放下一个位置去,还是碰撞就继续+1。源码程序中用到了一个重要的内部接口:Map.Entry,每个 Map.Entry 其实就是一个 key-value 对。当系统决定存储 HashMap 中的 key-value 对时,完全没有考虑 Entry 中的 value,仅仅只是根据 key 来计算并决定每个 Entry 的存储位置。Entry是数组,数组中的每个元素上挂这个一条链表。链表法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位;开放地址法是通过一个探测算法,当某个槽位已经被占据的情况下继续查找下一个可以使用的槽位。很显然我们使用的不是开放地址法。

11、JAVA反射机制主要提供了以下哪些功能?

在运行时判断任意一个对象所属的类

在运行时构造任意一个类的对象

在运行时判断任意一个类所具有的成员变量和方法

在运行时调用任意一个对象的方法

解析:正确答案: A B C D 。普通的java对象是通过new关键字把对应类的字节码文件加载到内存,然后创建该对象的。

反射是通过一个名为Class的特殊类,用Class.forName("className");得到类的字节码对象,然后用newInstance()方法在虚拟机内部构造这个对象(针对无参构造函数)。

也就是说反射机制让我们可以先拿到java类对应的字节码对象,然后动态的进行任何可能的操作,

包括

在运行时判断任意一个对象所属的类

在运行时构造任意一个类的对象

在运行时判断任意一个类所具有的成员变量和方法

在运行时调用任意一个对象的方法

这些都是反射的功能。

使用反射的主要作用是方便程序的扩展。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: