Bootstrap

最近找java实习面试被问到的东西总结(Java方向)

时间,就是这么很悄悄的溜走了将近两个年华,不知不觉的,研二了,作为一个一般学校的研究生,不知道该说自己是不学无术,还是说有过努力,反正,这两年里,有过坚持,有过堕落,这不,突然间,有种开窍的急迫感,寻思着找些实习,充实下生活,也是为了将来而备战,目标定位在杭州,然而,杭州的Java实习并不多,大大小小投了十来个企业单位,面来面去,回答的基本上也算差强人意,今日得一闲暇,就最近被问到的一些问题一一罗列,继续努力吧!:

1、说出Object类的常用方法?

答:这个问题,对于Java开发有经验的人来说,应该不难,至少也得说出5/6个方法的样子,然而,很显然,大部分在校生,并不知情,这个问题是上个学期年底面试百度的时候被问到的,当时有点懵逼,只说出了equals()方法、toString()方法,后来被面试官果真狠狠的指教了一番,于是很自然的印象深刻,估计着,以后的面试里是肯定不会忘记咯,其实要回答这个问题,只要我们能想到线程通信的方法,那就基本上没问题了,要知道线程之间进行通信那里可是有着三个方法呢,加上这里两个不就5个了嘛,完完全全的可以搞定面试官了,这三个方法就是:wait()、notify()、notifyAll()!哈哈,好了,废话不多说,总结答案如下:

复制代码
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()方法,如此等等。。。

2、说出一些常用的类,包,接口,常见的runtime exception,请各举5个。

答:此问题依旧是被百度面试官所提出,当时觉着就是小菜一碟,然而回答的时候,脑子确实突然短路了,平时写代码导入了那么多包,用过那么多类,妈蛋,一要说出口的时候才发现,真正是胸有沟壑万千,却不知道从何说起!于是稀里糊涂的道出常用的类有String类、StringBuffer类、Integer类,嗯当时是就说了这几个脑子就短路了,甚至还傻傻的怯怯的反问了面试官一句,这些算常用的类吗?记得,当时面试官没说啥,很自然的一笑了之,现在想想觉得也是逗了!接下来,我接着发挥,常用的包的话,java.lang、java.util、java.io、java.awt、java.sql,正待我说的兴致正浓时,面试官打断,说说常用的接口,瞬间懵逼,接口,幸亏瞬间想到集合框架,于是立马答道Map,List,本来想说Set的,后来想想打住了,但无奈想不起别的了,于是如实说,暂时就想起这些了,常见的异常,我直接说,数组越界、除0异常,数据库异常,面试官打断,用java,于是老老实实的冥思苦想,却发现啥都想不起来了,憋了半天总算憋出了一个NullPointException异常,紧张啊!回来后,立马总结语句:

常用的类:BufferedReader、BufferedWriter、FileReader、FileWirter、String、Integer 、StringBuffer、Stack
常用的包: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输入输出异常)

3、说说你常用的数据结构?

答:何为数据结构?是说算法嘛,心里在想,在想,想说又不敢说(第一次面试,没有准备的面试,面的还是百度,别提有多紧张了),面试官见我是半天没坑出一句话,于是提醒了下,你平时用过集合框架没,额,瞬间醒悟,原来问的这个,于是滔滔不绝,将自己从某宝典中的记忆全部吸纳而出,总体上回答的还算不差(自我感觉,面试官也没刁难在这里),第二次在EMC再次被问到这个问题的时候,还算照着某宝典行云流水,然而,想象总是那么美好,期间,面试官,巧问了一句,你说HashMap和Hashtable之间一个是安全一个是不安全也就是线程同步和不同步,那么这个线程安全问题指的是什么?你能不能举个例子出来,其实这个问题并不难,难就难在我当时正沉浸在某宝典之中,根本想不到会有这么一问,所以稀里糊涂的回答了些,很显然,虽然回答的八九不离十,但面试官能从我脸上读出我说话的没底气!接下来总结下集合框架面试的大体如下:

首先我们要说的应该是对集合框架的理解,也可以当着面试官写下自己认为的集合框架结构图或者简图之类的,这里的具体的话,自己发挥!
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中存储的数据是没有顺序的,其键(key)是不能重复的,它的值(value)是可以有重复的,存值采用 put(key,value)。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不允许。

4、String 和StringBuffer的区别?

答:这个问题相对来说很容易,某宝典上有详细的解说,问到的时候,只要按照某宝典上来发挥就行了!这个问题是杭州某家网络公司问到的。。

String和StringBuffer类,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串,而这个StringBuffer类提供的字符串可以进行修改,所以当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。

另外,String类实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。(String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。)

5、关于线程的一些问题?

答:面试官一开始问我熟悉线程吗?我能怎么回答,总不能说不熟悉啊,多线程这玩意几乎都是各大企业面试官屡问不爽的问题啊,好吧,一接通电话,面试官进行了简单的自我介绍之后,无一例外的会问到关于线程的问题,所以多少准备些吧。

