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. 抽象类和接口有什么差异
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的九大内置工具。
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完成相应的持久层操作