写在前面
春天来了,万物复苏的季节到了. 许多程序猿安奈不住生理需求,我要涨工资,我要跳槽. 毕竟金三银四嘛. 那么要从众多的面试者中获得求职机会,我们就要面对很多的面试题.
程序猿是最烦面试题的.面试的公司也烦,面试的人也烦. 但是没办法.面试的人鱼龙混杂,好多公司被理论啥都懂,代码写不出的人搞的就很伤.所以现在面试题也越来越难,越来越刁钻.
但是凡事都有双面性,这样就促使我们看更多的面试题,掌握了更多的知识.不是吗 !
先来点开胃的
1.访问修饰符public,private,protected以及不写时的区别?
访问权限:
修饰符
|
当前类
|
同包
|
子类
|
其他包
|
public
|
√
|
√
|
√
|
√
|
protected
|
√
|
√
|
√
|
×
|
default
|
√
|
√
|
×
|
×
|
private
|
√
|
×
|
×
|
×
|
类的成员不写访问修饰符时,默认的是default.
2.Stirng是最基本的数据类型吗?
不是.
java中的基本数据类型就八种: byte, short, int, long, float, double, char, boolean. 剩下的都是引用类型(reference type).
3.float f = 1.1; 正确吗?
不正确.
1.1是双精度, 将双精度赋值给浮点型,属于向下转型,会造成精度的丢失.如果要强制类型转换,可以写成这样 float f = (float)1.1; 或者 float f=1.1F;
4.short a = 1; a = a + 1 和 short a = 1 ; a += 1 有什么区别?
对于a = a + 1; 因为1是int值类型,所以计算的结果是int,要赋值给short,需要强制类型装换才能赋值给short.
对于a += 1; 其相当于 a = (short)(a+1) ;其中已经做了强制类型装换.
5.下面代码打印结果?
Integer a = 100, b = 100, c = 130, d = 130 ;
System.out.println(a ==> b);
System.out.println(c == d);
第一个是true,第二个是false.
因为a,b,c,d四个变量都是integer对象的引用,所以==比较的不是值,而是引用.如果整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象.
6.Java中如何跳出多重嵌套循环?
在最外层循环前加标记A,利用break A;可以跳出循环。
7.String类可以被继承吗?
不可以. 因为String类是final类.
8.String和StringBuilder,StringBuffer的区别?
String是只读字符串,String引用的字符串内容是不能被改变的.而StringBuffer和StringBuilder是可变字符串.StringBuilder和StringBuffer的用法相同, 区别是StringBuffer被synchronized修饰,效率比StringBuilder低。
9.构造器是否可以被重写?
构造器不能被继承,因此不能被重写,但是可以被重载.
10.int a = 1; int b = 2; 怎么让a,b值交换?
a = a ^ b;
b = a ^ b;
a = a ^ b;
来点中级的
11.抽象类和接口的相同点和不同点.
-
抽象类和接口都不能实例化对象,但是可以定义抽象类和接口类型的引用.
-
继承抽象类和实现接口都要对其中的抽象方法全部实现
-
接口比抽象类更加抽象,抽象类中可以定义构造器,可以有抽象方法和具体方法.
-
接口中方法全部都是抽象方法.
-
抽象类中的成员可以是private,protected,public,接口全部都是public
-
抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量.
-
有抽象方法的类必须声明为抽象类,而抽象类未必要有抽象方法.
12.java中会存在内存泄露吗?
理论上java不会存在内存泄露的问题,应为有垃圾回收机制(GC).然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此会导致内存泄露. 例如hibernated的Session中的对象属于持久态,垃圾回收器不会回收这些对象,这些对象中有可能存在无用的垃圾对象.如果关闭不及时,一级缓存就可能导致内存泄露.
13.try{}里面return, finally里的代码会不会执行,什么时候被执行?
会执行. 在方法返回给调用者前执行.因为如果存在finally代码块, try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后在返回.
14.List,Map,Set 三个接口存取元素时,各自有什么特点?
List以特定的索引来存取元素,可以有重复元素
Set不能存放重复元素.
Map保存键值对的映射,映射关系可以是一对一或多对一.
Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储理论存取时间复杂度是O(1).
15.Thread类中的sleep()和对象的wait()有什么区别?
sleep()方法是线程类的静态方法,调用此方法会让当前线程暂停执行指定时间.将CPU时间片分给其他线程,但是对象的锁依然保持, 休眠时间结束会自动回复到就绪状态.
wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁,线程暂停执行,进入对象的等待池,只有调用对象的notify()方法或notifyAll()方法时,才能唤醒等待池中的线程进入等锁池,如果线程重新获得对象的锁就可以进入就绪状态。
16.当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?
不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。
因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。
17.说说synchronized关键字的用法?
synchronized关键字可以将对象或者方法标记为同步,以实现对对象和方法的互斥访问,可以用synchronized(对象) { … }定义同步代码块,或者在声明方法时将synchronized作为方法的修饰符。
18.Java如何实现序列化,有什么意义?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)要实现序列化,让类实现Serializable接口.该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出如果需要反序列化则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取对象。序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆。