Java菜鸟面试突破系列之Java基础方面(一)

Java菜鸟面试突破系列之Java基础方面(一)

写在前面的话:首先声明,博主是个菜鸟,面试经历比较“丰富”,小公司,大企业面试经历都有不少,但无疑,正如前面所说,博主是菜鸟,所以每每都是面试失败,于是每每也就有了面试面试还是面试的经历,写这个系列也是经过一定思虑的,市面上,已经有为数不少的面试宝典、面试书籍之类的,但无疑真正接地气的就目前而言,我比较认可的还是张孝祥老师那个版本的葵花宝典,但张老师的葵花宝典也有着相当的局限性,那就是在应对大企业面试的时候,着实有点过于捉襟见肘了!大企业侧重于基础知识但却又不局限,往往在面试中都会有很多涉及底层代码实现的东西,所以在这里有必要写点东西,与其说是自己写个面试大全,倒不如说是,总结吧,无数次的失败,无数次的被拒,于是有了无数次的总结,废话不多说了,希望这个系列的总结能够帮助正在求职中的千千万万中的你们,这个系列我会连载下去,为了自己,也为了正在求职中的你们,当然,既然是总结,难免有错,所以在这里,还希望大家能够多多指正错误不当之处!

1、一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?
答:可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。

2、作用域public,protected,private,以及不写时的区别?
答:区别如下:
 public :不同包、同一包、类内都可用,即作用于所有类
 private:只作用于同一类内,别的类都不可调用
 protected:不同包的子类、同一包、类内都可用
 不写时:即默认friendly,作用于同一包内、类内

3、说说&和&&的区别。
答:&&可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。在布尔表达式中,一个&的俩边都要判断,而&&,如果左边是假的,右边就不用看了,即不参与运算了!另外,&还可以用作位运算符,表示按位与操作。

4、Java有没有goto?
答:goto作为java中的保留字,现在没有在java中使用。

5、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
答:short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需强制转换类型)short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
分析:s = s+1先执行s+1然后把值赋给s,由于1为int,于是s+1返回int(这里编译器自动进行隐式类型转换),所以将一个int值赋给short类型的s就会编译出错!而s+=1不同,+=操作符,在解析时,s+=1就等价于s=(short)(s+1)即s+1 <=>s=(s的类型)(s+1)
注意:当使用+=,-=,*=,/=,%=运算符对基本数据类型进行运算时,遵循如下规则:运算符右边的数值将要首先被强制转换成运算符左边数值相同的类型,然后再进行运算,且运算结果与运算符左边的数值相同。

6、String s = new String(“xyz”);创建了几个String Object?
答:两个(一个是“xyz”,一个是指向“xyz”的引用对象s)
分解问法:String s = new String(“xyz”); 在运行时涉及几个String实例?
答:两个,一个是字符串字面量”xyz”所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,另一个是通过new String(String)创建并初始化的、内容与”xyz”相同的实例。
注意:在Java语言里,“new”表达式是负责创建实例的,其中会调用构造器去对实例做初始化;构造器自身的返回值类型是void,并不是“构造器返回了新创建的对象的引用”,而是new表达式的值是新创建的对象的引用。

7、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
答:Math.round(11.5)=12;Math.round(-11.5)=-11;round方法返回与参数最接近的长整数,参数加0.5之后求其floor,即向上取整。

8、说出Object类的常用方法?
答:【此处一般答出5个即可,但作为资深程序员,至少应该知道7个方法】

protected Object clone()//创建并返回此对象的一个副本。   
boolean equals(Object obj)//指示其他某个对象是否与此对象“相等”。   
String toString()//返回该对象的字符串表示。
void wait()//在其他线程调用此对象的 notify() 方法或 notifyAll() //方法前,导致当前线程等待。 
void notify()//唤醒在此对象监视器上等待的单个线程。   
void notifyAll()//唤醒在此对象监视器上等待的所有线程。
int hashCode()//返回该对象的哈希码值。
Class<> getClass()//返回此 Object 的运行时类。  
protected void finalize()//当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。   

