java面试问题

基础问题

1.List集合和Set集合的区别

List中元素放入是有顺序的,可以重复。Set去除重复元素,无序的,重复元素会覆盖掉。
Set检索效率低,删除和插入效率高,插入和删除不会引起元素位置的改变;而List和数组类似,可以动态增长,查找效率高,插入和删除效率低,会引起元素位置的改变。

2.List、Set和Map能否储存null值

List都可以添加null元素
HashMap可以有1个key为null的元素,TreeMap不能有key为null的元素
Set底层是Map,所以HashSet可以有1个null的元素,TreeSet不能有key为null的元素
Vector 底层是数组,所以不会管你元素的内容是什么,可以存储多个null
HashTable底层为散列表,无论是key为null,还是value为null,都会报错

3.HashMap中put一个键值对(k1,v1),然后再put一个键值对(k1,v2),那么根据键k1取值时取得是v1还是v2?(即HashMap中相同键的值是否会覆盖)

如果key相同,但是hashcode不同,那么value不会被覆盖;
如果key相同,hashcode也相同,那么value会被覆盖

4.如果两个对象hashcode值相同,那么调用equals方法比较,返回true还是false?

两个对象equals相等,则它们的hashcode必须相等,反之则不一定。
默认情况下:
		两个对象==相等,则其hashcode一定相等,反之不一定成立。
		两个对象equals相等,则其hashcode一定相等,反之不一定成立。
按满足hashcode的常规协定重写的情况下:
	两个对象equals相等,则它们的hashcode必须相等,反之则不一定。
	两个对象==相等,则它们的hashcode必须相等,反之则不一定。

5.HashMap的底层是如何实现的

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

6.创建线程的方式

(1)继承Thread类;
(2)实现Runnable接口;
(3)实现Callable接口;
(4)使用线程池创建

7.常用的线程池

(1)newFixedThreadPool:它创建了一个固定大小的线程池,每次提交一个任务就创建一个线程,直到线程达到线程池的最大值nThreads。线程池的大小一旦达到最大值后,再有新的任务提交时则放入无界阻塞队列中,等到有线程空闲时,再从队列中取出任务继续执行。
(2)newCachedThreadPool:它创建了一个可缓存的线程池。当有新的任务提交时,有空闲线程则直接处理任务,没有空闲线程则创建新的线程处理任务,队列中不储存任务。线程池不对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。如果线程空闲时间超过了60秒就会被回收。
(3)newSingleThreadExecutor:它创建了一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行。
(4)newScheduledThreadPool:这个方法创建了一个固定大小的线程池,支持定时及周期性任务执行。

8.“用户-角色-权限”表如何设计,列出其中主要字符段

三张表(用户表,角色表,权限表),两个多对多关系,所以总共是5张表,主要字符段如下:
(1)用户表:用户ID,用户名
(2)用户角色表:ID,用户ID,角色ID
(3)角色表:角色ID,角色名
(4)角色权限表:ID,角色ID,权限ID
(5)权限表:权限ID,权限名

Web知识

1.redis的5种数据类型

(1)string:字符串
(2)hash:哈希
(3)list:列表
(4)set:集合
(5)zset:sorted set——有序集合

2.tomcat如何改变访问端口

找到tomcat存放路径,找到conf文件夹,找到server.xml文件
(1)shutdown端口:如果电脑只是运行一个tomcat,【ShutDown】端口不需要修改,默认即可
(2)http访问端口:负责建立HTTP连接,通过浏览器访问web应用;如果启动tomcat出现端口冲突时,需要修改访问端口
(3)AJP协议访问端口:负责与其他服务器建立连接使用

3.servlet生命周期(调用的哪些方法)

1.加载和实例化
	Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。
2.初始化
	在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象。
	何时初始化:
		①当web.xml中不配置load-on-startup属性,或者配置该属性且值为负数时,servlet在有请求的时候才会初始化。
		②当load-on-startup属性值大于等于0的时候,servlet会在启动的时候就初始化。
3.请求处理
	Servlet容器调用Servlet的service()方法对请求进行处理。要注意的是,在service()方法调用之前,init()方法必须成功执行。
4.服务终止
	当容器检测到一个Servlet实例应该从服务中被移除的时候,容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源,保存数据到持久存储设备中。当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建一个新的Servlet实例。
	
注:在整个Servlet的生命周期过程中,创建Servlet实例、调用实例的init()和destroy()方法都只进行一次,当初始化完成后,Servlet容器会将该实例保存在内存中,通过调用它的service()方法,为接收到的请求服务。

4.servlet如何配置访问路径

xml的<url-pattern>的配置方式:
(1)完全路径匹配
		以 / 开始比如:/ServletDemo1         /aaa/ServletDemo2
(2)目录匹配
		以 / 开始,以 /*结束比如:/*      /aaa/*      /aaa/bbb/*
(3)扩展名匹配
		不能以 / 开始,以*开始比如:*.action           *.do             *.jsp
		
访问优先级:完全路径匹配  >  目录匹配  >  扩展名匹配

注解配置方式:xml文件中配置注解生效,然后在Servlet类上贴上WebServlet("/ServletDemo1")注解

5.Spring中常用到的注解

(1)@Controller:标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象.
(2)@RestController:Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式。
(3)@Service:用于标注业务层组件,说白了就是加入你有一个用注解的方式把这个类注入到spring配置中
(4)@Autowired:用来装配bean,都可以写在字段上,或者方法上。默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如:@Autowired(required=false)
(5)@RequestMapping
			类定义处: 提供初步的请求映射信息,相对于 WEB 应用的根目录。
			方法处: 提供进一步的细分映射信息,相对于类定义处的 URL。
(6)@Scope:用来配置 spring bean 的作用域,它标识 bean 的作用域。
(7)@Repository:用于标注数据访问组件,即DAO组件

6.过滤器Filter的作用以及使用的一些场合

Filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目 标资源访问前后进行逻辑处理

使用场合:
	防止未登录就进入界面
	控制应用编码
	过滤敏感词汇等场景

7.js如何调用Ajax,提交方式是异步还是同步,若是异步,如何设置成同步的?

原生js调用Ajax暂不讨论,了解即可
使用JQuery调用Ajax:$.get();$.post()
jquery的$.Ajax中存在async这个属性 :默认是true:异步;false:同步。

8.Spring和MyBatis如何整合的

(1)导入相关Jar包
(2)配置MyBatis核心配置文件
(3)配置Spring配置文件:数据源和会话工厂
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值