--答案经过网络整理,难免有重复的内容,感谢各位博主的无私奉献
1. TCP和UDP的区别,哪个是三次握手?
TCP(Transmission Control Protocol 传输控制协议)
UDP(User Datagram Protocol 用户数据包协议)
OSI(Open System Interconnection 开放系统互联)七层参考模型:应用层(表现层,会话层),传输层,网络层,数据链路层,物理层
二者都是OSI(Open System Interconnection 开放系统互联)参考模型中传输层的 协议,其中TCP是三次握手的协议。
二者区别如下:
1)TCP是面向连接的(即建立通信之前需要通过三次握手建立连接);UDP是无连接的(即不负责确认通信对象是否存在)
2)TCP通过一系列的机制提供可靠的服务,保证通过TCP传输的数据无差错,不丢失,不重复,且按序到达;而UDP则只尽最大努力交付数据,不保证可靠性,可能丢包
3)TCP面向字节流,把数据看做一连串无结构的字节流;UDP是面向报文的,应用程序发送多长的报文,UDP就传输多长
4)TCP有拥塞控制机制(流量控制),防止向网络中注入过多的数据,使网络中的路由器和链路不至于过载,保证接收方能够来得及接收数据,而UDP则没有
5)TCP连接只能是一对一的;UDP支持一对一,一对多,多对一和多对的通信
6)TCP要求的系统资源较多,UDP较少
7)TCP首部开销20字节;UDP的首部开销小,只有8个字节
8)应用场景不同,当应用程序要求通讯质量要好,数据要准确无误是,应当使用TCP协议进行传输,如HTTP,FTP等文件传输协议;当应用程序要求通讯速度尽量快,但是对网络质量没有太高要求时,可以使用UDP进行传输,如QQ语音,QQ视频,QQ消息等
2. JDBC操作数据库的步骤。
A.加载数据库驱动
B.建立到数据库的连接
C.定义sql,获取sql执行环境,设置相应的参数
D.执行sql,处理sql执行结果——DML语句返回int, DQL语句返回结果集对象 ResultSet
E.释放资源
3. 字节流,字符流的区别。
1)Java中字节流
a. 所有字节输入流的最大抽象父类是InputStream
b. 所有字节输出流的最大抽象父类是OutputStream
2)Java中字符流
a. 所有字符输入流的最大抽象父类是Reader
b. 所有字符输出流的最大抽象父类是Writer
二者区别:
1)字节流操作的单元为一个字节;字符流操作的单元为两个字节的Unicode码
2) 字节流可以处理任意类型的数据;字符流只能处理文本类型的数据
3)字节流在操作过程中没有用到缓冲区(内存),直接对文件本身进行操作;字符流使用到了缓冲区
4)字节流在写的时候不需要close,也能输出内容;字符流只有在close之后,或者使用flush强制刷新缓冲区之后,才能输出内容(与缓冲区的使用有关)
5)由于字符流有缓冲区,所以字符流的一次操作效率比字节流高
4. 线程的几种状态分别是什么?
1)新建状态(new):将一个继承了Thread或者实现了Runnable接口的线程类,通过new的方式创建一个实例,则此线程就进入了新建状态
2)就绪状态(Runnable):调用线程类的start方法之后,准备了线程所需的系统资源,线程等待CPU的使用权的状态称为就绪状态。
3)运行状态(Running):就绪状态的线程获取到了CPU的使用权之后的状态,即此线程run方法中的代码开始被执行
4)阻塞状态(Blocked):因为某种原因,线程放弃CPU的执行权,直到重新进入就绪状态,阻塞的情况分为以下三种:
A.等待阻塞:线程执行wait方法,释放所有资源(包括同步锁),JVM将其放入“等待池”中,即等待队列。只有在超出等待时间后,或者其他线程调用同一个对象的notify或者notifyAll方法时,才能重新进入就绪状态(Runnable)
说明:等待阻塞由于需要释放所占有的所有资源,包括对象锁,所以必须在同步方法块中调用相应的锁对象的wait方法,否则抛出异常java.lang.IllegalMonitorStateException
B.同步阻塞:线程运行同步的代码时,需要先获取同步锁,则JVM把此线程放入“锁池”中,即进入同步队列
C.其他阻塞:运行的线程执行sleep或join方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep状态超时、join等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
说明:与wait造成的阻塞不同的是,这种阻塞不会释放所占用的资源,即不会释放同步锁
5)死亡状态(Dead):
-当线程出现异常,或者run方法执行完毕,则该线程死亡
-调用一个已经死亡的线程对象的start方法,会产生java.lang.IllegaleThreadStateException异常
5. String,StringBuilder,StringBuffer的区别。
1) String是定长字符串;StringBuilder,StringBuffer是变长字符串
2) StringBuilder是线程非安全,一般用于单线程中,执行效率较StringBuffer高
StringBuffer是线程安全的,如果在多个线程中需要同步则采用此类
6. final, finally, finalize 的区别
1) final是java中的一个关键字,表示最终之意
-修饰类:表示此类不能被继承
-修饰变量:表示此变量必需被初始化,且不能修改值。通常与public static连用表示常量之意
-修饰成员方法:表示此方法不能被重写
说明:final关键字不能和abstract关键字同用
2) finally是在异常捕获中使用到的一个关键字,使用在try/catch块之后,不管最后是否出现异常,必定执行finally中的方法块,可用于释放一些资源,如数据库的连接
3) finalize是java.lang.Object类的成员方法,因此java中所有的类都拥有该方法。该方法是由JVM的GC(GarbageCollector, 垃圾回收器)在判定对象已经不可能再被调用的情况下进行回收是所执行,因此可以通过重写该方法释放一些资源。如果在执行此方法的过程中,抛出了无法捕获的异常,则GC终止回收此对象,但JVM忽略此异常,并不会导致JVM终止
7. 抽象类和接口有什么区别
抽象类 | 接口 | |
类修饰关键字 | abstract | interface |
继承/实现方式 | 单继承/extends | 多实现/implements |
设计思想 | Is-a | Like-a |
成员变量 | 和普通类一样 | 只能是全局的静态常量 |
成员方法 | 和普通类一样,也可以定义一个抽象方法 | 全都是抽象方法 (public abstract) |
构造方法 | 有构造方法 | 没有构造方法 |
对子类的影响 | 新增方法不一定影响子类 | 新增方法一定影响子类 |
注:在jdk1.8中,可以通过default关键字在接口实现默认的方法
8. Statement和PreparedStatement有什么区别?哪个性能更好?
二者区别主要体现在执行效率和安全方面(sql注入问题)
-Statement:每执行一条sql语句就需要生成一条执行计划,不适合批量处理,效率较低
-PreparedStatement:支持带参的sql语句,在执行之前会进行预编译并缓存下来,下次执行相同的sql语句的时候只需要传入相应的参数即可,不需要重新编译,适合批量处理相同的sql语句。
同时避免了用字符串拼接sql语句的sql注入问题,更安全
9. equals与==的区别
==:比较的是存放在栈中对象的堆地址,比较两个变量中存储的对象地址是否相同, 即是否是同一个对象
1)比较操作符两端是否是同一对象
2)两边的操作数必须是同一类型才能编译通过
3)比较的是地址,如果是基本数据类型,则比较值
equals:用来比较两个对象的内容是否相等,是java.lang.Object类的成员方法,由 于所有的类都继承自Object,所以该方法适用于所有对象,但是如果没有重写的话, 则返回的是==的判断结果
另外==的比较效率比equals高
10. hashCode和equals方法的区别与联系
A.区别:
1)hashCode:
- 用来返回对象的哈希码值,用来提高哈希表的性能
- 默认返回对象的内存地址经过计算后的哈希码值
2)equals:
- 用来比较两个对象是否“相等”
- 默认比较两个对象的内存地址
B.联系:
二者都是用来判断对象之间的相等关系的,根据实际业务都需要经过重写。
为保证equals比较的是两个对象的内容是否相同,equals方法的重写需要满足如下几个原则:自反性、对称性、传递性、一致性、非空性。
而hashCode则根据常规协定跟equals方法联系起来:
-同一对象的equals比较的内容没有被改变的前提下,多次调用该对象的hashCode方法返回的整数值应该是一致的
-两个对象通过调用equals方法判断为相等,则二者返回的hashCode应该相等
-两个对象的hashCode值相等,但是调用equals方法并不一定返回true
在设计哈希表相关的set或者map时,需要根据业务需求重写equals方法,同时根据常规协定需要重写hashCode方法,因为这些散列结构都是先判断hashCode值是否相等来判断两个对象是否相等,若hashCode相等,再继续比较equals方法是否相等
注意:在数据已经存储在哈希结构中时,不能修改跟hashCode相关的信息,否则导致内存泄漏的隐患
11. ArrayList和LinkedList的区别。
A. ArrayList
-ArrayList内部采用动态数组的方式实现了List的数据结构
-更适合于查询操作
B. LinkedList
-LinkedList内部采用了循环双向链表数据结构实现List的数据结构
-更适合于增删改操作
12. 转发(forward)和重定向(redirect)的区别?
-转发:
①转发本质上是服务器的一个行为,只有一次请求,一次响应
②浏览器的地址栏地址不会发生改变
③转发过程中共享request和response对象
④转发只在一个web应用程序中进行
-重定向:302+location
当浏览器第一次请求web服务器时,web服务器给浏览器返回了一个302状态码,和一个url地址,当浏览器接收到时,会立即重新对url地址发出请求,服务器再次做出相应的过程叫重定向
①重定向本质上是浏览器上的一个行为,对应两次请求,两次响应
②浏览器的地址栏地址会发生改变
③重定向过程中不共享request和response对象
④重定向不仅可以定位项目内请求,还可以定位到项目外请求
13. get和post请求的区别?
- get请求的请求参数直接放在url中;post请求的请求参数放在请求体中
- get请求携带的数据量一般不超过4k;post请求的数据量一般不受限制
- get请求相对不安全;post请求相对安全
- get请求会连同请求参数被浏览器保存在历史记录里;post则不会
- get请求会有缓存问题;post请求则没有
- get产生一个TCP数据包;post产生两个TCP数据包
14. List和Map的区别
List:是存储单列数据的集合,存储的数据有序且可重复
Map: 是存储双列数据的集合,采用键值对的形式进行存储,存储的数据是无序的,且key不能重复,但是value值可以重复
15. JDK中哪些实现了单例模式?
饿汉式单例模式(在JVM启动时就需要加载的对象采用这种模式):
- Java.lang.Runtime:封装了java的运行时环境信息,由于java是单进程的,每个JVM只对应一个Runtime实例
懒汉式单例模式(需要考虑到线程安全问题,获取单例的方法需要同步):
- java.awt.Toolkit
- java.awt.GraphicsEnvironment
- java.awt.Desktop
16. JSP 和Servlet 有什么关系?
JSP:Java Server Page 同Servlet一样也是运行在服务器端,用来产生动态html响应的。不过与Servlet不同的是,JSP以html内容为主,内嵌少量java代码,JSP为案件的后缀为 .jsp
当浏览器请求服务器上的jsp资源时,jsp先经过转译,形成对应的java文件,java文件经过编译会生成对应的class文件。Web服务器根据class文件生成对应的servlet提供服务
17. jsp的九大内置对象。
内置对象名称 | 类型 | 作用 |
page | Object | 代表jsp页面本身 |
pageContext | PageContext | 封装页面上下文信息 |
request | HttpServletRequest | 封装http请求信息 |
response | HttpServletResponse | 封装http响应信息 |
session | HttpSession | 代表http会话对象 |
application | ServletContext | 封装应用程序信息的对象 |
out | JspWriter | 用来向jsp输出内容 |
config | ServletConfig | 用来封装servlet配置信息的对象 |
exception | Throwable | 封装异常信息的对象 |
18. 怎么认为一个类是线程安全?Java有多少个关键字进行同步?
类是否线程安全的判断
1) 当多个线程访问这个类,如果需要对该类的成员方法进行写操作,则需要考虑线程安全问题
2) 线程安全的对象在不同线程中被调用的时候,在不同的线程看来,其中的操作是以固定且一致的顺序执行的。类似于数据库操作中事务的概念。
Java中进行同步的关键字:
- synchronized:用来修饰成员方法或者代码块,实现加锁,多线程排队执行,重量级同步机制
- volatile:用来修饰成员变量,实现线程之间该成员变量可见,轻量级同步机制
19. JSP中的四种作用域?
pageContext, request, session, application
20. 实现会话跟踪的技术有哪些?
(1) Cookie :基于客户端的状态管理技术
当浏览器请求服务器上的一个服务时,服务器会创建一个Cookie对象,然后以Set-Cookie消息头的方式传递给浏览器。当浏览器再次请求服务器上服务时,会携带这个Cookie对象到服务端,服务端就可以获知上一次的数据状态
(2) Session :基于服务器端的状态管理技术
当浏览器请求服务器某个功能时,服务器可以为这个浏览器分配一块内存,并且在这个内存中创建一个回话对象。同时为这个会话对象分配唯一一个id号,然后将这个id号以cookie的形式传递给浏览器。浏览器再次请求服务器时,会携带这个id到服务器,服务器根据id找到对应的会话对象,进行相应的服务,会话对象可以解决多个请求之间信息共享和状态传递的管理
(3) Url重写:可以解决浏览器禁止cookie的情形
21. 在Java中定义一个不做事且没有参数的构造方法的作用
Java在初始化子类的时候,会用super()调用特定的父类的构造方法,若没有,则会调用父类的无参空构造方法。若父类只定义了有参的构造,且子类又没有调用相应的构造方法,则编译会报错,只能通过在父类加一个无参空构造方法,让编译通过。
22. jsp的常用指令有哪些?
Jsp中指令使用的语法:<%@指令名 属性名1=”值1” 属性名2=”值2”%>
(1) page指令:用来导包 和 做一些页面属性设置
① pageEncoding:用来指定页面以何种编码方式保存
② contentType:用来指定页面以什么格式和编码进行翻译
③ Import:用来导包
④ isErrorPage:该页面是否是一个错误页面,如果是true,则可以使用exception内置对象
⑤ errorPage:用来指定要跳转到的错误页面(在页面报错时)
(2) taglib指令:用来引入对应的标签库
① prefix:用来指定对应标签库的前缀或者简称
② uri:用来指定标签库的位置,或者标识
(3) include指令:用来包含对应的页面
① file:指定包含文件的位置
23. spring中的常见注解有哪些?
(1) 组件扫描相关标注
① 创建相关组件:@Component, @Repository, @Controller, @Service
② 组件扫描相关的其他标注:@Scope(“singleton|prototype”), @PostConstruct, @PreDestroy
③ DI相关标注
1) @Value : 可以用在成员变量和set方法上,基本值直接在标注写值,如果是复杂值,则需要用到spring的EL表达式#{}
2) @Autowired : 可以用在成员变量,set方法和构造方法上,优先使用类型进行匹配,如果类型有冲突,则启用名字进行匹配(参数名,成员变量名)
@Qualifier(“容器中的对象名”):配合@Autowired 指定名字进行查找,但是只能用在成员变量和set方法上
3) @Resource:用在成员变量和set方法上,优先使用名字进行匹配,如果匹配不上,则使用类型进行匹配,属于jdk中的标注
④ @Transactional属性 : 控制事务管理
(2) Spring MVC相关标注
① @RequestMapping(“/路径”) :匹配请求路径(加载控制器方法上)
② @RequestParam(“name”) :指定形参要接收的参数
③ @ExceptionHandler :定义局部异常处理的方法
④ @RequestBody : 告知spring框架,返回的是一个json格式的数据
⑤ @PathVariable(“路径变量名”) :搭建Restful应用时,指定路径变量用
⑥ @RequestBody :把浏览器上传的json数据转换成java对象
(3) Spring AOP相关标注
① @Aspect :在标注形式aop中指明该类为切面类
② @Before :前置通知
③ @After :最终通知
④ @AfterReturnning :后置通知
⑤ @Around :环绕通知
⑥ @AfterThrowing :异常通知
24. i++和+ +i的区别
i++:后加加,在表达式中,变量i先参与运算,再完成自增加1
++i:前加加,在表达式中,变量i先完成自增1,再参与运算
25. springmvc的运行原理
(1) DispatcherServlet作为请求的入口,客户端所有的请求都要经过它
(2) DispatcherServlet控制器通过查询HandlerMapping找到请求对应的Controller
(3) DispatcherServlet将请求提交到Controller,
(4) Controller调用业务逻辑处理之后,返回ModelAndView(其中封装了数据信息和视图信息)
(5) DispatcherServlet查询ViewResolver根据ModelAndView找到对应的视图展示数据
26. Servlet的生命周期
1)创建
-默认在第一次请求到来时创建
-也可以通过在web.xml配置文件中,通过
<load-on-startup>一个大于等于0的值</load-on-startup>标记,实现服务器启动时创建
2)初始化
-对象创建完成后,调用void init();方法完成初始化
3)不断地提供服务
通过
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException
这三个方法不断地向外提供服务
4)即将消亡
调用void destroy();方法
5)消亡
27. 什么是IoC和DI?DI是如何实现的?
(1) IoC:Inversion of Control , 控制反转,程序中需要某个对象时,由原来new方式,变成了由容器来进行创建、管理和维护组件关系。这样做的好处是可以大大降低组件之间的耦合度
(2) DI:Dependency Injection ,依赖注入, 用以解决组件的装配问题
(3) DI的实现方式:DI是通过反射来实现动态注入的,主要有以下几种注入方式
① Setter注入
② 构造器注入
③ 自动化注入
28. 解释一下什么叫AOP(面向切面编程)[spring中]?
AOP(Aspect Oriented Programming 面向切面编程)是基于OOP的,可以在不修改原有代码的情况下增加功能,通过spring的配置,可以将共通的处理代码添加到切面位置,实现了组件的重复利用,将共通组件与目标对象解耦,提高了程序灵活性。
AOP相关概念;
(1) Aspect :切面,封装了共通的业务逻辑的类
(2) Join Point :连接点,切面作用的位置
(3) Pointcut :切点,连接点的集合,通过切点表达式确定作用的位置
(4) Advice :通知,共通业务逻辑调用的时机,有前置通知,后置通知,最终通知,环绕通知,异常通知
(5) Target :目标对象,要加入切面的对象
(6) Proxy :代理对象,加入切面之后的对象,有jdk的代理和CGLIB两种代理
29. mybatis框架构成和原理。
1) Mybatis框架主要由以下几个方面构成
A.实体类——根据表设计的实体类
B.主配置文件——定义了连接数据库的信息(mybatis自带连接池),和加载sql定义 文件
C.sql定义文件——定义sql语句
D.mybatis框架api——主要是通过SqlSession来体现
2)mybatis原理
Mybatis应用程序根据主配置文件创建SqlSessionFactory对象,里面加载了连接池和sql定义文件的信息,根据SqlSessionFactory创建SqlSession对象,利用SqlSession的api完成相应的持久层操作