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、下面的程序能正常运行吗?
答案:能,输出为haha
分析:因为null值可以强制转换为任何java类类型,(String)null也是合法的。但null强制转换后是无效对象,其返回值还是为null,而static方法的调用是和类名绑定的,不借助对象进行访问所以能正确输出。反过来,没有static修饰就只能用对象进行访问,使用null调用对象肯定会报空指针错了。
4、下面程序的运行结果?
答案: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类对应的字节码对象,然后动态的进行任何可能的操作,
包括
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
这些都是反射的功能。
使用反射的主要作用是方便程序的扩展。
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类对应的字节码对象,然后动态的进行任何可能的操作,
包括
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
这些都是反射的功能。
使用反射的主要作用是方便程序的扩展。
相关文章推荐
- 程序员到底怎么了 如何成为一个合格的程序员
- 一个经验丰富的网站建设程序员的CSS资料
- 黑马程序员——异常
- 常见面试之机器学习算法思想简单梳理
- 如何判断两个单链表(无环)是否交叉
- 我的职业观
- 编码之道:取个好名字很重要-IT蓝豹
- 黑马程序员——内部类
- 黑马程序员-单例设计模式:“饿汉式”和“懒汉式”
- 黑马程序员———方法属性及类的一些修饰符
- 黑马程序员_java 线程池
- 剑指Offer 面试题三:二维数组中的查找
- 黑马程序员_Selenium Webdriver 简单应用
- 我做技术面试官的一些体会
- 黑马程序员———类中方法的特点
- 黑马程序员——2.1.基础语法(关键字、常量、进制、变量、类型转换、运算符、流程控制(判断、选择、循环))
- 黑马程序员——1.Java概述(Dos命令、环境变量、Hello World、注释)
- 黑马程序员——面向对象的三大特点
- 明天要做到更好-兄弟连IT教育
- 黑马程序员———面向对象