经典的Java面试题及回答集锦(基础篇)

1、问题:如果A和B对象循环引用,是否可以被GC?

回答:可以,现在的虚拟机基本都是通过可达性分析算法来判断对象是否存活的,而不是通过简单的引用计数法来判断对象是否存活。可达性分析算法使用一系列的“GC Roots”对象(虚拟机栈中引用的对象、静态属性引用对象)作为起始点,这些节点向下搜索的路径称为引用链,当一个对象到GC Roots没有任何引用链连接,则证明对象是不可用的。

2、Java中的内存溢出是如何造成的?

OutOfMemoryError:

(1)PerGern Space 程序中使用了大量jar或class,使Java虚拟机装载类空间不够。

解决方案:调参XX:PermSize 和 XX:MaxPermSize 、减少jar包,减少类的重复加载

(2)Java Heap Space Java虚拟机创建了太多的对象。

解决方案:调参Xms(初始堆大小)Xmx(最大堆大小)、检查死循环或不必要创建的重复对象

(3)unable to create new native Thread  JVM占用了太多内存空间,而在JVM中创建线程还要再操作系统中也创建线程。

解决方案:调整JVM中线程大小。

3、String s = “123”;这个语句有几个对象产生?

若字符串池中没有"123",则产生一个对象,并且放入常量池中,若有"123",则产生0个对象。

若是String s = new String("123"),若常量池中没有,则在常量池中创建一个,然后在堆内存中创建一个。

4、Error、Exception和RuntimeException的区别,作用又是什么?

Error和Exception都是Throwable的子类,RuntimeException是Exception的子类。

Error用于指示合理应用程序不应该试图捕获的错误。

Exception指出合理的应用程序需要捕获的条件。分为已检查异常和未检查异常。

RuntimeException是未检查异常,不需要try catch或在方法上声明,主要子类:NullPointer、Arithmatic、ArrayIndexOutOfBounds、ClassCast。

5、Reader和InputStream区别?

都是抽象类,Reader用于读取字符流(char或String),InputStream用于读取字节流(byte数组)。

6、hashCode的作用?

hashCode主要是用于快速查找,如HashMap结构中,用于定位键值对的位置。两个对象相同,则hashCode一定相同,而hashCode相同的对象则不一定相同,就相当于放在同一个框里。

7、HashMap和Hashtable的区别?

线程安全性、null值的key、效率、HashMap(Iterator快速失败迭代器)、Hashtable(enumerator迭代器)、时间推移HashMap元素位置会变

8、HashMap中是否任何对象都可以做为key,用户自定义对象做为key有没有什么要求?

可以、但是要key对象必须是不可变的对象,不然在Entry被插入Map中后,再改变key值,会导致当前key值与hash值不符合,即与数组索引不符,将无法被查找到。

9、 启动一个线程是用run()还是start()?

多线程有几种实现 同步和并发是如何解决的 什么叫守护线程,用什么方法实现守护线程(Thread.setDeamon()的含义) 如何停止一个线程? 解释是一下什么是线程安全?举例说明一个线程不安全的例子。解释Synchronized关键字的作用。 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

(1)start

(2)继承Thread类、实现Runnable接口、使用ExectuorService、Future、Callable实现由返回值的线程。

(3)同步方法、同步代码块、锁

(4)Damon线程、为其他线程的运行提供服务,如GC,Thread。setDeamon(true)。

(5)Thread.stop()不推荐(不会正确释放资源)、使用中断来停止线程。

(6)当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。

(7)车票被重复卖出。

(8)同步关键词。修饰静态方法,则以类作为锁对象,同时只能有一个线程访问此类同步的静态方法;修饰普通方法,则以此对象作为锁对象,同时只能有一个线程访问此类同步的普通方法;也可以自定义锁对象同步代码块。

(9)synchronized方法不可以进入,非synchronized可以进入。

10、了解过哪些JDK8的新特性,举例描述下相应的特性?

(1)lambda表达式:函数式编程,方法引用

(2)Stream API

(3)接口的默认方法

(4)日期时间API的改进,新增DateTimeFormatter方法

11、对sql进行优化的原则有哪些?

详情见我数据库分类的的一篇博客

12、Servlet的生命周期,Serlvet与CGI的区别?

生命周期:类加载、实例化(构造对象),初始化(init),服务(service),销毁(destroy)。

CGI:common gateway interface,通用网关接口,Perl语言编写,每个请求创建一个CGI对象。

Servlet:只需要实例化、初始化一次,多线程。

