“金三银四”—–对于即将跳槽和正在跳槽,或者说现在招工作的人来说,三月四月无疑是最好的时间段,新年伊始,很多人的跳槽,给了我们很多机会,单也会因为应聘的人数曾多给我们带来的些许的困难。
俗话说:打铁还得自身硬,所以,废话不多说,直接上题
1、Java为什么能够跨平台运行?
答:Java代码本身不是能直接运行的,因为它是.java
文件,需要JVM虚拟机来编译成.class
字节码文件,所以只要对应的平台上有JVM的存在,Java程序就可以在这个平台上运行。
2、谈谈你对Java反射的理解!
答:JAVA反射机制是指在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
任何一个类都是Class类的实例对象。
比如:有一个A类,我们通常可以这样得到这个类的对象:A a = new A();
;通过上面一句话我们可以知道:A类其实也是Class类的一个对象。
表现方式有以下三种方法:
1、Class c1 = Class.forName("类的全名");
2、Class c2 = A.class;
3、Class c3 = a.getClass();
注:Java反射是很重要的知识点,理解透彻了,对于以后学习框架是有帮助的,面试回答的时候,只要意思表达出来就好,自己一知半解的东西就不要说了。
3、谈谈 & 和 && 的区别!
答:& 和 && 都可以作为逻辑与的运算符,表示逻辑与(and),当运算符结果都是true
时,运算结果才为true
,只要一方为false
,则运算结果为false
。
&&
短路或,是具有短路效果的,只要&&
前面运算结果为false
时,&&
后面的表达式不会参与运算;
&
是不会产生短路效果的,如果&
前面运算结果为false
时,&
后面的表达式还会参与运算。
&
还可以作为位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作。
4、short s1=1; s1=s1+1; short s2=1; s2+=1; 这两个的运算结果是否一致?请说出原因。
答:不一样。第一个会在运行时报类型转换异常,第二个运算正常,结果为2。
因为,基本类型在转换的时候,小转大,是需要强制转换的。在运算s1=s1+1
的时候,因为1是int
类型,s1
是short
类型,short
是小类型,则需要强制转换。
而在运算s2+=1
时,由于+=
是java语言规定的运算符,java编译器会对它进行特殊处理,会进行自动的类型转换,所以不会出错。
5、char 类型能否存储一个汉字?为什么?
答:char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。
补充:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
6、如何用最有效的办法计算出2乘以8的结果?
答:2<<3,计算机底层运算的时候是使用的位运算,所以使用位运算,效率最高;而一个数向左移n位,结果就是这个数乘以2的n次幂。
7、final 修饰变量时,该变量如果是对象,对象的值可不可以变?
答:可以变,final
修饰变量时,引用变量不会变,引用变量指向的对象的内容是可以变化的。
8、谈谈你对面向对象的理解!
答:这个问题的回答就很广泛了,重点以“万物皆对象”和面向对象的三大特征“封装、继承、多态”这几个方面展开来说,不要意味的被概念。
9、override 和 overload 的区别?
答:首先要说这两个都是什么意思,然后从其共同点出发,再说区别。
override
是重写(覆盖),overload
是重载,他们都是面向对象中多态的体现;
override
重写发生在父子类之间,子类重写父类的方法,规则:(1)方法名、参数、返回值相同。(2)子类方法不能缩小父类方法的访问权限。(3)子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。(4)方法被定义为final不能被重写。
(5)被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
overload
重载是一个类中多态性的一种表现;规则:(1)有相同的方法名,但参数类型或个数彼此不同;(2)不能通过访问权限、返回类型、抛出的异常进行重载;(3)方法的异常类型和数目不会对重载造成影响;
10、构造器可不可以被重写或重载?
答:构造器可以被重载,不能被重写,原因可以参照第9题。
11、抽象类和接口的区别?
答:接口和抽象类都是继承树的上层,他们的共同点如下:(1)都不能被实例化;(2)都能包含抽象的方法,这些抽象的方法用于描述类具备的功能,但是不提供具体的实现。
他们的区别如下:(1)在抽象类中可以写非抽象的方法,从而避免在子类中重复书写他们,这样可以提高代码的复用性,这是抽象类的优势;接口中只能有抽象的方法。(2)一个类只能继承一个直接父类,这个父类可以是具体的类也可是抽象类;但是一个类可以实现多个接口;一个接口可以继承多个接口,但不能实现接口、也不能继承其他的类。
其实这个问题还有更多的回答方式,具体大家可以参考https://www.zhihu.com/question/20149818,其中很多回答都是很好理解的。
12、int 和 Integer 的区别?
答:int
是java中的基本数据类型,Integer
是int类型的包装类,当两者作为成员变量时:int
的默认值是0,Integer
的默认值是null;Integer
中封装了一些对整数操作的方法,还定义了一些最值,其他的基本类型也有其对应的包装类。
13、String、StringBuffer、StringBuilder之间的区别?
答:String
是字符串常量,String
对象是不可变的,例如:
String s = “a”;
s = s+1;
System.out.println(s);//结果是a1
如果你看到这以为s的值已经变了,那么恰恰说明你入坑了,jvm在解释这段代码的第一行时候,先是创建了一个对象s;执行第二行的时候,重新创建了一个s赋值为上一个对象的值加上1(这里做的是字符串的拼接),而原来的s就会被JVM的垃圾回收机制(GC)给回收掉;
StringBuffer
是字符串变量,是线程安全的;和上面的例子不一样的是:对变量进行操作就是直接对该对象进行更改,而不进行重新创建和回收的操作;
StringBuilder
也是字符串变量,是非线程安全的,它的修改和StringBuffer
是一样的。
14、“==” 和 “equals” 的区别?
答:==
比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。
equals
比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
(String
对equals()
进行了重写,比较的是两个对象的内容是否相等,这里可以结合常量池去理解一下)。
15、List、Set、Map 的区别?
答:List:
(1)、List
的特征是其元素以线性方式存储,集合中可以存放重复对象;
(2)、可以插入多个null
元素;
(3)、是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序;
(4)、常用的实现类有ArrayList
、LinkedList
和Vector
。ArrayList
最为流行,它提供了使用索引的随意访问,而LinkedList
则对于经常需要从List
中添加或删除元素的场合更为合适。
Set:
(1)、Set
存放的是对象的引用,没有重复对象;
(2)、无序容器,你无法保证每个元素的存储顺序,TreeSet
通过 Comparator
或者Comparable
维护了一个排序顺序;
(3)、只允许一个null
元素;
(4)、Set
接口最流行的几个实现类是HashSet
、LinkedHashSet
以及TreeSet
。最流行的是基于HashMap
实现的 HashSet
;TreeSet
还实现了SortedSet
接口,因此 TreeSet
是一个根据其compare()
和compareTo()
的定义进行排序的有序容器。
Map:
(1)、Map不是collection
的子接口或者实现类。Map
是一个接口;
(2)、Map
的 每个 Entry
都持有两个对象,也就是一个键一个值,Map
可能会持有相同的值对象但键对象必须是唯一的;
(3)、TreeMap
也通过mparator
或者Comparable
维护了一个排序顺序;
(4)、Map
里你可以拥有随意个null
值但最多只能有一个null
键;
(5)、Map
接口最流行的几个实现类是HashMap
、LinkedHashMap
、Hashtable
和 TreeMap
。