java面试题答案总结整理

不定时更新

----------------------------------------------------2019.4.4----------------------------------------------------------

1.java内部类与外部类:
1>.非静态内部类与外部类:
隐式含有外部类所有变量与方法;外部类调用内部类的时候:外部类实例.new 内部类();
2>.静态内部类与外部类:
只能调用外部类的静态变量和方法;外部类调用内部类时:new 内部类();
2.String s = new String(“xyz”);:
两个对象,三个存储区:静态区(“xyz”),堆(new出的对象),栈(s)
3.一个".java"可以有多个类,但只有一个public类,且与文件名字相同
4.匿名内部类可以继承其他类与接口,在Swing编程和Android开发中常用到此方式实现事件监听和回调
5.final关键字:
修饰类:不可被继承
修饰方法:不可重写,但可以重载
修饰变量:是常量,不能被修改
6.重载和重写:
重载:一个类的多个方法名字相同,但是参数不同。注意:返回类型不能判断,即可以改变返回类型
重载,因为在编译时,jvm无法知道方法的返回类型。
重写:子类继承父类的方法,并重写了一个完全一样的方法。
7.实现对象克隆:
实现Cloneable接口并重写Object类的clone()方法
实现Serializable接口,通过对象的序列化和反序列化实现真正意义上的克隆
8.静态方法只能访问静态成员,非静态方法可以访问所有成员
9.抽象方法不可以是以下情况:
静态方法:抽象方法需要重写,而静态方法不能被重写
本地方法:(有本地代码实现的,如c语言实现的),抽象方法没有实现
synchronized:和方法的实现细节有光,抽象方法不涉及细节
10.内存泄漏:任何对象在不被需要的时候依旧存在
闭包(能够读取其他函数内部变量的函数,可以理解为定义在一个函数中的内部函数)、控制台日志、setTime(一个参数为字符串)、循环(两个对象彼此音乐且彼此保留)
11.null和undefind区别:
null:没有对象,没有值
undefind:有对象,有值,但是值没有定义
12.== 和 === 区别:
==:先比较类型,然后转换,在比较值
===:比较类型,如果不同直接false
13.jqery:
html():html标签及内容
text():纯文本内容,不能用于表单元素
val():用于表单元素
14.Jquery选择器:
基本选择器:根据id、css类名返回匹配dom元素
层次选择器:路径选择器
过滤选择器:在前面的基础上过滤相关条件,得到dom
15.jsp和servlet:
jsp:本质上是servlet,注重前端页面,是java+html
servlet:注重后台逻辑
16.垃圾回收机制:分代复制垃圾回收、标记垃圾回收、增量垃圾回收
17.cgi与servlet:servlet通过多线程方式运行服务,一个实例可以服务多个请求,实力一般不会销毁,效率高
18.重定向和请求:
sendRedirect():效率慢,可以访问不同站点的,url会变,发出新的请求
forward():url不变,效率高。
19.http请求:状态码、http头部、主体
20.http隧道:利用http或者https把多种网络协议封装起来进行通信的技术
21.servlet生命周期:加载和实例化、初始化(只调用一次)、服务、销毁
22.callableStatement:用来执行存储过程(用来执行特定功能的一组sql语句),存储过程提供了安全化和模块化
23.PreparedStatement比Statement的优势:预编译的,性能好,可以重用,安全,减少编译错误。
24.throw和throws区别:
throw:在代码中明确抛出异常(不受检查的异常、运行时异常(编译时被忽略))
throws:声明受检查的异常
25.HashSet和TreeSet区别:
HashSet:用hash表实现,无序,时间复杂度为O(1)
TreeSet:用树形的结构来实现的,元素有序,时间复杂度为O(logn)
26.HashMap和Hashtable区别:
map允许键和值为空,且不是同步的,更适合单线程环境,使用iterator(迭代器)。table不允许键和值为空,是同步的,适合多线程环境,使用Enumeration(对键的列举),一般认为其是遗留的类。
27.iterator和Enumeration区别:
Enumeration速度是iterator的2倍,占用更少的内存,但是不安全,能再遍历的时候修改集合,不允许调用者删除底层集合里面的元素。
28.java面向对象特性:封装、继承、多态、抽象
29.finally在return之前执行,即使return实在try中
30.&和&&区别:
&:是位运算符,表示按位与运算
&&:是逻辑运算符,表示and,短路与(左边false,右边直接舍去)
31.Collection与Collections区别:
Collection:是集合类的上级接口
Collections:是针对集合类的一个帮助类,提供最集合的各种操作
32.数组没有length()方法,但是有length属性,String有length()方法。
33.1B(byte,字节)=8b(bit)=0.5汉字,java中使用的是Unicode
34.jvm加载class文件
35.StringBuffer是多线程、效率低,StringBuilder是单线程、效率高,String是只读字符串
36.值传递:传递的是值,引用传递:传递的是引用,不是值
37.String类不能被继承只能是关联或者依赖
38.x.equals(y)为true,则hashcode是一样的,hashcode一样,不一定相等
39.构造器不能被继承,也即使不能重写,但是可以重载
40.跳出多重循环:在最外层循环前加上标记A,然后break A;
41.最有效率的方法计算28:2<<3(左移3位等于2的3次方,右移是除):二进制计算
42.switch可以作用于除了long型数据
43.java的指针是对象引用
44.基本类型(8),枚举类型,引用类型
45.short s1=1;s1=s1+1:需要强制转换;s1+=1:不需要强制转换
46.goto是保留字
47.原始数据类型与包装类型
包装类型:Integer的值是-128到127之间,注意它的大小判断是否重新new一个对象
48.栈(stack,基本数据类型的变量,对象的引用,甚至小的对象(逃逸分析))堆(heap,(new、构造器)对象放在堆中)静态区(字面量,如"hello"、“100”、100或者常量)
49.四舍五入原理是在参数上加0.5然后向下取整。

