logo资料库

史上最全Java面试题(带全部答案).docx

第1页 / 共47页
第2页 / 共47页
第3页 / 共47页
第4页 / 共47页
第5页 / 共47页
第6页 / 共47页
第7页 / 共47页
第8页 / 共47页
资料共47页,剩余部分请下载后查看
面向对象的三个特征
多态的好处
代码中如何实现多态
虚拟机是如何实现多态的
接口的意义
抽象类的意义
接口和抽象类的区别
什么是不可变对象
静态变量和实例变量的区别?
能否创建一个包含可变对象的不可变对象?
java 创建对象的几种方式
switch中能否使用string做参数
switch能否作用在byte, long上?
String s1=”ab”, String s2=”a”+”b”, String s3=”a”,
你对String对象的intern()熟悉么?
Object中有哪些公共方法?
java当中的四种引用
WeakReference与SoftReference的区别?
为什么要有不同的引用类型
java中==和eqauls()的区别,equals()和`hashcode的区别
equals()和hashcode()的联系
a.hashCode()有什么用?与a.equals(b)有什么关系
有没有可能两个不相等的对象有相同的hashcode
可以在hashcode中使用随机数字吗?
a==b与a.equals(b)有什么区别
3*0.1==0.3返回值是什么
a=a+b与a+=b有什么区别吗?
short s1= 1; s1 = s1 + 1; 该段代码是否有错,有的话怎么改?
short s1= 1; s1 += 1; 该段代码是否有错,有的话怎么改?
& 和 &&的区别
一个java文件内部可以有类?(非内部类)
如何正确的退出多层嵌套循环?
内部类的作用
final, finalize和finally的不同之处
clone()是哪个类的方法?
深拷贝和浅拷贝的区别是什么?
static都有哪些用法?
数据类型相关
java中int char,long各占多少字节?
int和Integer的区别
int 和Integer谁占用的内存更多?
String, StringBuffer和StringBuilder区别
StringBuffer和StringBuilder
什么是编译器常量?使用它有什么风险?
java当中使用什么类型表示价格比较好?
如何将byte转为String
可以将int强转为byte类型么?会产生什么问题?
关于垃圾回收
你知道哪些垃圾回收算法?
如何判断一个对象是否应该被回收
简单的解释一下垃圾回收
调用System.gc()会发生什么?
进程,线程相关
说说进程,线程,协程之间的区别
你了解守护线程吗?它和非守护线程有什么区别
什么是多线程上下文切换
创建两种线程的方式?他们有什么区别?
Thread类中的start()和run()方法有什么区别?
怎么检测一个线程是否持有对象监视器
Runnable和Callable的区别
什么导致线程阻塞
产生死锁的条件
为什么wait()方法和notify()/notifyAll()方法要在同步块中被调用
wait()方法和notify()/notifyAll()方法在放弃对象监视器时有什么区别
wait()与sleep()的区别
为什么wait, nofity和nofityAll这些方法不放在Thread类当中
怎么唤醒一个阻塞的线程
什么是多线程的上下文切换
synchronized和ReentrantLock的区别
FutureTask是什么
一个线程如果出现了运行时异常怎么办?
如何在两个线程间共享数据
如何正确的使用wait()?使用if还是while?
什么是线程局部变量ThreadLocal
ThreadLoal的作用是什么?
生产者消费者模型的作用是什么?
写一个生产者-消费者队列
使用阻塞队列来实现
使用wait-notify来实现
如果你提交任务时,线程池队列已满,这时会发生什么
为什么要使用线程池
java中用到的线程调度算法是什么
Thread.sleep(0)的作用是什么
什么是CAS
什么是乐观锁和悲观锁
ConcurrentHashMap的并发度是什么?
ConcurrentHashMap的工作原理
jdk 1.6:
jdk 1.8
CyclicBarrier和CountDownLatch区别
你有哪些多线程开发良好的实践?
关于volatile关键字
可以创建Volatile数组吗?
volatile能使得一个非原子操作变成原子操作吗?
ArrayList和LinkedList的区别?
ArrayList和Array有什么区别?
Comparator和Comparable的区别?
如何实现集合排序?
LinkedList的是单向链表还是双向?
关于异常
简单描述java异常体系
什么是异常链
throw和throws的区别
简单解释一下类加载器
简述堆和栈的区别
简述JVM内存分配
其他
java当中采用的是大端还是小端?
XML解析的几种方式和特点
JDK 1.7特性
JDK 1.8特性
Maven和ANT有什么区别?
JDBC最佳实践
IO操作最佳实践
今天要谈的主题是关于求职,求职是在每个技术人员的生涯中都要经历多次。对于 我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试 题将帮助我们减少许多麻烦。在跳槽季来临之前,特地做这个系列的文章,一方面帮助自 己巩固下基础,另一方面也希望帮助想要换工作的朋友。 相关概念 面向对象的三个特征 封装,继承,多态,这个应该是人人皆知,有时候也会加上抽象。 多态的好处 允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种 不同的行为方式(发送消息就是函数调用)。主要有以下优点: 1. 可替换性:多态对已存在代码具有可替换性 2. 可扩充性:增加新的子类不影响已经存在的类结构 3. 接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它 来实现的。 4. 灵活性 5. 简化性 代码中如何实现多态
实现多态主要有以下三种方式: 1. 接口实现 2. 继承父类重写方法 3. 同一类中进行方法重载 虚拟机是如何实现多态的 动态绑定技术(dynamic binding),执行期间判断所引用对象的实际类型,根据实际类 型调用对应的方法。 接口的意义 接口的意义用三个词就可以概括:规范,扩展,回调。 抽象类的意义 抽象类的意义可以用三句话来概括: 1. 为其他子类提供一个公共的类型 2. 封装子类中重复定义的内容 3. 定义抽象方法,子类虽然有不同的实现,但是定义时一致的 接口和抽象类的区别
父类的静态方法能否被子类重写 不能。重写只适用于实例方法,不能用于静态方法,而子类当中含有和父类相同签名的静 态方法,我们一般称之为隐藏。 什么是不可变对象 不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象, 如 String、Integer 及其它包装类。 静态变量和实例变量的区别?
静态变量存储在方法区,属于类所有。实例变量存储在堆当中,其引用存在当前线程栈。 能否创建一个包含可变对象的不可变对象? 当然可以创建一个包含可变对象的不可变对象的,你只需要谨慎一点,不要共享可变对 象的引用就可以了,如果需要变化时,就返回原对象的一个拷贝。最常见的例子就是对 象中包含一个日期对象的引用。 java 创建对象的几种方式 1. 采用 new 2. 通过反射 3. 采用 clone 4. 通过序列化机制 前 2 者都需要显式地调用构造方法。造成耦合性最高的恰好是第一种,因此你发现无论 什么框架,只要涉及到解耦必先减少 new 的使用。 switch 中能否使用 string 做参数 在 idk 1.7 之前,switch 只能支持 byte, short, char, int 或者其对应的封装类以及 Enum 类型。从 idk 1.7 之后 switch 开始支持 String。 switch 能否作用在 byte, long 上?
可以用在 byte 上,但是不能用在 long 上。 String s1=”ab”, String s2=”a”+”b”, String s3=”a”, String s4=” b”, s5=s3+s4 请问 s5==s2 返回什么? 返回 false。在编译过程中,编译器会将 s2 直接优化为”ab”,会将其放置在常量池当 中,s5 则是被创建在堆区,相当于 s5=new String(“ab”); 你对 String 对象的 intern()熟悉么? intern()方法会首先从常量池中查找是否存在该常量值,如果常量池中不存在则现在常 量池中创建,如果已经存在则直接返回。 比如 String s1=”aa”; String s2=s1.intern(); System.out.print(s1==s2);//返回 true Object 中有哪些公共方法? 1. equals() 2. clone() 3. getClass() 4. notify(),notifyAll(),wait() 5. toString
java 当中的四种引用 强引用,软引用,弱引用,虚引用。不同的引用类型主要体现在 GC 上: 1. 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不 足,JVM 也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如 果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为 null,这样一来的话, JVM 在合适的时间就会回收该对象。 2. 软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃 圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。 3. 弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦 发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收 器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象。 4. 虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引 用,在任何时候都可能被垃圾回收器回收。 WeakReference 与 SoftReference 的区别? 这点在四种引用类型中已经做了解释,这里简单说明一下即可: 虽然 WeakReference 与 SoftReference 都有利于提高 GC 和 内存的效率,但是 WeakReference ,一旦失去最后一个强引用,就会被 GC 回收,而软引用虽然不能 阻止被回收,但是可以延迟到 JVM 内存不足的时候。 为什么要有不同的引用类型
不像 C 语言,我们可以控制内存的申请和释放,在 Java 中有时候我们需要适当的控制 对象被回收的时机,因此就诞生了不同的引用类型,可以说不同的引用类型实则是对 GC 回收时机不可控的妥协。有以下几个使用场景可以充分的说明: 1. 利用软引用和弱引用解决 OOM 问题:用一个 HashMap 来保存图片的路径和 相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM 会自动回收这些缓存图 片对象所占用的空间,从而有效地避免了 OOM 的问题. 2. 通过软引用实现 Java 对象的高速缓存:比如我们创建了一 Person 的类,如果每 次需要查询一个人的信息,哪怕是几秒中之前刚刚查询过的,都要重新构建一个实例,这将 引起大量 Person 对象的消耗,并且由于这些对象的生命周期相对较短,会引起多次 GC 影 响性能。此时,通过软引用和 HashMap 的结合可以构建高速缓存,提供性能。 java 中==和 eqauls()的区别,equals()和`hashcode 的区别 ==是运算符,用于比较两个变量是否相等,而 equals 是 Object 类的方法,用于比较 两个对象是否相等。默认 Object 类的 equals 方法是比较两个对象的地址,此时和== 的结果一样。换句话说:基本类型比较用==,比较的是他们的值。默认下,对象用== 比较时,比较的是内存地址,如果需要比较对象内容,需要重写 equal 方法。 equals()和 hashcode()的联系 hashCode()是 Object 类的一个方法,返回一个哈希值。如果两个对象根据 equal()方 法比较相等,那么调用这两个对象中任意一个对象的 hashCode()方法必须产生相同的哈希 值。
如果两个对象根据 eqaul()方法比较不相等,那么产生的哈希值不一定相等(碰撞的情况下 还是会相等的。) a.hashCode()有什么用?与 a.equals(b)有什么关系 hashCode() 方法是相应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap 等等。它与 equals() 方法关系特别紧密。根 据 Java 规范,使用 equal() 方法来判断两个相等的对象,必须具有相同的 hashcode。 将对象放入到集合中时,首先判断要放入对象的 hashcode 是否已经在集合中存在,不 存在则直接放入集合。如果 hashcode 相等,然后通过 equal()方法判断要放入对象与集合 中的任意对象是否相等:如果 equal()判断不相等,直接将该元素放入集合中,否则不放入。 有没有可能两个不相等的对象有相同的 hashcode 有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突。如果两个对象相等,必须有相同的 hashcode 值,反之不成立。 可以在 hashcode 中使用随机数字吗? 不行,因为同一对象的 hashcode 值必须是相同的 a==b 与 a.equals(b)有什么区别
分享到:
收藏