更新时间:2019-07-23 09:48:17 来源:极悦 浏览2998次
今天我们进入《Java基础面试题及答案》专题,小编整合了近年各大厂的面试中的常见问题和知识点,我们的最终目标就是大厂:
1、如果A和B对象循环引用,是否可以被GC?
回答:可以,现在的虚拟机基本都是通过可达性分析算法来判断对象是否存活的,而不是通过简单的引用计数法来判断对象是否存活。可达性分析算法使用一系列的“GCRoots”对象(虚拟机栈中引用的对象、静态属性引用对象)作为起始点,这些节点向下搜索的路径称为引用链,当一个对象到GCRoots没有任何引用链连接,则证明对象是不可用的。
2、Java中的内存溢出是如何造成的?
OutOfMemoryError:
(1)PerGernSpace程序中使用了大量jar或class,使Java虚拟机装载类空间不够。
解决方案:调参XX:PermSize和XX:MaxPermSize、减少jar包,减少类的重复加载
(2)JavaHeapSpaceJava虚拟机创建了太多的对象。
解决方案:调参Xms(初始堆大小)Xmx(最大堆大小)、检查死循环或不必要创建的重复对象
(3)unabletocreatenewnativeThreadJVM占用了太多内存空间,而在JVM中创建线程还要再操作系统中也创建线程。
解决方案:调整JVM中线程大小。
3、Error、Exception和RuntimeException的区别,作用又是什么?
Error和Exception都是Throwable的子类,RuntimeException是Exception的子类。
Error用于指示合理应用程序不应该试图捕获的错误。
Exception指出合理的应用程序需要捕获的条件。分为已检查异常和未检查异常。
RuntimeException是未检查异常,不需要trycatch或在方法上声明,主要子类:NullPointer、Arithmatic、ArrayIndexOutOfBounds、ClassCast。
4、Reader和InputStream区别?
都是抽象类,Reader用于读取字符流(char或String),InputStream用于读取字节流(byte数组)。
5、hashCode的作用?
hashCode主要是用于快速查找,如HashMap结构中,用于定位键值对的位置。两个对象相同,则hashCode一定相同,而hashCode相同的对象则不一定相同,就相当于放在同一个框里。
6、HashMap和Hashtable的区别?
线程安全性、null值的key、效率、HashMap(Iterator快速失败迭代器)、Hashtable(enumerator迭代器)、时间推移HashMap元素位置会变
7、HashMap中是否任何对象都可以做为key,用户自定义对象做为key有没有什么要求?
可以、但是要key对象必须是不可变的对象,不然在Entry被插入Map中后,再改变key值,会导致当前key值与hash值不符合,即与数组索引不符,将无法被查找到。
8、启动一个线程是用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可以进入。
9、了解过哪些JDK8的新特性,举例描述下相应的特性?
(1)lambda表达式:函数式编程,方法引用
(2)StreamAPI
(3)接口的默认方法
(4)日期时间API的改进,新增DateTimeFormatter方法
10、对sql进行优化的原则有哪些?
详情见我数据库分类的的一篇博客
11、Servlet的生命周期,Serlvet与CGI的区别?
生命周期:类加载、实例化(构造对象),初始化(init),服务(service),销毁(destroy)。
CGI:commongatewayinterface,通用网关接口,Perl语言编写,每个请求创建一个CGI对象。
Servlet:只需要实例化、初始化一次,多线程。
12、StringBuffer有什么优势?为什么快?
因为StringBuffer不需要重复创建String对象,但是其实也不是这样。
比如Strings="a"+"b"+"c"操作编译器会优化,变成Strings="abc"
Strings=s1+s2+s3编译器也会优化,变成StringBuilder的append操作,但是如果不是一次性+操作拼接完,就会反复生成String对象与StringBuilder对象,效率会很低。
13、加密解密算法了解吗?
摘要算法:MD5(128位)、SHA1(160位),是一种不可逆的过程,无论多大的数据,经过摘要算法后都生成相同长度的数据。只能通过字典进行破解。
对称加密算法:DES、AES,加密解密时使用相同的秘钥。
非对称加密算法:RSA,加密解密时使用不同的秘钥,对接支付宝使用RSA2。
14、解决高并发与高负载?
(1)静态页面消耗最小,尽可能的HTML静态化,采用信息发布系统CMS实现信息录入自动生成静态页面、在前端缓存不经常改变的动态数据。
(2)CDN,把CSS/JS等资源分布在不同的服务器上。
(3)负载均衡(Nginx)。
(4)缓存不常改变的数据(Redis、memcache)。
(5)图片服务器与应用服务器分离。
(6)集群。
15、Integer内部缓存?
Integer类内部有一个staitic的Integer数组,存储的是一些已经完成初始化的Integer对象,一般值为(-128~127),若用==比较,则有时候会因为值不在缓存中而返回false,所以应该用equals比较。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习