Java面试问题总结

以下是面试总结:

其他面试相关链接:
互联网面试问题1
170道面试题

1.JAVA基础

1)HashMap和HashTable的区别

2)HashMap实现原理

3)ArrayList和LinkedList有什么区别?

4)数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

5)抽象类和接口的区别

6)垃圾回收机制

7)说说jvm

8)jvm性能调优

9)ThreadLocal

答案:

1)HashMap和HashTable的区别

区别:
(1).Hashtable是线程安全的,而HashMap是线程不安全的
(2).值:只有HashMap可以让你将空值作为一个表的条目的key或value

2)HashMap实现原理

Hashmap实际上是一个数组和链表的结合体。

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么?
它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

3)ArrayList和LinkedList有什么区别?

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

4)数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

5)抽象类和接口的区别

抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的
接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
一个类只能继承一个抽象类,而一个类却可以实现多个接口。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含 main方法的话是可以被调用的

Java面试问题总结

接口:
[修饰符] interface 接口名 extends 父接口 1,父接口 2….
没有构造方法,不能实例化;
接口只能继承接口,不能继承类
接口里没有普通方法,方法全是抽象的;
接口里的方法默认修饰符是 public abstract;
接口里的字段全是全局常量,默认修饰符是 public static final;
注意:接口方法只能用public abstract;修饰,接口中不允许出现static类型的方法

6).Java的锁有哪几种?

1、自旋锁:自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区。
2、自旋锁的其他种类
3、阻塞锁:常用的有五个状态的锁都是阻塞所。
4、可重入锁:ReentrantLock
5、读写锁:写锁是排他锁,读锁是共享锁。
6、互斥锁
7、悲观锁:在整个数据处理过程中,将数据处于锁定状态。 悲观锁的实现,往往依靠数据库提供的锁机制。
8、乐观锁:乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。
公平锁(Fair):加锁前检查是否有排队等待的线程,优先排队等待的线程,先来先得
非公平锁(Nonfair):加锁时不考虑排队等待问题,直接尝试获取锁,获取不到自动到队尾等待

7)成员变量和局部变量的区别

成员变量和局部变量的区别?
A:在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
C:生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。

注意事项:
局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。

8)java内存分配:

jvm内存结构栈和堆

栈:存放局部变量
堆:存放所有new出来的东西

栈特点:栈内存的数据用完就释放

堆特点:
1.每一个new出来的东西都有地址值
2.每一个变量都有默认值(例如byte、short、int、long默认值0,float、double默认值0.0,char默认值‘\u000’,boolean默认值false)
3.使用完毕就变成垃圾,但是没有立即回收。会在垃圾回收器空闲时回收。

9)垃圾回收机制

相关链接:垃圾回收机制相关链接1

垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?

一.如何确定某个对象是“垃圾”?
使用引用计数法和可达分析法,引用计数法:当对象被引用一次就会加一,可达分析法:对象不能到达Groot就证明可以回收了,Groot是一般是常量池,方法去里面的变量(jvm用这种算法)

二.典型的垃圾收集算法
第一种:标记-清除法
直接在内存里标记无用的对象,然后直接回收;
缺点:形成内存碎片
第二种:复制算法:
将内存划分为大小相等的两块,当一块的内存用完了,就将还存活的对象复制到另外一块上面,然后将之前的那块清理掉
缺点:浪费内存太多(对老年代的使用,效率低)
第三种:标记-整理算法
将存活的对象都向一端移动,然后直接清理掉端边界以外的内存
第四种:分代收集算法:(当前商业虚拟机)
根据对象的存活中期的不同将内存划分为几块,一般java堆分为新生代和老年代
新生代:用复制算法
老年代用标记整理算法进行回收

三.典型的垃圾收集器

10)说说jvm

11)jvm性能调优

12)ThreadLocal

2、线程相关

相关连接:java面试1

1)Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
2)当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?
3)多线程程序有几种实现方式?

1.Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?

答:sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态,请参考第66题中的线程状态转换图)。

wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

2.当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?

不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。