13、StringBuffer有什么优势?为什么快?

因为StringBuffer不需要重复创建String对象,但是其实也不是这样。

比如String s = "a" + "b" + "c"操作编译器会优化,变成String s = "abc"

String s = s1 + s2 + s3编译器也会优化,变成StringBuilder的append操作,但是如果不是一次性+操作拼接完,就会反复生成String对象与StringBuilder对象,效率会很低。

14、加密解密算法了解吗?

摘要算法:MD5(128位)、SHA1(160位),是一种不可逆的过程,无论多大的数据,经过摘要算法后都生成相同长度的数据。只能通过字典进行破解。

对称加密算法:DES、AES,加密解密时使用相同的秘钥。

非对称加密算法:RSA,加密解密时使用不同的秘钥,对接支付宝使用RSA2。

15、解决高并发与高负载?

(1)静态页面消耗最小,尽可能的HTML静态化,采用信息发布系统CMS实现信息录入自动生成静态页面、在前端缓存不经常改变的动态数据。

(2)CDN,把CSS/JS等资源分布在不同的服务器上。

(3)负载均衡(Nginx)。

(4)缓存不常改变的数据(Redis、memcache)。

(5)图片服务器与应用服务器分离。

(6)集群。

16、Integer内部缓存?

Integer类内部有一个staitic 的Integer数组,存储的是一些已经完成初始化的Integer对象,一般值为(-128~127),若用==比较,则有时候会因为值不在缓存中而返回false,所以应该用equals比较。

17、ArrayList的原理?

(1)ArrayList是线程不安全的,若要线程安全,则使用CopyOnWriteList。

(2)底层是Object[]数组,内部有一个elementData引用指向数组,刚开始默认指向一个缓存空数组(transient),当要进行扩容时,会重新new一个大小为1.5倍(x + (x >>1))的新数组,然后将旧元素通过System.arraycopy这个native方法拷贝到新数组中。

(3)随机读写(get、set)方法的算法复杂度为O(1)。

(4)增加操作分为两种,add(index, value)的算法复杂度为O(n),因为要通过元素复制进行移动;而add(value)操作的算法复杂度为O(1)(若不发生扩容)。

(5)删除操作的时间复杂度为O(n),因为不管是按index进行删除还是按照object去删除,都需要通过复制去实现移动操作,删除后数组大小不会变,靠size属性来维护长度。按object进行删除时不能用new出来的对象,要通过ArrayList内对象的引用删除。

18、LinkedList的原理?

(1)底层是一个双向链表,维护着一个first指针和一个last指针。

(2)随机读写(get,set)的时间复杂度为O(n)。

(3)插入操作add(object)的时间复杂度为O(1);add(index, object)的时间复杂度为O(n)。

(4)删除操作remove(object)的时间复杂度为O(1);remove(index)的时间复杂度为O(n)。

19、线程池使用的注意事项?

(1)防止死锁。线程池中所有线程都在等待A事件发生,而没有空闲线程去执行A。

(2)防止系统资源不足。要控制线程数量。

(3)防止并发错误。

(4)防止线程泄漏,某个线程因RuntimeException或Error没有正常被捕获导致该线程异常终止,线程池失去了一个线程。

(5)避免任务过载。

20、Spring中@Autowire与@Resource的区别?

@Autowire默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false,如果我们想使用按照名称装配,可以结合@Qualifier注解一起使用;

@Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象

21、线程状态转移图。

22、Object类的方法?

(1)equals:判断是否相等。

(2)hashCode:求hash值,若两个对象hash值相等,不一定equals;若equals,则两个对象hash值一定相等。

(3)toString:获得对象的字符串表达形式,一般要重写。

(4)getClass:反射方法,获得对象所属的类。

(5)wait:只能在synchronized同步的代码段中使用,若不带时间参数,则使得正在执行的线程放弃锁进入等待状态(等待池)。

(6)notify:只能在synchronized同步的代码段中使用,从等待池中取出一个线程放入锁标志池。

(7)notifyAll:只能在synchronized同步的代码段中使用,将等待池中取出所有线程放入锁标志池。

23、Java序列化的底层原理?

将对象信息转化为字节码信息。

(1)存储序列化的描述。(2)当前类描述信息。(3)当前类属性描述。(4)超类描述(5)超类属性描述(6)超类属性值描述(7)子类属性值描述

(0)

