JAVA⾯试题及答案
由于篇幅问题,这⾥的答案最只做最浅显的回答,更深⼊的答案⾃⼰百度
这些答案都是我本⼈总结出来的,如果有误,请回复我,我更正下,谢谢!
⼀、Java基础和⾼级
String类为什么是final的;
主要是为了”安全性“和”效率“的缘故,因为:
1. 由于String类不能被继承,所以就不会没修改,这就避免了因为继承引起的安全隐患;
2. String类在程序中出现的频率⽐较⾼,如果为了避免安全隐患,在它每次出现时都⽤final来修饰,这⽆疑会降低程序的执⾏效率,所以⼲脆直
接将其设为final⼀提⾼效率;
HashMap的源码,实现原理,底层结构;
源码⾃⼰百度。
底层结构:JDK1.8之前是使⽤数组+链表,JDK1.8之后是使⽤数组+链表或红⿊树。
反射中,Class.forName和Classloader的区别;
最重要的区别是 Class.forName 会初始化Class,⽽ Classloader 不会。
Classloader 只⼲⼀件事情,就是将.class⽂件加载到jvm中,不会执⾏static中的内容,只有在newInstance才会去执⾏static块。
forName("")得到的class是已经初始化完成的。
因此如果要求加载时类的静态变量被初始化或静态块⾥的代码被执⾏就只能⽤ forName,⽽⽤ Classloader 只有等创建类实例时才会进⾏这些初始化。
session和cookie的区别和联系,session的⽣命周期,多个服务部署时session管理;
cookie存储在客户端,session存储在服务端,通常cookie中会持有session的句柄。
单客户端和服务端建⽴连接时创建session,通常在关闭连接后session失效,但是当客户端使⽤客户端保存的句柄重新连接时,能够重⽤session,这是需要主动刷新session,或者等服务端session过期。
Java中的队列都有哪些,有什么区别;
JVM.png
GC算法:标记-清除(mark-and-sweep、Tracing)、标记-复制(Copying)、标记-整理(Compacting)
Java7、Java8的新特性;
1. jdk7,可以使⽤字符串控制switch语句;
2. jdk7,带资源的try语句;
3. jdk7,运⽤List<String> tempList = new ArrayList<>(); 即泛型实例化类型⾃动推断;
4. jdk8,lambda表达式,函数式编程;
5. ...
Java数组和链表两种结构的操作效率,在哪些情况下(从开头开始,从结尾开始,从中间开始),哪些操作(插⼊,查,删除)的效率⾼;
数组为连续空间,查快,但是写⼊慢。链表是通过指针连接起来的⾮连续空间,查慢,但是修改快。
Java内存泄露的问题调查定位:jmap,jstack的使⽤等等;
1. jmap⽤来查看堆内存使⽤状况
2. jstack主要⽤来查看某个Java进程内的线程堆栈信息
开闭原则
开闭原则(OCP,The Open-Closed Principle)两个主要特征:
1. 对扩展开放(open for extension):模块的⾏为的可以扩展的,当应⽤的需求改变时,可以对模块进⾏扩展。
2. 对修改关闭(closed for modification):对模块进⾏扩展时,不必改动模块的源代码
开闭原则是⾯向对象设计中可复⽤设计的基⽯。
如何对集合进⾏排序
1. Collections.sort(list),如果集合是对象,则需要继承Comparable<T>;
2. Collections.sort(List<T> list, Comparator<? super T> c);
多线程中的忙循环是什么
忙循环就是程序员⽤循环让⼀个线程等待,不像传统⽅法wait(), sleep() 或 yield() 它们都放弃了CPU控制,⽽忙循环不会放弃CPU,它就是在运⾏⼀个空循环。这么做的⽬的是为了保留CPU缓存。
在多核系统中,⼀个等待线程醒来的时候可能会在另⼀个内核运⾏,这样会重建缓存。为了避免重建缓存和减少等待重建的时间就可以使⽤它了。
如何避免死锁
死锁的发⽣必须满⾜以下四个条件:
1. 互斥条件:⼀个资源每次只能被⼀个进程使⽤。
2. 请求与保持条件:⼀个进程因请求资源⽽阻塞时,对已获得的资源保持不放。
3. 不剥夺条件:进程已获得的资源,在末使⽤完之前,不能强⾏剥夺。
4. 循环等待条件:若⼲进程之间形成⼀种头尾相接的循环等待资源关系。
两种种⽤于避免死锁的技术:
1. 加锁顺序(线程按照⼀定的顺序加锁)
2. 加锁时限(线程尝试获取锁的时候加上⼀定的时限,超过时限则放弃对该锁的请求,并释放⾃⼰占有的锁)
Runnable与Callable的区别
相同点:
1. 两者都是接⼝;(废话)
2. 两者都可⽤来编写多线程程序;
3. 两者都需要调⽤Thread.start()启动线程;
不同点:
1. 两者最⼤的不同点是:实现Callable接⼝的任务线程能返回执⾏结果;⽽实现Runnable接⼝的任务线程不能返回结果;
2. Callable接⼝的call()⽅法允许抛出异常;⽽Runnable接⼝的run()⽅法的异常只能在内部消化,不能
继续上抛;
⼆、spring框架
spring框架中有哪些核⼼模块;
1. 核⼼容器(Spring Core)
核⼼容器提供Spring框架的基本功能。Spring以bean的⽅式组织和管理Java应⽤中的各个组件及其关系。Spring使⽤BeanFactory来产⽣和管理Bean,它是⼯⼚模式的实现。BeanFactory使⽤控制反转(IoC)模式将应⽤的配置和依赖性规范与实际的应⽤程序代码分开。
2. 应⽤上下⽂(Spring Context)
Spring上下⽂是⼀个配置⽂件,向Spring框架提供上下⽂信息。Spring上下⽂包括企业服务,如JNDI、EJB、电⼦邮件、国际化、校验和调度功能。
3. Spring⾯向切⾯编程(Spring AOP)
通过配置管理特性,Spring AOP 模块直接将⾯向⽅⾯的编程功能集成到了 Spring框架中。所以,可以
spring ioc注解很容易地使 Spring框架管理的任何对象⽀持 AOP。Spring AOP 模块为基于 Spring 的应⽤程序中的对象提供了事务管理服务。通过使⽤ Spring AOP,不⽤依赖 EJB 组件,就可以将声明性事务管理集成到应⽤程序中。
4. JDBC和DAO模块(Spring DAO)
JDBC、DAO的抽象层提供了有意义的异常层次结构,可⽤该结构来管理异常处理,和不同数据库供应商所抛出的错误信息。异常层次结构简化了错误处理,并且极⼤的降低了需要编写的代码数量,⽐如打开和关闭链接。
5. 对象实体映射(Spring ORM)
Spring框架插⼊了若⼲个ORM框架,从⽽提供了ORM对象的关系⼯具,其中包括了Hibernate、JDO和 IBatis SQL Map等,所有这些都遵从Spring的通⽤事物和DAO异常层次结构。
6. Web模块(Spring Web)
Web上下⽂模块建⽴在应⽤程序上下⽂模块之上,为基于web的应⽤程序提供了上下⽂。所以Spring框架⽀持与Struts集成,web模块还简化
MVC.jpg
springMVC注解的意思;
@RequsetBody、@Autowired、@RequestMapping、@Controller、@Service
Spring中BeanFactory和ApplicationContext的联系和区别;
BeanFactory在启动的时候不会去实例化Bean,中有从容器中拿Bean的时候才会去实例化;
ApplicationContext在启动的时候就把所有的Bean全部实例化了。它还可以为Bean配置lazy-init=true来让Bean延迟实例化;
spring注⼊的⼏种⽅式;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论