--------------------------------------------------2019.4.10-----------------------------------------------------------

50.创建对象时构造器的调用顺序:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。也就是说:相同情况下,父类先执行,然后子类执行;静态先执行,非静态后执行。例如:调用顺序:父类静态变量,子类静态变量,父类构造方法,子类构造方法。
51.字符串和基本静态类型转换,除了基本的方法(Integer.parseInt和int+“”)之外,还有valueOf方法(Integer.valueOf(“”))。
52.实现字符串的反转和替换: 1>.字符串与数组遍历 2>.Stringbuffer或者Stringbuild方法 3>.递归
53.时间:java8:time包下:LocalDate和LocalTime等,有DateTimeFormat时间格式转换器 之前:Date,SimpleDateFormat时间格式转换器
54.java和JavaScript:一个是动态语言、强类型变量(即变量须声明)、必须编译、面向对象 另一个是静态语言、弱类型变量、解释性语言不需要编译,由浏览器直接解析、基于对象和事件驱动。
55.断言(assert):assert Expression1;或者assert Expression1:Expression2;后面的E是boolean型。下面是boolean:错误信息如果为false,就报错(AssertionError)。
56.Error和Exception区别:前者是系统级错误和程序不必处理(处理不了)的异常,后者是需要捕捉或者需要程序进行处理的异常,是设计的问题,表示程序正常运行不会发生这种情况。
57.递归要牢记两点:收敛条件以及递归公式(按照顺序来)。
58.异常表示在程序运行时出现的不正常状态。
59.里氏代换原则:能使用父类型的地方一定能使用子类型,子类的功能一定比父类多。
60.异常的抛出与捕获:子类异常抛出,父类能捕获,父类抛出的异常,子类捕获不了,但要注意典型问题的关键:父类捕获的异常的本质是子类,再抛出异常即可被子类捕获,这是java的多态性。
61.Comparable和Comparator区别:前者是排序接口,后者是比较接口。实现了排序接口,即可使用Arrays.sort以及Collections.sort方法。也可以用后者实现java回调函数(如:sort(a,new
Comparator<>(){}))。
62.map的映射关系:1v1或者nv1。
63.线程的sleep()和yield()方法的区别:前者给线程运行机会时不考虑优先级(后者考虑),执行前者后进入阻塞状态(后者进入就绪状态,即运行状态),前者会声明抛出InterruptedException异常(后者不会),前者具有更好的可移植性。
64.sleep()和wait()区别:前者让线程暂停执行指定时间,将执行机会(cpu)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复。后者是使当前线程放弃对象的锁(线程暂停执行),进入对象的等待池,然后唤醒进入等锁池。
65.线程同步问题:wait、sleep、notify、notifyAll 注意:sleep休眠时,不释放锁,别的对象访问不了;注意锁的时候的锁的对象,如果是包装类或者是String类(引用类型),修改时,地址发生变化,锁不住同一个对象。
66.多线程的实现方式:继承Thread类(不推荐,因为单继承关系,继承之后不能继承别的类)、实现Runnable接口、实现Callable<>接口。
67.同步是阻塞式操作,异步是非阻塞式操作。
68.start方法是启动线程的,并不意味着线程会立即运行;而run方法是线程启动后要进行回调的方法。
69.线程池(Executor,通过Executors工具类创建线程池)就是事先创建若干个可执行的线程放到一个池(容器)中,需要的时候从池中获取线程不需要自行创建,使用完毕之后不需要销毁而是放到池中,从而减少创建和销毁线程对象的开销。
70.synchronized和Lock异同:前者自动释放锁;后者手动释放(最好在finally代码块(释放外部资源最好的地方)中),完成前者所有功能,有更精确的线程语义和更好的性能。
71.序列化是为了解决对象流读写操作时可能引发的问题(如:数据乱序),即将java对象转为流(对象输出流,writeObject(Object),ObjectOutputStream),前提是对象实现Serializable接口。也可以反序列化。
72.java中的流:字节流(继承InputStream和OutputStream)和字符流(继承Reader、Writer)。
73.统计给定文件中给定字符串出现的次数 思路:读取一行line,index=-1,找到字符串的index,count+1,line=line.subString(index+word.length())。
74.统计文件目录下的文件数目,使用listFiles()方法,使用递归
75.套接字(Socket)和Servlet:前者是两者通信的基础,Socket是web服务的核心,Servlet是逻辑的一部分,在我看来,Socket是Servlet的基础?Servlet里包含了Socket?
76.XML文档: 1>.分为DTD和Sechema两种形式,二者都是对XML语法的约束,本质区别在于Schema、本身也是一个XML文件,可以被XML解析器解析,也可以为XML承载的数据定义类型,约束能力比DTD大。
2>.对XML的解析主要有DOM(文档对象模型,处理大型文件时其性能下降的非常厉害,是因为DOM树结构占用的内存较多造成的,在解析前将整个文档装入内存,适合对XML文件的随机访问(典型的空间换时间策略))、
SAX(事件驱动型的XML解析,当做一组事件处理,顺序读取XML文件,当遇到文件开头或者结尾或者标签开头结束时,会触发事件,通过事件回调代码处理XML文件,适合XML文件顺序访问)、
StAX(应用程序能够把XML当做一个事件流来处理,将事件逐个拉出来处理)。
3>.用处:数据交换(被JSON取代)、信息配置(java的许多框架选择dom4j作为处理XML的工具)。
77.jdbc操作数据库的步骤:加载驱动、创建连接、创建语句、执行语句、处理结果、关闭资源。
78.PreparedStatement、Statement和CallableStatement
79.使用JDBC操作数据库时,提升__性能: 1>.读取数据:制定结果集(ResultSet)对象的setFetchSize()方法指定每次抓取的记录数(典型的空间换时间策略);
2>.使用PreparedStatement语句构建批处理,将若干SQL语句置于一个批处理中执行。(addBatch()、executeBatch())
80.DAO:是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露持久化方案实现细节的前提下提供了各种数据访问操作。DAO模式包含了数据访问器和数据对象。
81.事务的ACID:原子性、一致性、隔离性、持久性。
82.只有存在并发数据访问时才需要事务。当多个事务访问同一数据时,会存在5类问题,3类数据读取问题(脏读、不可重复读、幻读)和2类数据更新问题(第一类丢失更新和第二类丢失更新)。
83.数据库通过锁机制来解决数据并发访问问题,有表级锁和行级锁、共享锁和独占锁。还有自动锁(用户指定会话的事务隔离级别,自动加锁,事务隔离级别越高,并发性越差)。
84.JDBC进行事务处理:调用setAutoCommit(false)设置手动提交事务,用conn.commit()显示提交事务,用rollback()进行事务回滚。还有保存点概念,允许通过代码设置保存点并让事务回滚到指定的保存点。
85.jdbc处理Blob和Clob:Blob:指二进制大对象(存储大的二进制数据);Clob:大字符对象(存储大的文本数据而设定的)。JDBC的PreparedStatement(ps.setBinaryStream(2,
in))和ResultSet提供相应的方法支持。
86.正则表达式:用于描述规则(在编写处理字符串的程序时,经常会有符合某些复杂规则的字符串的需要)的工具,也就是说,正则表达式就是记录文本规则的代码。
87.java的String类提供了对正则表达式的支持:matches()、replaceAll()、replaceFirst()、split()。也可以用Pattern类表示正则表达式对象。
88.获取一个类的类对象(所有的类,都存在一个类对象,这个对象用于提供类本身的信息,如:几种构造方法,多少属性等;是字节码对象,当jvm加载一个类时就会为这个类创建一个Class对象)的方式:类型.class、对象.getClass()、Class.forName("")。
89.反射:在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性,称为java语言的反射机制。反射就是把java类中的各种成分映射成一个个java对象。
90.通过反射创建对象:通过类对象调用newInstance()方法、通过类对象的getConstructor()或者getDeclaredConstructor()方法获得构造器对象并调用其newInstance()方法创建对象。
91.通过反射获取和设置私有字段的值:通过类对象的getDeclaredField()方法字段对象,然后通过字段对象的setAccessible(true)将其设置为可以访问,接下来通过get/set方法来进行获取或设置字段的值了。
92.通过反射获取调用对象的方法:类对象.getMethod(“方法名”)。
93.http协议:超文本传输协议,适用于从万维网服务器传输超文本到本地浏览器的传送协议,基于TCP/IP通信协议来传递数据,属于应用层的面向对象的协议,工作于B/S架构上。特点:简单快速、灵活、无连接、无状态、支持B/S、C/S模式。
94.URL与URI:URI:统一资源标识符,用来唯一的标识一个资源,由三部分组成:访问资源的命名机制、存放资源的主机名、资源自身的名称,由路径表示,着重强调于资源;
URL:统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源,包括:协议、存有该资源的主机IP地址(有时包括端口号)、主机资源的具体地址;
URN:统一资源命名,是通过名字来标识资源,是URI的一种。
95.i++和++i的区别:前者先i=后++;后者先++后i=;
96.面向对象的六原则一法则:单一职责原则(一个类只做它该做的事情、高内聚)、 开闭原则(软件实体应当对扩展开放,对修改关闭、抽象(抽象类和接口)是关键,封装可变性)、 依赖倒转原则(面向接口编程)、
接口隔离原则(接口要小而专,不能大而全)、
合成聚合复用原则(优先使用聚合或合成关系复用代码。优先考虑Has-A(关联,作为成员变量,聚合作为局部变量或者静态方法),而不是Is-A(继承),还有Use-A(使用/调用))、
迪米特法则(最少知识原则,就是一个对象应当对其他对象尽可能少的了解,低耦合)。
97.设计模式:工厂模式、建造者模式、工厂方法模式、原始模型模式、单例模式、门面模式、装潢模式、代理模式、命令模式、合成模式、桥梁模式等等。 工厂模式:工厂类根据条件生成不同的子类,有一个公共的抽象父类并且实现了相同的方法,但是是不同的实现。当得到子类的实例后,只调用基类的方法即可。
代理模式:给一个对象提供一个代理对象,并由代理对象控制原对象的引用。按照使用目的不同,代理可以分为
远程、虚拟、保护、Cache、防火墙、同步化、智能引用 代理。
适配器模式:把一个类的接口换成客户端所期待的另一种接口,从而使原因因接口不匹配而无法在一起的类能够一起工作。
模板方法模式:提够一个抽象类,将部分逻辑一具体方法或构造器的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类实现不同的方法,从而实现不同的业务逻辑。
98.单例设计模式:只有一个对象 1>.私有构造函数,避免其他类直接创建单例类对象 2>.在本类中传关键唯一实例,使静态成员变量保;为保证安全性,私有化这个成员
3>.对外提供一个公开的静态方法,供其他类获取本类的唯一实例 两种实现方法:饿汉式(好处、坏处)、懒汉式(好处、坏处)
99.UML:是统一建模语言,是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供了模型化和可视化支持。 用例图(用来捕获需求,描述系统的功能,通过该图可以迅速的了解系统的功能模块及其关系)、
类图(描述类与类之间的关系,可以快速了解系统)、
时序图(描述执行特定任务时对象之间的交互关系以及执行顺序,可以了解对象能接受的消息,也就是说对象能够向外界提供的服务)、
协作图、状态图、活动图、构件图、部署图等。
100.冒泡排序:相邻两者之间进行比较,交换顺序
101.折半查找:排好序的数组,从中间查找。注意中间位置:low+(high-low)/2,不是(low+high)/2。
102.时间复杂度与空间复杂度:后者是需要多大的空间(如果替换一个,那就是O(1));前者是执行时间的总和(次数=变化的数值的循环)。

