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

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

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

 

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

3、HashMap何时扩容,扩容的算法是什么?

HashMap何时扩容:

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

扩容的算法是什么:

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

 

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

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

异常整体分类:

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

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

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

 

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

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

Java四种线程池

第一种:newCachedThreadPool

  创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。

第二种:newFixedThreadPool

  创建一个指定工作线程数量的线程池

第三种:newScheduledThreadPool

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

第四种:newSingleThreadExecutor

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

 

8、volatile和synchronized区别

volatile和synchronized简介:

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

  1)使用synchronized关键字

  2)使用volatile关键字:用一句话概括volatile,它能够使变量在值发生改变时能尽快地让其他线程知道。

两者的区别:

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

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

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

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

 

9、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的使用难度大为降低。

 

10、spring aop的应用场景:

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

Authentication 权限

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading 懒加载

Debugging 调试

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

Performance optimization 性能优化

Persistence 持久化

Resource pooling 资源池

Synchronization 同步

Transactions 事务

 

11、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()。

 

12、排序都有哪几种方法?请列举。用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等),供大家学习。