面试题--Java(一)

转载自 《2018java程序员面试题整理》

1.Springmvc独有的5个注解

1)@Controller

@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法。通俗来说,被Controller标记的类就是一个控制器,这个类中的方法,就是相应的动作。

2)@RequestMapping

既可以作用在类级别,也可以作用在方法级别。当它定义在类级别时,标明该控制器处理所有的请求都被映射到 /favsoft 路径下。@RequestMapping中可以使用 method 属性标记其所接受的方法类型,如果不指定方法类型的话,可以使用 HTTP GET/POST 方法请求数据,但是一旦指定方法类型,就只能使用该类型获取数据。

3)@PathVariable

获取路径变量 与requestMapping(“{value}”)配合使用

4)@RequestParam

获取携带参数 与requestMapping(“{value}”)配合使用

5)@RequestBody

获取请求体

6)@ResponseBody

将返回结果作为响应体

7)@RestController

Responbody + Controller

8)@HttpEntity

HttpEntity除了能获得request请求和response响应之外,它还能访问请求和响应头

9)@ModelAttribute

在hibernate里也有

2.IOC容器的理解

IoC—Inversion of Control,即“控制反转”,不是什么技术,是一种设计思想

IoC意味着将设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

3.请谈谈你对AOP的理解。

AOP:Aspect Oriented Programming 面向切面编程。它是为解耦而生的。

如果多个类中出现相同的代码,应该考虑定义一个共同的抽象类,将这些相同的代码提取到抽象类中。

如果我们需要日志记录,它在方法调用前启动,在方法调用返回前结束,并在内部记录结果信息。(模板抽象设计模式)

Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。

Spring创建代理的规则为:

1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了
2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB

4.请说说HTTP协议中GET请求和POST请求的区别。

HTTP全称为Hyper Text Transfer Protocol,浏览器和服务器的交互是通过HTTP协议执行的,而GET和POST也是HTTP协议中的两种方法。GET,POST,PUT,DELETE

GET:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。

GET交互方式是安全的,GET交互方式是从服务器上获取数据,而并非修改数据

GET交互方式是幂等的,对同一个URL的多个请求,得到的结果是相同的。就像数据库查询,不同的数据库连接对同一个数据库表用相同条件查询时,得到的结果也是一样的
POST:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。

涉及到信息的修改,就会有安全问题 /post不是幂等的 delete和put是幂等的

一般的POST交互是必须要用到表单的,但是表单提交的默认方法是GET,如果改为POST方式,就需要修改表单提交时的Method。

GET方式:

1、GET方式是以实体的方式得到由请求URL所指定资源的信息,如果请求URL只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述。
   也就是说,GET的到的信息是资源,而不是资源的处理过程。
2、请的求的数据会附加在URL之后,以?分隔URL和传输数据,多个参数用&连接。
   URL编码格式采用的是ASCII编码,而不是Unicode,即所有的非ASCII字符都要编码之后再传输。
3、因为URL的长度限制,GET方式传输的数据大小有所限制,传送的数据量不超过2KB。
4、GET方式服务器端用Request.QueryString获取变量的值。
5、GET方式传输的参数安全性低,因为传输的数据会显示在请求的URL中。

POST方式:

1、用来向目的服务器发出请求,要求它接收被附在请求后的实体,并把它当做请求队列中请求URL所指定资源的附加新子项。
2、POST方式将表单内各个字段和内容放置在HTML HEADER中一起传送到Action属性所指定的URL地址,用户是看不到这个过程的。
3、POST方式传送的数据量比较大,一般被默认为没有限制,但是根据IIS的配置,传输量也是不同的。
4、POST方式在服务器端用Request.Form获取提交的数据。
5、POST方式传输的数据安全性较高,因为数据传输不是明显显示的。

5.请介绍一下Cookie和Session的工作原理。

session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。

session默认需要借助cookie才能正常工作。如果客户端完全禁止cookie,session这种方法将失效。

