京东Java面试题(二)

一、set集合从原理上如何保证不重复java

1)在往set中添加元素时,若是指定元素不存在,则添加成功。也就是说,若是set中不存在(e==null ? e1==null : e.queals(e1))的元素e1,则e1能添加到set中。mysql

2)具体来说:当向HashSet中添加元素的时候,首先计算元素的hashcode值,而后用这个(元素的hashcode)%(HashMap集合的大小)+1计算出这个元素的存储位置,若是这个位置为空,就将元素添加进去;若是不为空,则用equals方法比较元素是否相等,相等就不添加,不然找一个空位添加。redis

 

二、HashMap和HashTable的主要区别是什么?,二者底层实现的数据结构是什么?算法

三、HashMap什么时候扩容,扩容的算法是什么?spring

HashMap什么时候扩容:sql

当向容器添加元素的时候,会判断当前容器的元素个数,若是大于等于阈值---即当前数组的长度乘以加载因子的值的时候,就要自动扩容数据库

扩容的算法是什么:编程

扩容(resize)就是从新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组没法装载更多的元素时,对象就须要扩大数组的长度,以便能装入更多的元素。固然Java里的数组是没法自动扩容的,方法是使用一个新的数组代替已有的容量小的数组数组

 

四、Java的虚拟机JVM的两个内存:栈内存和对内存的区别是什么?缓存

五、Java中对异常时如何进行分类的?

异常总体分类:

1)Java异常结构中定义有Throwable类。 Exception和Error为其子类。

2)其中Exception表示因为网络故障、文件损坏、设备错误、用户输入非法状况致使的异常;

3)而Error标识Java运行时环境出现的错误,例如:JVM内存耗尽。

 

六、数据库设计中常讲的三范式是指什么?

七、Java中的线程池共有几种?

Java四种线程池

第一种:newCachedThreadPool

  建立一个可根据须要建立新线程的线程池,可是在之前构造的线程可用时将重用它们。

第二种:newFixedThreadPool

  建立一个指定工做线程数量的线程池

第三种:newScheduledThreadPool

建立一个线程池,它可安排在给定延迟后运行命令或者按期地执行。

第四种:newSingleThreadExecutor

  建立一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。

 

八、volatile和synchronized区别

volatile和synchronized简介:

在Java中,为了保证多线程读写数据时保证数据的一致性,能够采用两种方式:

  1)使用synchronized关键字

  2)使用volatile关键字:用一句话归纳volatile,它可以使变量在值发生改变时能尽快地让其余线程知道。

二者的区别:

1)volatile本质是在告诉jvm当前变量在寄存器中的值是不肯定的,须要从主存中读取,synchronized则是锁定当前变量,只有当前线程能够访问该变量,其余线程被阻塞住.

2)volatile仅能使用在变量级别,synchronized则可使用在变量,方法.

3)volatile仅能实现变量的修改可见性,而synchronized则能够保证变量的修改可见性和原子性.

4)volatile不会形成线程的阻塞,而synchronized可能会形成线程的阻塞.

 

九、Spring的特性

1.方便解耦,简化开发

经过Spring提供的IoC容器,咱们能够将对象之间的依赖关系交由Spring进行控制,避免硬编码所形成的过分程序耦合。

2.AOP编程的支持

经过Spring提供的AOP功能,方便进行面向切面的编程。

3.声明事物的支持

在Spring中,咱们能够从单调烦闷的事务管理代码中解脱出来,经过声明式方式灵活地进行事务的管理,提升开发效率和质量。

4.方便程序的测试

能够用非容器依赖的编程方式进行几乎全部的测试工做。例如:Spring对Junit4支持,能够经过注解方便的测试Spring程序。

5.方便集成各类优秀框架

Spring不排斥各类优秀的开源框架,相反,Spring能够下降各类框架的使用难度,Spring提供了对各类优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。

6.下降Java EE API的使用难度

Spring对不少难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,经过Spring的简易封装,这些Java EE API的使用难度大为下降。

 

十、spring aop的应用场景:

AOP用来封装横切关注点,具体能够在下面的场景中使用

Authentication 权限

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading 懒加载

Debugging 调试

logging, tracing, profiling and monitoring 记录跟踪 优化 校准

Performance optimization 性能优化

Persistence 持久化

Resource pooling 资源池

Synchronization 同步

Transactions 事务

 

十一、Mybaits中#和$区别

1)${}是Properties文件中的变量占位符,它能够用于标签属性值和sql内部,属于静态文本替换,好比${driver}会被静态替换为com.mysql.jdbc.Driver。

2)#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值,好比ps.setInt(0, parameterValue),#{item.name}的取值方式为使用反射从参数对象中获取item对象的name属性值,至关于param.getItem().getName()。

 

十二、排序都有哪几种方法?请列举。用JAVA 实现一个快速排序。

排序的方法有:

插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序);

快速排序的伪代码:

//使用快速排序方法对a[ 0 :n- 1 ]排序

从a[ 0 :n- 1 ]中选择一个元素做为middle,该元素为支点;

把余下的元素分割为两段left 和right,使得left 中的元素都小于等于支点,

而right 中的元素都大于等于支点;

递归地使用快速排序方法对left 进行排序;

递归地使用快速排序方法对right 进行排序;

所得结果为left + middle + right。

 

为了更好的让你们应对笔试,除了以上精选笔试题外,还准备了历年来几百道笔试题,包括:(java,spring、数据结构和算法、mybatis、redis、serlvet、jsp等),供你们学习。

相关文章
相关标签/搜索