个人评价
很简单的面试题,纯纯的八股文,项目没有问。就是异常有哪些分类这个知识点忘记了。
1.Java的基本类型有哪些呢?
最常用的就是 char,int, double,float,short,byte等等。
2.String不是基础类型吗?
不是基础类型它是一个内部类,底层使用固定长度char数组来实现的,在做数据拼接的时候使用StringBuilder做拼接的。也就是在做数据的拼接的时候都会创建一个StringBuilder,调用append方法拼接最终通过toString返回对应的字符串。
3.String对象是怎么比较的?如果两个引用类型的数据那又是怎么比较的呢?
String对象主要就是使用方法equals方法来比较的,String对equals进行了重写,在没有进行重写是其底层就是通过==来进行判断的,重写后的equals只比较对象中值是否相等。如果是两个引用进行比较的话就是使用==判断两个数据的引用地址是否相同。
4.Java是单继承还是多继承呢?
Java是单继承机制,也就是在子类只能继承一个父类,但是呢,在接口的实现上是支持多实现的。
5.一个程序我们要确定其错误位置要怎么做呢?如果直接出现异常的话怎么保证正常的执行呢?
在我定位错误的时候只要通过打印及查询日志+DeBug来实现的,在出现的异常的位置我们使用 try/catch进行捕获在合适的位置进行throw抛出即可保证代码的远行。
*6.异常有哪些?
主要就是分为 Exception和Error。
Exception又分为运行时异常和检查异常,运行时异常常见就是NullPointerException等异常。检查异常就是需要被try/catch包裹否则程序无法正常运行,包括 ioException, SQLException。
Error会在运行的时候发生,常见的内存不足异常OutofMemoryError,ThreadDeath等等。
7.使用原生的JDBC创建一个连接,如果出现程序异常的话,我们该怎么关闭资源池呢?
我们在创建连接的时候只要就是创建一个SqlSession会话进行操作,在调用创建会话的时候我们会使用try/catch进行包裹,在正常情况下我们会在finally中调用close方法,在捕获到遗产的时候会调用SqlSession.close方法来关闭sql会话。
8.catch中的代码一定会执行吗?
catch是配合try使用的,在执行try中的方法后,如果出现catch指定的异常类的时候就会执行catch中的方法。
9.Java里面的线程是怎么使用的呢?
相同默认就是使用单线程执行相应的方法,我们可以手动创建线程池来使用多线程执行任务。创建线程池只要就是使用ThreadPoolExcutor进行创建,它有七个参数,总线程数,核心线程数,救急线程存活时间,存活时间的单位,堵塞队列,拒绝策略,线程工厂。阻塞队列又分为ArrayBlockQueue和LinkedBlockQueue,拒绝策略有四种,报错策略,使用主线程执行策略,清除阻塞队列中 存活时间最长的任务策略,直接丢弃策略。
10.把外部的引用传递到匿名内部类中,在内部类中修改这个引用,会不会对原引用有影响呢?修改引用的值呢?
如果我们修改引用对象中属性值的时候外部的对象会受到影响,如果我们直接修改引用值得话,外部的对象不会受到影响。因为此时我们是修改引用地址。
11.SSM和SpringBoot中常用的直接有哪些呢?
- SpringMVC中常用的注解就是RequsetMappering,四种不同请求方式的mappering,对应的路径参数pathValue,@Session等等。
- Spring中主要就是ioc和aop的注解,ioc就是@AutoWried,@Qualifer,@Bean等等,aop主要就是@aspect和不同的环绕通知,就比如@around,@After,@Before。
- SpringBoot中常用的注解就是就是这个SpringBootApplication注解,其中有主动加载注解,@EnableAutoConfiguration实现对应类的自动加载。
12.@ReponseBody返回的类型数据是什么?
返回的是Json字符串类型的数据,其主要就是使用在前后端分离的项目中,@ReponseBody就保证了SpringMVC执行流程中在处理器适配器中不再返回modelAndView而是直接返回json数据给前端。
13.你刚刚说到这个SpringMVC的执行流程,那你具体讲一下这个流程吧?
我们先讲一下前后端不分离的版本吧,请求会先进入DispatchServlet中,DS会携带请求到处理器映射器中,在Controller层中找到对应的方法返回执行连给DS,DS携带执行连到处理器适配器中,执行方法及处理返回结果,将ModelAndView返回给DS,DS携带MV到视图解析器中,最终将数据渲染到前端。前后端分离就是在处理器适配器执行后直接返回json数据给前端。
14.sleep()和wait方法有什么区别?
- 方法的归属地方面,sleep是thread中的方法,wait()是Object中的方法。
- 方法的使用方面,wait()方法必须配合Synchronzied使用,而sleep方法则不需要。
- 方法的作用方面,wait方法需要被notify方法或者notifyAll方法唤醒,而sleep方法会在对应的时间后自动唤醒。
- wait方法在睡眠的时候会放弃cpu的使用权应许其他线程获取对象锁,而sleep方法则不允许其他线程获取对象锁。
15.Mybtis中#{}和${}的区别?
- 前者是做数据的替换,而后者是做字符串的拼接。
- 前者的数据的替换发生在DBAS之中,而后者发生在DBAS之外。
- 前者在做数据拼接的时候会自动添加'',而后者不会。
- 前者可以防止SQL注入,后者不行。
16.redis使用过哪些数据结构呢?
- String结构主要就是作为缓存的时候使用,其中bitMap用来做过签到模块。
- Hash结构主要就是在拒绝重复提交观看位置的问题的时候使用还有redisson的锁的实现。
- set和zset结构就是在网课项目中的点赞模块中使用。
- list主要就是在物流项目中合并运单的模块中配合set使用。
17.left join,inner join,right join有上面区别?
左连接在做表关联的时候以左表作为去驱动,而右连接就是以右表作为驱动,内连接就是以小表为驱动。
18.user表(id...),order表(id,user_id...)查询哪些用户没有购买过商品?
SELECT * FROM `user` WHERE `user`.`user_id` NOT IN (SELECT `user_id` FROM `order` GROUP BY `order`.`user_id`)
19.基于刚刚的场景使用关联表怎么实现?
SELECT * FROM `user` WHERE `user`.`user_id` NOT IN (SELECT user.`user_id` FROM `user` RIGHT JOIN `order` ON `user`.`user_id`=`order`.`user_id`)