session在用户会话结束后就会关闭了,但cookie因为保存在客户端,可以长期保存

简单的说,当你登录一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存在服务器上面,客户端每次请求服务器的时候会发送 当前会话的sessionid,服务器根据当前sessionid判断相应的用户数据标志,以确定用户是否登录,或具有某种权限。由于数据是存储在服务器上面,所以你不能伪造,但是如果你能够获取某个登录用户的sessionid,用特殊的浏览器伪造该用户的请求也是能够成功的。sessionid是服务器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请求,也不是没有重复的可能性,我曾经就遇到过一次。登录某个网站,开始显示的是自己的信息,等一段时间超时了,一刷新,居然显示了别人的信息。
.
如果浏览器使用的是 cookie,那么所有的数据都保存在浏览器端,比如你登录以后,服务器设置了 cookie用户名(username),那么,当你再次请求服务器的时候,浏览器会将username一块发送给服务器,这些变量有一定的特殊标记。服 务器会解释为 cookie变量。所以只要不关闭浏览器,那么 cookie变量便一直是有效的,所以能够保证长时间不掉线。

6.Linux系统中如何通过命令查看进程?如何在这个基础上查看具体某一个进程?

ps -aux 显示所有进程  ps -ef

Ps -aux |grep mysql 查看某个进程

netstat -anp|grep 3306  查看进程id对应的程序

7.Linux系统中如何对一个tar包解压缩?

压缩  tar -zcvf [压缩包文件名] [要压缩的内容]

解压缩:解压到当前目录下

tar -zxvf [压缩包文件名]

unzip [压缩包文件名]

8.请介绍一下数据库事务的ACID属性。

1)原子性(Atomicity)

所谓原子性就是将一组操作作为一个操作单元,是原子操作,即要么全部执行,要么全部不执行。不可再分

2)一致性(Consistency)

事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。

3)隔离性(Isolation)

隔离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。

4)持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。即一旦一个事务提交,DBMS(Database Management System)保证它对数据库中数据的改变应该是永久性的,持久性通过数据库备份和恢复来保证。

9.请说说List集合和Set集合的区别。

1.List,Set都是继承自Collection接口,Map则不是

2.List特点:元素有放入顺序,元素可重复
   Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉
   注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set的Object必须定义equals()方法,
   另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。

3.SetList对比:

Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。

List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

4.Map适合储存键值对的数据

5.线程安全集合类与非线程安全集合类

LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;

HashMap是非线程安全的,HashTable是线程安全的;

StringBuilder是非线程安全的,StringBuffer是线程安全的。

10.Maven工程的坐标由哪三个部分构成?Maven坐标的用途是什么?

1、groupId

顾名思义,这个应该是公司名或是组织名。一般来说groupId是由三个部分组成,每个部分之间以”.”分隔,第一部分是项目用途,比如用于商业的就是”com”,用于非营利性组织的就是”org”;第二部分是公司名,比如”tengxun”、”baidu”、”alibaba”;第三部分是你的项目名

2、artifactId

可以认为是Maven构建的项目名,比如你的项目中有子项目,就可以使用”项目名-子项目名”的命名方式

3、version

版本号,SNAPSHOT意为快照,说明该项目还在开发中,是不稳定的版本。在Maven中很重要的一点是,groupId、artifactId、version三个元素生成了一个Maven项目的基本坐标,这非常重要,我在使用和研究Maven的时候多次感受到了这点。

  0.0.1:版本号
      大版本(主版本).中版本(分支版本).小版本(迭代版本)
      大版本:(项目架构发生变化,设计发生变化,模块有重新组织)
      中版本:(有模块上的修改,新增了功能)
      小版本:(解决了很多bug以后,升级一下小版本);    
  RELEASE:正式发布版(经过测试基本没有bug,可以稳定使用)
  SNAPSHOT:快照版;(这是一个非常不稳定的版本,经常发生变化)
  Alpha:(内测版)
  Beta:(公测版)

你可能感兴趣的:(面试题--Java(一))