很典型的一个问题,你一般如何实现多线程,这个问题不用多说,很简单,java提供了两种方式,一个是继承Thread类,另一个是实现Runnable接口,由于java不支持多继承,所以在多继承的时候,我们得优先选用 实现 Runnable接口,因为我们可以通过实现接口的办法,间接的实现多继承!

另外还有公司问到,线程之间是通过哪些方法进行通信,这个其实在上面说到Object类的常用方法的时候已经提到过了,主要是三个方法,wait()、notify()、notifyAll()方法,解释的话就自己组织下就行咯,在这之前,有些HR会问你你通常如何启动线程,显而易见,start()方法!好吧,问到这里,其实线程问题也差不多了,不过有些面试官往往不知从何找话题,于是简单的问道,线程的生命周期,嗯这个只要我们想到OS中的进程就行了,差不多的,创建、就绪、运行、阻塞、消亡!

OK,不,好像还有个问题被问到了,线程池,这个问题我完全不知道,查了百科,也就大致了解了下,所以大家自己看看,我就不组织语言了,最后自己觉得线程中还有一个比较重要的东西,一个就是 interrupt()方法,一个是currentThread()方法,具体情况大家自己查看java API文档就好,我就不多解释了!

6、说说你常用的数据库?

答:每每问到这个问题,我总会一口气说完,mysql、sql server、oracle,当然是按照使用熟练程度,所以面试官就往往会往这方面提问,之前由于一直没接触到数据库存储引擎的问题,所以在被问到你用MySQL时,一般用的是哪种存储引擎(Engine)的时候,直接是一脸懵逼!我默默的问了句,什么是存储引擎?好吧,面试官也算是无解,就说现在一般都是用的InnoDB存储引擎吧。我只好在面完后,给自己做了下补充:MySQL常用存储引擎:InnoDB和MyISAM,其中InnoDB适用频繁维护的。修改 插入等的数据表,MyISAM适合少改写 少插入的读取频繁的表,那么显而易见,我们做开发的,肯定是InnoDB存储引擎用的多了!

嗯,大家肯定在想,难道没有面试官问你事务相关的嘛,No,几乎每个面试官都会问,事务是什么东西,那么我们首先要了解到的是,事务是并发控制的单位,是用户定义的一个操作序列,要么全做,要么不做,是一个不可分割的(通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令),主要是为了保证数据的完整性!好了,那么事务的特点呢,原子性、一致性、隔离性、持久性!(如果你想回答的更好那么把各个解释下吧:事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确)那么说了那么多,为什么需要事务呢?之前就说过,为了保证数据的完整性,对的,事务就是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。OK,那么我们就要知道Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。好了,那么我们平时一般怎么处理事务呢?spring的事务是通过“声明式事务”的方式对事务进行管理,即在配置文件中进行声明,通过AOP将事务切面切入程序,最大的好处是大大减少了代码量,提高了工作效率。

7、sql之left join、right join、inner join

答:说句实在话,自从辞职读研以来很久没有用过sql语句了,关于这几个连接光靠记忆的话,完全会是懵逼,幸亏自己还不算蠢,很自然的根据字面理解,我很好的回答了出来,left join就是返回包括左表中所有记录和右表中联结字段相等的记录,好了面试官会问你,那么如果A表中,有甲丙丁3条记录,B表中有甲乙丙丁4条记录,那么如果条件都满足的情况,A left join B 丙记录是否会被查出,答案是否定的!好了,right join就是和left join 相反的,inner join等值联结 只返回2表中联结字段相等的行!

8、sql优化

答:关于这个问题,我一直属于茫然状态,我不知道什么叫优化,不知道怎么样才算优化,记得第一次被问到的时候是在EMC的时候,当时我记得学数据库那会老师总会说尽量少的用的select *,尽量少用 distinct、group之类的命令,于是我就把这些说了上来,很显然,这不是面试官要的结果!哈哈,我就接着扯到写java代码的时候,我依稀记得preparedStatement可以缓存sql语句,下一次执行相同语句不需要再次解析,于是我就答了去,但可惜还是不是面试老大要的结果,之后经提醒,才拨乱反正,意识到索引这玩意,对啊,索引(DB中的索引是某个表中一列或多列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针)啊,主键(聚集索引)啊:一方面,建立索引提高查询速度;另一方面,把所有需提高查询速度的字段都加入聚集索引。最后啊,在sql中,尽量多的使用commit!

最后,这几天问的大概要代表性的问题都在这里吧,至于好多公司直接没怎么问java知识,直接给我问项目经验,一坨坨的论调,继续嘛,还有公司问到了OSI七层模型,让我把每层模型说出来,还有问我OS内存管理如何管理来的,这些我就不一一列举了,今天回忆起这些问题,一个方面,自己做个总结,另一个方面,大家一起共勉。。。

2017年2月20日21:28:09总结 by小仇哥

;