java笔试 - 套题(2)

1、switch 是否能够作用在 byte 上,是否能作用在 long 上,是否能作用在String上?(根据 java 版本类回答)

早期的JDK中,switch(expr)中,expr可以是byte、short、char、int。(byte,short,char 隐式转换为int)
从1.5版开始,Java中引入了枚举类型(enum),expr也可以是枚举;
从JDK 1.7版开始,还可以是字符串(String)。长整型(long)是不可以的。

2、JDK1.8 有哪些特性?

Lambda表达式:Lambda允许函数作为参数传递到方法中。
方法引用:可以直接引用已有Java类或对象的方法或构造器。
Date Time API:加强对日期与时间的处理。
Optional类:用来解决空指针异常。
JavaScript引擎:允许程序在JVM上运行特定的javascript应用。
默认方法:可以理解为一个在接口里面有了一个实现的方法。
新工具:加入像是Nashorn引擎 jjs、 类依赖分析器jdeps的新的编译工具。
Stream API:可以把函数式编程风格引入到Java中。

3、什么是事务,有哪些特征?

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
事务是恢复和并发控制的基本单位。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

4、css 中有哪些选择器,一一举例并说明

1、元素选择器;2、id选择器;3、类选择器;4、分组选择器(并集选择器);5、复合选择器(交集选择器);6、通配选择器;7、后代元素选择器;8、子元素选择;9、伪类选择器;10、属性选择器;11、兄弟元素选择器。
CSS 选择器 | 菜鸟教程

5、请写出打印的结果并说明为什么
(function(){var a = b = 5;console.log(typeof a);console.log(typeof b);})();
console.log(typeof a);console.log(typeof b);

打印number、number、underfind、number
var a=b=5;其实是分成var a=(b=5),a是函数内的变量,在外面调用不到,未声明所以是undefind,而b=5这个其实是window.b=5,是一个全局变量,所以是number

6、js 中“==”与“===”(双等号与三等号)的区别

"==" 叫做相等运算符,只判断等号两边的值是否相等,而不判断类型是否相同。值相同则返回 true
"===" 叫做严格相等运算符(全等运算符),既要判断值是否相等,也要判断类型是否相同,即全等才能返回 true
js是javascript的缩写,JSP全名为Java Server Pages

7、编写一个 singleton(单例)出来

    //饿汉式
    //1,创建静态的全局唯一的对象
    private static SingleTonTest singleTonTest = new SingleTonTest();
    //2,私有构造方法,不让外部来调用
    private SingleTonTest(){};
    //3,通过自定义的静态方法获取实例
    public static SingleTonTest getSingleTonTest(){
        return singleTonTest;
    }

8、如果有两个类 A、B(注意不是接口),你想同时使用这两个类的功能,那么你会如何编写这个 C 类呢?

因为类A、B不是接口,所以是不可以直接实现的,但可以将A、B类定义成父子类,那么C类就能实现A、B类的功能了。假如A为B的父类,B为C的父类,此时C就能使用A、B的功能。

9、Spring Mvc 工作原理(文字简答或者画图均可)?

1,用户发送请求至前端控制器DispatcherServlet
2,DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3,处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4,DispatcherServlet通过HandlerAdapter处理器
适配器调用处理器
5,执行处理器(Controller,也叫后端控制器)。
6,Controller执行完成返回ModelAndView
7,HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8,DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9,ViewReslover解析后返回具体View
10,DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11,DispatcherServlet响应用户

10、AOP 是怎么实现的?

面向切面编程(AOP),通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

  1.  cglib库实现,对 Java字节码进行重新编译,将切面插入宇节码的某些点和面上 。
  2. · 定制类加载器,在类加载时对字节码进行补充,在字节码中插入切面,增加了除业务逻 辑外的功能, JVM 自身提供的 Java Agent 机制就是在加载类的宇节码时,通过增加切 面来实现 AOP 的。JVM 本身提供了动态代理组件,可以通过它实现任意对象的代理模式,在代理的过程中可 以插入切面的逻辑。可以使用 Java提供的 APIProxy.newProxylnstanceO和 InvocationHandler 来实现。
  3.  AspectJ是实现 AOP 的专业框架和平台,通过 AspectJ可以实现任意方式的字节码切 面, Spring框架完全支持 AspectJ。

11、IOC 和 DI 是什么以及区别?

IOC的意思是控制反转,DI的意思是依赖注入 ,前者是目的更偏向于实际操作相比于传统的通过new的方式来创建对象并手动的为属性赋值这些行为完全交于程序员控制,IOC则是把创建对象并给对象中的属性赋值交由sprin工厂管理,从而达到控制反转的目的 而后者则是通过依赖注入的手段让spring工厂来管理对象的创建和属性的赋值 。

12、@ResponseBody 和 @RequestBody 的区别

一、@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
二、@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。

13、GET 和 Post 的区别?

GET把参数放在URL里面,而POST放在请求体(request body)中
GET在浏览器回退时候是无害的,而POST会再次请求
GET请求只能进行url编码,而POST可以支持多种编码
GET请求在URL中传递的参数是有长度限制的,而POST没有
GET请求的参数会被完整保存在浏览器历史记录里面,而POST参数不会被保留
GET请求的参数类型只接受ASCII字符,而POST没有限制
GET请求没有POST请求安全,因为参数直接暴露在URL上面 所以不能用来传递敏感信息
GET请求会被浏览器主动cache,而POST不会,除非手动设置
GET产生的URL地址可以被Bookmarks,而POST不可以