相关推荐

  • Java面试题及答案集锦(基础题122道,代码题19道)

    Java基础面试题及答案集锦(基础题122道,代码题19道),具体详情如下所示: 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性

  • Java 面试题基础知识集锦

    经典的Java基础面试题集锦,欢迎收藏和分享. 问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示"main方法不是public的". 问题:Java里的传引用和传值的区别是什么? 答案:传引用是指传递的是地址而不是值本身,传值则是传递值的一份拷贝. 问题:如果要重写一个对象的equals方法,还要考虑什么? 答案:hashCode. 问题:Java的"一次编写,处处运行"是如何实现的? 答案:Java程序会被编译成字节码组成

  • Java面试题目集锦

    1.equals方法用于比较对象的内容是否相等(覆盖以后) 2.hashcode方法只有在集合中用到 3.当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等). 4.将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中.如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接

  • 经典的Java面试题及回答集锦(基础篇)

    1.问题:如果A和B对象循环引用,是否可以被GC? 回答:可以,现在的虚拟机基本都是通过可达性分析算法来判断对象是否存活的,而不是通过简单的引用计数法来判断对象是否存活.可达性分析算法使用一系列的"GC Roots"对象(虚拟机栈中引用的对象.静态属性引用对象)作为起始点,这些节点向下搜索的路径称为引用链,当一个对象到GC Roots没有任何引用链连接,则证明对象是不可用的. 2.Java中的内存溢出是如何造成的? OutOfMemoryError: (1)PerGern Space

  • Java面试题冲刺第一天--基础篇1

    目录 面试题1:Java 中操作字符串都有哪些类?它们之间有什么区别? 正经回答: 深入追问: 追问1:这三者在效率上怎么说? 追问2:那StringBuffer和StringBuffer线程安全主要差在哪里呢? 面试题2:请你说一下Error 和 Exception 区别是什么? 正经回答: 面试题3:== 和 equals 的区别是什么 正经回答: 深入追问: 追问1:如果我们不重写equals() 方法,会怎么样? 追问2:重写equals的同时,我们需要重写hashCode()方法么?为

  • 15道非常经典的Java面试题 附详细答案

    试题如下: 参考答案: import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by ysc on 7/26/16. */ public class Interview {

  • Java面试题冲刺第二天--Redis篇

    目录 面试题1:为什么要用 Redis ?业务在哪块儿用到的? 正经回答: 深入追问: 追问1:Redis里有哪些数据类型? 追问2:Redis与Memcached有哪些区别? 追问3:那Redis怎样防止异常数据不丢失的?如何持久化? 面试题2:Redis为啥是单线程的? 正经回答: 深入追问: 追问1:单线程只使用了单核CPU,太浪费,有什么办法发挥多核CPU的性能嘛? 面试题3:聊一下对缓存穿透.缓存击穿.缓存雪崩的理解吧 正经回答: 深入追问: 追问1:那你说一下针对缓存击穿的解决方法

  • 15个高级Java多线程面试题及回答

    Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.用于直接面向市场交易的高容量和低延时的电子交易系统在本质上是并发的.下面这些是我在不同时间不同地点喜欢问的Jav

  • 最有价值的50道java面试题 适用于准入职Java程序员

    下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最新版本,去掉了EJB 2.x等无用内容,补充了数据结构和算法相关的题目.经典面试编程题.大型网站技术架构.操作系统.数据库.软件测试.设计模式.UML等内容,同时还对很多知识点进行了深入的剖析,例如hashCode方法的设计.垃圾收集的堆和代.Java新的并发编程.NIO.2等,相信对准备入职的Ja

  • 百度Java面试题 前200页精选(上)

    百度"Java面试题"前200页精选上篇 基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie 和 Session的区别 fail-fast 与 fail-safe 机制有什么区别 get 和 post请求的区别 Interface 与 abstract 类的区别 IOC的优点是什么 IO 和 NIO的区别,NIO优点 Java 8 / J

  • 百度Java面试题 前200页精选(中)

    百度"Java面试题"前200页精选中篇 多线程 基本概念 什么是线程 多线程的优点 多线程的几种实现方式 1.用 Runnable 还是 Thread 什么是线程安全 Vector, SimpleDateFormat 是线程安全类吗 什么 Java 原型不是线程安全的 哪些集合类是线程安全的 多线程中的忙循环是什么 如何创建一个线程 编写多线程程序有几种实现方式 什么是线程局部变量 线程和进程有什么区别?进程间如何通讯,线程间如何通讯 什么是多线程环境下的伪共享(false shar

随机推荐