3.多线程程序有几种实现方式?

Java 5以前实现多线程有两种实现方法:一种是继承Thread类;另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活。

Java 5以后创建线程还有第三种方式:实现Callable接口,该接口中的call方法可以在线程执行结束时产生一个返回值

3、WEB端

1.HTTP请求中POST与GET的区别

答:
1、GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输。
POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。上面的item=bandsaw就是实际的传输数据。
因此,GET请求的数据会暴露在地址栏中,而POST请求则不会

2、传输数据的大小
在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限制。

对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。

3、安全性
POST的安全性比GET的高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过GET请求,用户名和密码都会暴露再URL上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,GET请求提交的数据还可能会造成Cross-site request frogery攻击

4.缓存
GET 请求能够被缓存,默认的请求方式也是有缓存的
POST请求默认不会缓存

总结:
1.表现形式:get请求数据会暴露在url中和post请求是在http请求体中,
2.数据量:get请求有url长度限制而post没有传输数据大小的限制 ,
3.安全性:post请求的安全性比get请求高。
4.缓存:get会被缓冲,post默认不会被缓冲

2.Ajax的原理

Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理,我们必须对 XMLHttpRequest有所了解。

3. 如何保证http传输安全性

如何保证http传输安全性文章链接

4、数据库

相关链接:
1.事务链接
2.数据库SQL优化相关链接
3.58到家数据库30条军规解读

1)谈一谈对数据库事务的理解。

(四个特性和隔离级别必须要牢记,了解)

事务并发控制带来的问题:脏读、不可重复读、更新丢失、幻读等等
原子性,一致性,隔离性,持久性;
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

2)spring事务传播特性:

PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。这是默认值

PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作

3)sql的优化误区:

SQL优化之针对count、表的连接顺序、条件顺序、in及exist的优化链接

5.框架问题

相关连接:三大框架面试题

  1. 开发中主要使用 Spring 的什么技术 ?
  2. 简述 AOP 和 IOC 概念
  3. Spring MVC 的运行流程
  4. 说出 Spring MVC 常用的注解

1.开发中主要使用 Spring 的什么技术 ?

答:
①使用Spring的IOC来管理各层的组件
②使用Spring的AOP来配置声明式事务
③使用spring整合其他框架或技术(redis、activemq、cxf)

2.简述 AOP 和 IOC 概念 ?

答:IOC: 控制反转. 也成为 DI(依赖注入)其思想是反转
资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源.作为
回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送
给它所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源.

AOP: 面向(方面)切面的编程;Filter(过滤器)也是一种 AOP. AOP 是一种新的 方法论, 是对传统 OOP(面向对象编程) 的补充. AOP 的主要编程对象是切面(aspect),而切面模块化横切关注点.可以通过举例事务说明

3.Spring MVC 的运行流程

SpringMVC 处理请求过程:
①若一个请求匹配 我们在web.xml中配置的DispatcherServlet 对应的映射路径, WEB 容器将该请求转交给 DispatcherServlet 处理
②DispatcherServlet 接收到请求后, 根据请求信息及 HandlerMapping处理器映射器 的配置找到处理请求的处理器(Handler). 可将 HandlerMapping 看成路由控制器,将 Handler 看成
目标主机。
③当 DispatcherServlet 根据 HandlerMapping 得到对应当前请求的Handler 后,通过 HandlerAdapter (处理器适配器)对 Handler 进行封装,再以统一的适配器接口调用 Handler。
④ 处 理 器 完 成 业 务 逻 辑 的 处 理 后 将 返 回 一 个 ModelAndView 给DispatcherServlet, ModelAndView 包含了视图逻辑名和模型数据信息
⑤DispatcherServlet,借助 ViewResoler (视图解析器)完成逻辑视图名到真实视图对象的解析
⑥得到真实视图对象 View 后, DispatcherServlet 进行视图渲染将模型数据填到
view中,返回给用户

4.Spring MVC 常用的注解

@RequestMapping 、 @PathVariable 、 @RequestParam 、 @RequestBoy
@ResponseBody