14、HaspMap 是怎么实现的?

首先,当我们通过HashMap的构造方法创建一个HashMap对象时,底层就会创建一个Entry类型的一维数组(默认初始化长度为16)。当我们执行put操作的时候,会调用key所属类的hashCode方法计算出key的hash值,然后将hash值通过哈希函数计算出更加复杂的hash值,再将算出的hash值和数组长度进行&运算(位运算的一种),获得当前put进来的数据要在Entry数组中存放的位置。然后就去数组上找这个位置,此时有两种情况:

一是该数组位置上是空的,此时直接将put进来的键值对存放在数组的该位置上。

二是该数组位置上不为空(说明此位置上已经存放了一个或多个元素,通过链表的方式),已经有元素了(这种现象称为哈希冲突,即哈希函数算出来的地址被别的元素占用了)。此时就需要将put进来的key的哈希值和该位置上存放的所有元素的key的哈希值逐一进行比较。这里又有两种情况:

  1.哈希值都不同:此时就可以认为put进来的键值对是一个新的元素,继续以链表的形式存储。

  2.哈希值相同:注意,哈希值相同并不能就确定他们是相同的对象,还需要调用他们的key中的equals方法进一步进行比较,这里又有两种情况

    a.两个key进行equals后返回true,则证明这两个key是相同的。map不允许存储相同的key,于是会把原来的value,替换为put进来的value值。

    b.两个key进行equals后返回false,则证明这两个key是不同的,继续以链表的形式存储put进来的键值对。

当数组的某一个索引位置上的元素以链表形式存在的数据个数>8且当前数组的长度>64时,此时此素引位置上的所有数据改为使用红黑树存储

15、mybatis 中 namespace 有什么作用?

1.namespace是映射文件唯一标识,不允许重复
2.在配置是应该和mybatis的客户端(Mapper接口文件)路径保持一致
3.映射文件中的id,应该和解决放到名称一一对应

16、mybatis 中有哪些标签?

java基础 - Mybatis常用标签_森!!仔的博客-CSDN博客

17、JVM 内存模型以及如何调优(简答说明,可以画图)

JVM内存模型及调优_疯狂-小子的博客-CSDN博客_jvm内存模型及调优

18、Sql 如何调优?

数据库 - SQL优化_森!!仔的博客-CSDN博客

19、left join、right join 和 join 的区别

left join:以左数据表为基表,把左表中的全部信息输出,然后搜索右表中符号条件的记录,查出来的结果是左边的所有数据和与左边有交集部分的数据

right join:以右数据表为基表,把右表中的全部信息输出,然后搜索左表中符号条件的记录,查出来的结果是右边的所有数据和与右边有交集部分的数据

20、Order by、group by 以及 having 的区别和用法

1,group by(分组(聚合))必须有“聚合函数”来配合,如sum()、count()、avg()、min()、max()等
2,在sql命令格式使用的先后顺序上,group by 先于 order by执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效。要查出group by中最大的或最小的某一字段使用 max或min函数
3,使用group by 的目的就是要将数据分类汇总,在Sql中group by 是按字段分类
4,where不能使用聚合函数,但是where和Group by可同时出现,先限制条件后分组
1,having (过滤),在分完组之后,再对分组数据进行过滤。
2,having 只能用于group by子句、作用于组内,having条件子句可以直接跟函数表达式。
1,order by(排序)后面必须列出排序的字段名,还可以采用多个字段排序,需要用”,”把字段隔开,如果根据第一个字段排序重复了,会根据第二个字段排序。在Sql中也可以说order by是按字段排序

21、存储过程和视图的区别

1、范围不同:
存储过程:范围要广很多。存储过程和视图都是相当于执行一段已经编译好的sql脚本 而区别在与存储过程可以提供参数、输入参数 以及每次返回多个表数据

视图:一次只能返回一个二维表的数据 且不能接受 任何参数。

2、目的不同:
存储过程:往往涉及很多的数据处理,是一个复杂的过程,它相当于一个函数可以接受参数,主要用于处理数据;

视图:把现有数据以新的形式展现出来,最终目的是为了呈现数据。

3:总结:

视图就是张虚拟表,可以像对真实表一样对其进行操作,而存储过程是一组sql语句的批处理

22、为什么需要缓存?常用的缓存有哪些、以及淘汰策略有哪些?

因为我们从磁盘中读取文件的速度相较于读取内存中的数据的速度是比较慢的,因此我们将常用的数据存入内存中(我们称之为缓存),以此来加快数据的读取速度。

不管是本地缓存还是分布式缓存,为了保证系统的高性能和高可用,都是使用内存来存储数据的。随着时间的推移,缓存的数据越来越多,由于成本和内存的限制,当存储的数据超过缓存最大容量时,需要对缓存的数据进行淘汰。常用的缓存淘汰策略有FIFO(先进先出算法)、LFU(Least Frequently Used)、LRU(Least Recently Used)等。

23、动态代理和静态代理的区别

静态代理:一个代理只能服务于一种类型的对象,当有1000个业务时,需要1000个静态代理,不利于业务的扩展。

动态代理:一个代理类可以服务于所有的业务对象。

人无完人,接受指点与反驳,森!!仔

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值