这里每个方法用来做什么的,务必要搞清楚,比如说如果面试官让你对一个非基本数据类型的对象进行复制,但不能影响到原对象,这里我们要学会使用clone()方法,如此等等。。。

9、说出一些常用的类,包,接口,常见的runtime exception,请各举5个。
常用的类:BufferedReader、BufferedWriter、FileReader、FileWirter、String、Integer
常用的包:java.lang、java.awt、java.io、java.util、java.sql、javax.xml、java.net
常用的接口: List、Map、Document、NodeList、Remote
常见的异常:ArithmeticException (a=5/0即数学运算中除0异常)ClassCastException (强制转换异常)NullPointerException(空指针异常,使用Null时)ArrayIndexOutofBoundsException(数组越界)StringIndexOutBoundsException(指示索引或者为负或者超出字符串大小)IndexOutOfBoundsException(下标越界)NegativeArraySizeException(创建大小为负的数组)IllegalArgumentException(传递非法参数)SecurityException(安全异常)NumberFormatException(数据格式异常,字符串->数字)FileNotFoundException(文件未找到异常)SQLException(操作数据库异常)IOException(I/O输入输出异常)

10、Collection和Collections;List、Set和Map;ArrayList、LinkedList、Vector和HashMap、HashTable、TreeMap等。
答:这几个问题非常重要,几乎是所有面试官屡问不爽的问题,一般是从问你最常用的数据结构是什么开始,或者有些浅层次的面试官会直截了当的问你这些的区别,废话不多说,直接杠正面!
0、首先来介绍Collection框架的结构,这里我引用一张图如下:

这里的具体的话,自己发挥,详细可以参见网络上一篇文章,这里就不详细说了!Collection框架介绍
1、其次说说Collection和Collections,Collection是集合类的上级接口,即是java.util下所有集合类的父接口,继承于他的接口主要有List和Set;Collections是针对集合类的一个工具类,提供了一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
2、**List和Set是继承自Collection接口,而Map并不是继承自Collection接口;**Set里的元素是不能重复的,可以用iterator()方法来区分重复与否!equals()是判读两个set是否相等, equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
3、Collection框架中实现比较要实现comparable/comparator接口。
4、ArrayList和Vector的区别:
共同点:这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的,这是与HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素。
接着说ArrayList与Vector的区别,这主要包括两个方面:.
**同步性:**Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
注意:这里谈到线程安全,同步问题,面试官少不了会多嘴说一句,让你讲讲线程安全是咋回事,如果不考虑,你听到这个问题估计会是一脸懵逼,我当初就是这样子的!所以这里我补充下线程安全的问题: java中的线程安全就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的程序不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问;线程安全就是说,如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 线程安全问题都是由全局变量及静态变量引起的。
备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。所以,我们讲课时先讲老的。
数据增长:ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
总结:即Vector增长原来的一倍,ArrayList增加原来的0.5倍。
5、ArrayList,Vector, LinkedList的存储性能和特性:
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用。
6、List和Map的区别:
一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。Map中取值:value=m.get(key)(这个面试官常问,虽然不难,但也得注意)
7、HashMap和Hashtable的区别:
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value,即HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

结束语:这里大部分题目其实都是摘抄自网路,一些答案就按照以前的面试宝典上答案给出,部分题目给出了自己的解释,毕竟,面试题目千千万,大多数都是差不多的,我这个系列也不会给出所有的题目,会尽量挑选一些有代表性的出来以及自己平时遇到的面试问题进行解说,这第一部分重要的面试题主要还是3/5/6/8/10这几题,尤其是第10题务必需要掌握的,这里不需要面试官来问你每一个问题,一旦说道数据结构这个问题,基本上就要自己把上面那些一一道来是最好了,当然中途面试官会就你所说进行提问,这些都要自己把握!今天暂且先到此,后续会一直继续下去的。。。

你可能感兴趣的:(集合框架,Collection,Java面试)