没有合适的资源?快使用搜索试试~ 我知道了~
首页Java求职面试速查:实战技巧与热门趋势
Java求职面试速查:实战技巧与热门趋势
需积分: 1 0 下载量 41 浏览量
更新于2024-07-18
收藏 2.99MB PDF 举报
"《Java求职面试指南》是一份实用的面试指导资料,特别针对初级、中级和中高级Java职位的求职者设计。作者及其团队在2015年的面试经历中,凭借丰富的实战经验和80%以上的Offer获取率,分享了他们在面试过程中的心得与技巧。这份指南并非传统的教材,而是注重实用性,提炼了他们在浙江图书馆广泛阅读Java面试书籍后总结的精华内容。 2015年对于Java程序员来说是转折点,互联网行业的繁荣带动了Java技术的高需求,中高级职位的薪资涨幅明显,反映出市场对Java开发者的青睐。Java语言尽管面临过质疑,但至今仍保持其主导地位,对开发者的需求持续增长。本指南尤其关注Java技术相关知识,对于0-4年工作经验的求职者非常有用,因为这部分人在面试中通常会被询问技术细节。 指南的目的是帮助求职者快速回顾和复习面试要点,而不是深入学习教材。它适用于两种情况:一是时间紧张,无暇系统复习的求职者;二是想了解市场和技术趋势的新进者,他们希望通过此文档预先了解面试可能涉及的方向。虽然对于已有5年以上工作经验且基础扎实的求职者,可能部分内容不太适用,因为他们通常只需分享项目经验即可获得职位。 《Java求职面试指南》是一份实用的参考工具,可以帮助求职者在有限的时间内提升面试准备效果,适应不断变化的就业市场和技术环境。"
资源详情
资源推荐
版权所有 切勿随意散播违者必究!
14 / 85
不能再干任何事情了。 Java NIO 的非阻塞模式,使一个线程从某通道发送请求
读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么
都不会获取。线程通常将非阻塞 IO 的空闲时间用于在其它通道上执行 IO 操作,
所以一个单独的线程现在可以管理多个输入和输出通道(channel)。 虽然是非阻
塞的,但也会遇到一个问题就是服务器对最大连接的支持,但在线用户连接数大
于系统支持数时,NIO 的默认实现是并不管是否还有足够的可用连接数,而是直
接打开连接。在 netty 框架中经常会看到一个 open too many files 异常就是由此
引起的,所以要灵活使用,合适配置。
3、Java NIO 的选择器允许一个单独的线程来监视多个输入通道,你可以注册多
个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已
经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单
独的线程很容易来管理多个通道。
扩展:Netty 是 NIO 实现的一个经典框架,好多职位中都要求熟悉 netty,大家
有时间可以研究一下。
4.8 Synchronized 和 Lock 区别和用法
解析:这里相对于上面的 wait 与 sleep 的区别来说,难度明显增加,也是常
见的面试题。
参考答案:
首先他们都是用来实现线程的同步操作的,synchronized 是 jdk1.2 以来一直存在,
而且 Lock 是 jdk1.5 的新增;具体区别如下:
1、Lock 是 JDK1.5 才出现的,而在 jdk1.5 及之前的 synchronized 存在很大的性
能问题,尤其在资源竞争激烈的条件下,性能下降十多倍,而此时的 Lock 还基
本能维持常态。(synchronized 在 jdk1.5 后的版本,作了很大的性能优化)
2、使用 synchronized 时对象一定会被阻塞,其它线程必须等待锁释放后才能
执行,在高并发的情况下,很容易降低性能,而且控制不当还容易造成死锁,所
以要合适的利用 Synchronized,并且尽可能的精确到最小的业务逻辑块。而 Lock
提供了更细致的操作,其常用的实现类有读写锁,这里以 ReentrantLock 为例,
它拥有 Synchronized 相同的并发性和内存语义,此外还多了锁投票,定时锁等候
和中断锁等候等很多详细的方法操作。 ReentrantLock 获取锁定与三种方式:a)
lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠
状态,直到获取锁 b) tryLock(), 如果获取了锁立即返回 true,如果别的线程正持
有锁,立即返回 false;c)tryLock(long timeout,TimeUnit unit),如果获取了锁定立
即返回 true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,
如果获取了锁定,就返回 true,如果等待超时,返回 false;d) lockInterruptibly:
如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或
者锁定,或者当前线程被别的线程中断。
3、synchronized 是在 JVM 层面上实现的,不但可以通过一些监控工具监控
synchronized 的锁定,而且在代码执行时出现异常,JVM 会自动释放锁定,但是
使用 Lock 则不行,lock 是通过代码实现的,要保证锁定一定会被释放,就必须
将 unLock()放到 finally{}中。
补充:
版权所有 切勿随意散播违者必究!
15 / 85
A.无论 synchronized 关键字加在方法上还是对象上,他取得的锁都是对象,而
不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象
访问。 B.每个对象只有一个锁(lock)和之相关联。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避
免无谓的同步控制。synchronized 可以加在方法上,也可以加在对象上,通常理
解为,只有持有了锁才可以进行对应代码块的执行。
java.util.concurrent.locks 包下面提供了一些锁的实现,有读写锁,公平锁等。
将 synchronized 替换成 lock 的实现可以提升性能:
1. 大部分应用场景是读写互斥,写和写互斥,读和读不互斥。而 synchronized
则是都互斥。
可以利用读写锁来优化性能,读锁锁住读的代码块,写锁锁住写的代码块。
2. 要确保你在理解原来利用到 synchronized 的代码逻辑,避免一概而论地把
synchronized 替换成锁。
PS:被 synchronized 修饰的方法所在的对象,其它线程可以访问该对象的非
synchronized 修饰的方法,不能访问 synchronized 的任何方法。
说明:里面有一部分看网上总结的比较好,就直接拿过来使用了,当然面试
时也不是说必须要把上面的点回答完,最重要要通过自己的理解表达出来。
4.9 Final、Finally、Finalize 的区别
解析:这是一个很老很老就存在的面试题,但还是经常被问到,越简单的题
在面式中越不允许答错。
参考答案:
Final 是 Java 中一个特别的关键字(修饰符),final 修饰的类不能被继承,final
修饰的变量不能被修改(是常量),final 修饰的方法不能被重写,所以使用 final
要考虑清楚使用场景。
Finally 是 Java 异常处理 try{}catch(..){}finally{}中的一部分,finally 语句块中的语句
一定会被执行到(Down 机除外),通常用于进行资源的关闭操作,如数据连接
关闭等。
Finalize 是 Object 类中的一个方法,finalize() 方法是在垃圾收集器删除对象之前
对这个对象调用的,设计的初终是可以进行一些资源的关闭,但这个方法很少被
重写,因为垃圾回收器执行时并不一定会调用,比如抛异常时,而且垃圾回收本
身就是随意的,不可控制的。
4.10 OverLoad 与 Override 的区别
解析:这里其实是考的是 Java 面向对象的三(四,如果算上抽象就是四大特
征)大特征,封装、继承、多态、(抽象)中的多态,属于基础类型常考题之一。
参考答案:overload 和 override 是多态的两种表现形式;
overload 重载规则是
同名不同参
,方法名相同,参数类型、个数、顺序至少有一
个不相同(与返回值、参数名、抛出的异常都没有关系);
版权所有 切勿随意散播违者必究!
16 / 85
overload 可以发生在父类、同类、子类中。override 重写的规则是
方法名、参
数、返回值相同
,发生在父子类之间,而且子类不能抛出比父类更多的异常,被
重写的方法一定不能定义成 final。
4.11 Collection 与 Collections 的区别
参考答案:Collection 是一个集合的超级接口,它定义了一些集合常用的操
作方法,如 add,size,remove,clear 等,我们经常用到的 List(可重复集合),Set(不
可重复集合)接口就是它的子接口。
Collections 此类完全由在 collection 上进行操作或返回 collection 的静态方法
组成。它包含在 collection 上操作的多态算法,即“包装器”,包装器返回由指定
collection 支持的新 collection,以及少数其他内容。如果为此类的方法所提供的
collection 或类对象为 null,则这些方法都将抛出 NullPointerException。常用到的
方法如 copy,sort,reverse,replaceall 等。
第 05 章 Java 基础知识
5.1“==”与“equals”区别
解析:这是一个很简单的题,很多人都能答上来“==”通常用来比较地址,
而且 equals 则是比较内容;如果仅仅这样回答,通常面试只能得到 60 分,可以
通过下面的两个例子来看一下。
String s1 = "s";
String s2 ="s" ;
String s3 = new String("s");
String s4 = new String("s");
StringBuffer sb1 = new StringBuffer("s");
StringBuffer sb2 = new StringBuffer("s");
System.out.println(s1==s2) ;
System.out.println(s3==s4) ;
System.out.println(sb1==sb2) ;
System.out.println(s1.equals(s2)) ;
System.out.println(s3.equals(s4))
System.out.println(sb1.equals(sb2)) ;
读者可以自己判断一下结果;对于 s1,s2 会指向同一个地址,因为这里的 s1 会
保存在常量池中,s2 会先读取常量池,发现里面已经存在”s”了,不会再进行重
新开辟空间。对于 s3,s4 是在堆中分配两块空间,它们的地址是存放在栈中。sb1
与 sb2 的内在分配和 s3,s4 一样,但注意 StringBuffer 没有重写 equal 方法,而调
版权所有 切勿随意散播违者必究!
17 / 85
用的是 Object 中的 equal 方法,看一下源码可以知道Object 中的 equal 的实现
return (this == obj)其实就是在比较对象的地址。
参考答案:“==”对于基本数据类型,通常用来比较值(基本数据类型是在栈中
进行分配的)相等,对于对象通常用来比较对象的地址。equals 是 Object 中的方
法,可以根据业务需要进行重写,比如 String 中重写了 equals 的方法,常用来比
较两个字符串内容是否相等。
说明:重写 equal 的风险也很大的,上面也提到过重写的规则,所以根据需要进
行重写。
5.2 接口和抽象类的区别
解析:这是一个很简单的题,面试时一定要想清楚再回答,这样的题答错,估计
机会也就失去了。
参考答案:
含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建实例对象,含有
abstract 的方法的类必须定义为 abstract class ,abstract class 里的方法不必是抽
象的,抽象类中定义抽象方法必须放在具体子类中实现,所以,不能有抽象的构
造方法或抽象的静态方法,如果子类没有实现抽象父类中的所有方法,那么,子
类也必须定义为抽象类。
接口(interface)可以说成是抽象类的特例。接口中的所有方法都必须是抽象的,
接口中的方法定义默认为 public abstract 。接口中的变量是全局常量,即 public
static final 修饰的。概括如下:
1、抽象类里可以有构造方法,而接口内不能有构造方法。
2、抽象类中可以有普通成员变量,而接口中不能有普通成员变量。
3、抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是抽象的,
不能有非抽象的普通方法。
4、抽象类中的抽象方法的访问类型可以是 public ,protected 和默认类型,但
接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
5、抽象类中可以包含静态方法,接口内不能包含静态方法。
6、抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访
问类型可以任意,但接口中定义的变量只能是 public static 类型,并且默认为
public static 类型。
7、一个类可以实现多个接口,但只能继承一个抽象类。
以上答案网上都是可以找的到的,也很有条理,如果能回答出五条左右就可以
满分了。除此外,下面就是加分项了,在设计上接口的作用侧重于模块划分,比
如:用户管理接口,信息管理接口,里面都相关用户的增删改查操作。而抽象类
则是侧重于功能的划分,比如事先知道需要实现某个功能,但设计时却还没有想
到如何实现则先抽象出一个方法,或者把子类中重复实现的功能放到抽象中去实
现等。
剩余84页未读,继续阅读
crazystorm_
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++多态实现机制详解:虚函数与早期绑定
- Java多线程与异常处理详解
- 校园导游系统:无向图实现最短路径探索
- SQL2005彻底删除指南:避免重装失败
- GTD时间管理法:提升效率与组织生活的关键
- Python进制转换全攻略:从10进制到16进制
- 商丘物流业区位优势探究:发展战略与机遇
- C语言实训:简单计算器程序设计
- Oracle SQL命令大全:用户管理、权限操作与查询
- Struts2配置详解与示例
- C#编程规范与最佳实践
- C语言面试常见问题解析
- 超声波测距技术详解:电路与程序设计
- 反激开关电源设计:UC3844与TL431优化稳压
- Cisco路由器配置全攻略
- SQLServer 2005 CTE递归教程:创建员工层级结构
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功