--------------------------------------------------2019.4.15-----------------------------------------------------------

103.常见的web服务器:IIS、Apache、Kangle、WebSphere、WebLogic、Tomcat、Nginx服务器。注意web服务器与servlet容器的关系(前者侧重于HTTP
Servler,只支持静态普通网页,可以单向连接后者,后者侧重于Servlet引擎,运行在前者之上的应用服务器)。
104.jsp的四种作用域:page(与一个页面相关的对象和属性)、
request(与web客户机发出的一个请求相关的对象和属性)、
session(与某个用户与服务器建立的一次会话相关的对象和属性)、
application(与整个web应用程序相关的对象和属性,实质上是跨越整个web应用程序,包括多个页面、请求和会话的一个全局作用域)。
105.实现jsp或servlet的单线程模式:<%@page isThreadSafe=“false” %>、让自定义的Servlet实现SingleThreadModel标识接口。
106.实现会话跟踪的技术: 1>.含义:由于http协议本身是无状态的,服务器为了区分不同的用户,就需要对用户绘画技术进行跟踪,为用户分配唯一的id,下一次用户在请求中包含此id,服务器据此判断到底是哪一个用户;
2>.URL重写 3>.设置表单隐藏域 4>.cookie 5>.HttpSession
6>.在html5中,可以使用Web
Storage技术通过js来保存数据,例如可以使用localStorage和sessionStorage来保存用户回话信息,也能够实现会话跟踪
107.过滤器与拦截器区别:前者是servlet规范规定的,被server调用,只初始化一次,后者是spring框架规定的,可以初始化无限次,在spring项目中优先使用拦截器。
过滤器:
用途:对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图像格式、对响应内容进行压缩以减少传输量等;
和过滤器相关的接口:Filter、FilterConfig和FilterChain。配上@WebFilter或者在web.xml中通过和配置。
108.监听器:使用@WebListener或者在web.xml中 定义:javaweb开发中的监听器就是由application、session、request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
ServletContextListener:对Servlet上下文的创建和销毁进行监听
ServletContextAttributeListener:监听Servlet上下文属性的添加、删除和替换
HttpSessionListener:对Session的创建和销毁进行监听(session销毁:session超时、调用session的对象的invalidate()方法使session失效)
HttpSessionAttributeListener:对session对象中属性的添加、删除和替换进行监听
ServletRequestListener:对请求对象的初始化和销毁进行监听
HttpRequestAttributeListener:对请求对象属性的添加、删除和替换进行监听。
109.web.xml文件配置的内容:监听器、过滤器、Servlet(@WebServlet)、相关参数、会话超时时间、安全验证方式、错误页面等。
在tomcat中可以通过建立安全套接字层以及通过基本验证或表单验证来实现对安全性的支持
认证方式:口令、数字证书、指纹识别(虹膜识别)
110.JSTL标签(jsp页面):等 好处:1.分离Jsp页面的内容和逻辑,简化了Web开发
2.开发者可以创建自定义的标签来封装业务逻辑和显示逻辑
3.标签具有很好的可移植性、可维护性和可重用性
4.避免了Udine小脚本(Scriptlet)的使用(很多公司的项目不允许在jsp中书写小脚本)
111. 自定义标签的步骤:
1.java类实现Tag/BodyTag/IterationTag接口(一般继承TagSupport/BodyTagSupport/SimpleTagSupport类,这是对缺省适配模式的应用),重写doStartTag()、doEndTag()等方法,定义标签要完成的功能;
2.编写扩展名为tld的标签描述文件对自定义标签进行部署,tld文件通常放在WEB-INF文件夹下或其子目录中;
3.在Jsp页面中使用taglib指令引用该标签库。
4.如果需要将自定义的标签库发布成jar文件,需要将标签描述文件(tld文件)放在jar文件的META-INF目录下。
112.El表达式:
1.对象:pageContext、initParam(访问上下文参数)、param(访问请求参数)、paramValues、header(访问请求头)、headerValues、cookie(访问cookie)、applicationScope(访问application作用域)、sessionScope、requestScope、pageScope
2.用法:如: p a g e C o n t e x t . r e q u e s t . c o n t e x t P a t h 和 {pageContext.request.contextPath}和 pageContext.request.contextPath{pageContext[“request”].contextPath},表达式的.和[]的运算作用是一致的,唯一的差别在于如果访问的属性名不符合java标识符命名规则,就只能使用[]而不能使用.运算符获取它的值。
3.支持的运算符:.、[]、算术运算符(±*/等)、关系运算符(==、!=等)、逻辑运算符(and、&&等)、条件运算符( s t a t e m e n t ? A : B ) 、 e m p t y 运 算 符 ( {statement?A:B})、empty运算符( statement?A:Bempty{not
empty 对象},可以和if一起使用)。
113.javaweb开发的Model1和Model2指的是: Model1:以页面为中心的javaweb开发,使用Jsp+JavaBena技术将页面显示逻辑和业务逻辑处理分开,JSP实现页面显示,JavaBean对象用来保存数据和实现业务逻辑;
Model2:基于MVC(模型-视图-控制器)架构模式的开发模型,实现了模型和视图的彻底分离,利于团队开发和代码的复用。
114.Servlet3的异步处理: 引入一项新的技术可以让Servlet异步处理请求,适合执行时间长且用户需要得到结果的任务。 在servlet的方法中,1.开启tomcat异步Servlet支持(request.setAttribute(“org.apache.catalina.ASYNC_SUPPORTED”,true))
2.启动异步处理的上下文(final AsyncContext ctx = request.startAsync() ctx.setTimeout() ctx.start(new Runnable(){run(… ctx.complete())}))
115.文件上传与下载:在前端页面的form表单添加 enctype=“multipart/form-data”
116.jsp的静态包含和动态包含: 静态包含:<%@ include file=""%>,编译时包含,如果包含的页面不存在会出错,且contentType应该一致,两个页面只产生一个class文件,因此被包含页面发生的变动在包含它的页面更新前不会得到更新(也就是说,二者已经成为一个整体了)
动态包含:
117.servlet获取用户配置信息的参数: 通过重写Servlet接口的init方法通过ServletConfig对象的getInitParameter()方法获取Servlet的初始化参数;
通过ServletConfig对象的getServletContext()方法获取ServletContext对象,并通过该对象的getInitParameter()方法获取服务器上下文参数,当然,ServletContext对象也在处理用户请求的方法(如:doPost()、doGet()方法)中通过请求对象的getServletContext()方法来获得。
118.设置请求的编码以及响应内容的类型: request.setCharacterEncoding(String) response.setHeader(String,String)
119.网络应用的模式及特点: B:浏览器 C:客户端 S:服务器 B/S:特殊的C/S C/S: P2P:成千上万彼此链接的计算机都处于对等的地位,既可以当服务器也可以当客户端
注意:电子商务模式:B2B、B2C、C2C、C2B、O2O
120.Web Service:是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。之所以这么叫,是因为它基于HTTP协议传输数据,这使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可以相互交换数据或集成。
121.SOA:面向服务的架构,SOA是一种思想,它将应用程序的不同功能单元通过中立的契约联系起来,独立于平台和操作系统,使得各种形式的功能单元能够更好的集成。
122.概念解释: SOAP:简单对象访问协议,是webService中交换数据的一种协议规范 WSDL:Web服务描述语言,它描述了Web服务的公共接口
UUDI:统一描述、发现和集成,它是一个基于XML的跨平台的描述规范,可以使世界范围内的企业在互联网上发布自己的服务。
123.java规范中和webservice相关的规范:-JAXM -JAX-RS -JAX-WS
124.java领域的Web Service框架:Axis2、Jersey、CXF(是Apache旗下的一个重磅的SOA简易框架,他实现了ESB(企业服务总线))等。
125.ORM:对象关系映射,是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术;就是说,ORM是通过使用描述对象和数据库之间的映射的元数据(在java中是XML或者是注解),将程序中的对象自动持久化到关系数据库表中的行转换成java对象,其本质上就是将数据从一种形式转换到另外一种形式。
126.持久层:将内存中的数据保存到关系数据库、文件系统、消息队列等提供持久化支持的设备中。 持久层设计的目标:数据存储逻辑的分离,提供抽象化的数据访问接口。 数据访问底层实现的分离,可以在不修改代码的情况下切换底层实现
资源管理和调度的分离,在数据访问层实现统一的资源调度(如缓存机制) 数据抽象,通过更面向对象的数据操作
框架:Mybatis、Hibernate、TopLink、Guzz、JOOQ、Spring Data、ActiveJDBC等。
127.Mybatis使用KaTeX parse error: Expected 'EOF', got '#' at position 2: 和#̲的区别:#将传入的数据变为一个…将传入的数据直接生成在SQL中,会有SQL注入问题,能用#的地方就不用 , 在 o r d e r b y 字 句 的 时 候 , 使 用 ,在order by字句的时候,使用 ,orderby使
128.Mybatis的namespace的作用:在Mybatis中,可以为每一个映射文件起一个唯一的命名空间,这样定义在这个映射文件的每个SQL语句就成了定义在这个命名空间的一个ID。
129.Mybatis的动态SQL:if choose/when/otherwise trim where set foreach
130.IoC和DI: 控制反转:将程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。 依赖注入:应用组件不应该负责查找资源或者其他依赖的协作对象,配置对象的工作交给容器负责。DI是对IoC更准确的描述。
依赖注入可以通过setter方法注入(设值注入,需要提供无参构造器或者无参的静态工厂方法来创建对象)、构造器注入、接口注入(spring不支持)
131.spring的作用域:singleton、protetype(原型模式)、request、session、globalSession(同一个全局的Session共享一个Bean)
132.ThreadLocal:线程的一个本地化对象
133.AOP:面向切面编程,指一种程序设计泛型,该泛型以一种成为切面(aspect)的语言构造为基础,且面试一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点。
134.横切关注:会影响到整个应用程序的关注功能,它跟正常的业务逻辑是正交的,没有必然的联系,但是几乎所有的业务逻辑都会涉及到这些关注功能。通常,事务、日志、安全性等关注就是应用中的横切关注功能。
135.AOP中的概念: 连接点:程序执行的某个特定位置(spring仅支持方法的连接点) 切点:如果连接点是数据中的记录,name切点相当于查询条件,一个切点可以匹配多个连接点
增强:是织入到目标类连接点上的一段程序代码,如BeforeAdvice(通知)。
引介:是一中特殊的增强,他为类添加一些属性和方法。这样,一个业务类原本没有实现某个接口,通过引介功能,可以动态的为该业务添加接口的实现逻辑,让业务成为这个接口的实现类
织入:织入是将增强添加到目标类具体连接点上的过程,AOP有三种织入方式:编译期织入(需要特殊的java编译期(例如AspectJ的ajc))、装载期织入(要求使用特殊的类加载器,在装载类的时候对类进行增强)、运行时织入(在运行时为目标类生成代理实现增强)。
spring采用了动态代理的方式实现了运行时织入,而AspectJ采用了编译期织入和装载期织入的方式。 切面:切点+增强。包括了对横切关注功能的定义,也包括了对连接点的定义。
136.代理模式:静态代理模式、jdk动态代理模式、cglib动态代理模式
137.spring自动装配:配置文件和注解 注意:不能自动装配简单属性(基本类型、字符串等) no、byName、byType、constructor(类似byType,不过是应用于构造器的参数)、autodetect(如果有默认的构造器,则通过constructor方式进行自动装配,否则使用byType)
138.与spring使用注解配置bean有关的注解 @Component @Controller @Service @Repository
139.spring支持的事务管理类型:编程式事务管理和声明式事务管理(更符合轻量级容器的概念) 事务分为全局事务(由应用服务器管理,需要底层服务器JTA支持)和局部事务(采用持久化方案)
spring支持的事务管理器:DataSourceTransactionManager:注入DataSource 等
140.要在web项目中配置Spring的IoC容器,在web.xml中做出配置(添加监听器)
141.要在web项目中配置springmvc,在web.xml中配置其前端控制器DispatcherServlet
142.springmvc的工作原理:前端控制器与处理映射器、处理适配器、视图解析器、利用视图模型对模型数据进行渲染。
143.spring框架的优势:非侵入式、IoC容器、AOP、MVC、事务管理等
144.spring IoC容器配置Bean的方式: 基于XML文件进行配置 基于注解进行配置 基于Java程序进行配置(springboot?)
145.spring框架中Bean的生命周期:
1.IoC容器找到Bean的定义并实例化该Bean
2.容器对Bean进行依赖注入
3.如果Bean实现了BeanNameAware接口,则将该Bean的id传给setBeanName方法
4.如果Bean实现了BeanFactoryAware接口,则将BeanFactory对象传给setBeanFactory方法
5.如果Bean实现了BeanPostProcessor接口,则调用其postProcessBeforeinitialization方法
6.如果Bean实现了InitializingBean接口,则调用其afterPropertySet方法
7.如果有和Bean关联的BeanPostprocessors对象,则这些对象的postprocessAfterInitialization方法被调用
8.当销毁Bean实例时,如果Bean实现了DisposableBean接口,则调用其destroy方法。
146.依赖注入时注入集合属性:在定义Bean属性时,通过///分别为列表、集合、映射和键值都是字符串的映射属性
147.spring中自动装配的限制:
1.如果使用了构造器注入或者setter注入,那么将覆盖自动装配的依赖关系
2.基本数据类型的值、字符串字面量、类字面量无法使用自动装配来注入
3.优先考虑使用显式的装配来进行更精准的依赖注入而不是使用自动装配
148.web项目中获得Spring的IoC容器:
1.WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
2.WebApplicationContext wac = ContextLoad.getCurrentWebApplicationContext();
149.大型网站在架构上考虑:分层(MVC)、分割(功能分割)、分布式(将静态资源、数据等采用独立分布式部署)、集群(更多服务器提供相同的服务)、缓存(采用空间换时间,将数据存放在距离计算机最近的位置)、异步(实现软件实体之间解耦合的又一重要手段,能推迟就推迟处理)、冗余(各种服务器都要提供相应的冗余服务器以便在某台或某些服务器宕机时还能保证网站正常工作,同时也提供了灾难恢复的可能性)。
150.网站前端页面优化的技术:
1.浏览器访问优化:减少http请求数量(合并Css等)、使用浏览器缓存(css、js、图片)、启用压缩、css前置,js后置;
2.CDN加速:本质是缓存,将数据缓存在离用户最近的地方,一般是静态资源。
3.反向代理:相当于应用服务器的一个门面,可以保护网站的安全性,也可以实现负载均衡的功能,它缓存了用户访问的热点资源,可以直接从反向代理将某些内容返回给用户浏览器。
151.服务器优化技术:
1.分布式缓存:缓存的本质是内存中的hash表,缓存主要用来存放读写比很高、变化很少的数据
2.异步操作
3.使用集群
4.代码优化:多线程(将对象设计为无状态对象、在方法内部创建对象,由方法的线程创建,也可以用ThreadLocal将对象与线程绑定也可以、对资源的并发访问使用合理的锁机制);
非阻塞I/O:使用单线程和非阻塞I/O更能充分发挥服务器性能的应用模式;
资源复用:单例和对象池
152.攻击概念: XSS攻击:跨站脚本攻击 SQL注入攻击:恶意的sql语句注入 SCRF攻击:跨站请求伪造,利用cookie或Session,盗取用户身份
153.模型概念:
1.领域模型:是领域内的概念类或现实世界中对象的可视化表示,有又称为概念模型或分析对象模型,建立领域概念之间的关系,专注于分析问题领域本身,发掘重要的业务领域概念
2.贫血模型:领域对象中只有setter和getter方法(POJO),所有的业务逻辑都不包含在领域对象中而是放在业务逻辑层(也可以接着分为失血(领域对象完全没有业务逻辑)和贫血(有少量))。
3.充血模型:将大多数业务逻辑和持久化方法放在领域对象中,业务逻辑只是完成对业务逻辑的封装、事务和权限等的处理。
154.TDD(测试驱动开发): 定义:在编写真正的功能实现代码之前先写测试代码,然后根据需要重构实现代码。就是说,先写测试代码(先想一下实现什么功能),再写功能实现代码(按照功能一个个解决);
好处:更清晰的代码——只写需要的代码;更好的设计;更出色的灵活性——鼓励程序员面向接口编程;更快速的反馈——不会到系统上线时才知道bug的存在;
应用层级:单元测试(测试一个类中的代码)、集成测试(测试类之间的交互)、系统测试(测试运行的系统)、系统集成测试(测试运行的系统包括使用的第三方组件);
实施步骤:红(失败测试)—— 绿(通过测试)—— 重构;
测试替身:将测试代码跟依赖项隔离,以保证测试代码仅仅针对当前被测试对象展开,这时候需要测试替身,分为四类:
1.虚设替身:只传递但是不会使用到的对象,一般用于填充方法的参数列表
2.存根替身:总是返回相同的预设响应,其中可能包括一些虚设状态
3.伪装替身:可以取代真实版本的可用版本(比真实的版本还是会差很多)
4.模拟替身:可以表示一系列期望值的对象,并且可以提供预设响应;
java世界中实现模拟替身的第三方工具非常多,包括EasyMock、Mockito、jMock等。

你可能感兴趣的:(java基础知识总结)