当前位置:   article > 正文

Java问题总结_filter输出viewandmodel

filter输出viewandmodel

什么是指针
指针存放内存地址,它的值直接指向另一个地址。

八种数据类型及其占位

整数类型byte(8)、short(16)、int(32)、long(64)
浮点型float(32)、double(64)
字符型char(16)
布尔型boolean(1)

整数默认类型为int,小数的默认类型为double
byte、short、int,默认值为0,long默认值0L,float默认值0.0f,double默认值0.0d

Set和List
Set接口的实现类存储的数据是无序的,元素不重复的
List接口的实现类存储的数据是有序的,元素可重复的

ArrayList和LinkedList
1 ArrayList是实现了基于动态数组的数据结构,在未声明长度的情况下,默认长度是10,数据填满会自动扩充原长度的50%。
2 LinkedList基于链表的数据结构。
3 对于随机访问get和set(即查找元素),ArrayList速度优于LinkedList,因为LinkedList要移动指针。
4 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。

集合只能存引用类型

String本质
final修饰的char数组,用final就是拒绝继承,防止被破坏。String不可变不是数据内容不可变,而是内存地址不可变。不允许在原内存地址上修改数据,而是重新指向一个新对象,新地址。

String StringBuilder StringBuffer
1 修改String对象的值,内存地址会发生改变;
2 StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的对象,即内存地址不变;
3 StringBuffer是线程安全的,StringBuilder是线程不安全的;
4 StringBuilder的执行速度比StringBuffer快

字符串常量池基本原理
JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化:
1 为字符串开辟一个字符串常量池,类似于缓存区
2 创建字符串常量时,首先检查字符串常量池是否存在该字符串。存在该字符串,返回字符串在常量池中的引用;不存在,实例化该字符串对象并放入池中。

值传递和引用传递
String类型遵循引用传递,基本类型遵循值传递。
值传递:实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。(实际参数是对象或数组)这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,所以方法执行中形式参数的改变将会影响实际参数。

相等性规则
’==‘比较
1 ==比较基本数据类型,判断的是值是否相等(基本数据类型只能用“==”比较)
2 ==比较引用类型,判断的是内存地址是否相等
equals()方法
1 默认的equals方法(Object类的equals()方法)与==一样,比较的是内存地址
2 String类的equals方法比较的是值是否相等

序列化与反序列化
序列化:将一个对象转换成字节文件,存储在硬盘中。
反序列化:将一个字节文件转换成对象。

创建类有2种方法
1 new
2 反射的newInstance方法

计算机设计模式
单例模式、工厂模式、适配器模式、装饰模式、组合模式、代理模式

单例模式
只有一个实例
枚举
懒汉式:实例在用到的时候才去创建,“比较懒”,用的时候才去检查有没有实例,如果有则返回,没有则新建。
饿汉式:实例在初始化的时候就已经建好了,不管你有没有用到,都先建好了再说。

封装继承多态
封装;成员变量设置为私有,然后提供公有set和get方法读和取。
继承:所有类都有父类,即所有类都派生于Object类;每个子类只能有一个父类;子类只能继承父类的非private修饰的变量和方法。
多态: 父类引用指向子类对象

重写与重载
重载:
1 发生在同一个类中
2 方法名相同
3 参数列表不同(个数,数据类型,顺序),注意:参数列表不同跟变量名称没关系
4 返回值的类型是否改变,跟方法是否重载没关系,不能作为重载的依据
重写
1 重写发生在子父类当中
2 方法名、参数列表、返回值类型均相同
3 重写的方法,方法体不同或者访问控制修饰符不同
4 子类方法的访问权限不能缩小
5 静态方法(static)不能进行重写

JVM类的加载顺序
static > new > 代码块 > 构造方法

逻辑与 按位与
&是位运算符,表示与运算。如果对应位都是1,则结果为1,否则为0。
&&是逻辑运算符,表示逻辑与运算符。当且仅当两边表达式都为真,条件才为真。

final
1 final修饰的类不能够被继承;
2 修饰的方法不能被重写,可以被重载;
3 修饰的变量为常量,常量名称必须都为大写,常量的值不可修改,且声明常量的同时要给常量赋值。

static
1 static声明的资源只能被初始化一次,且在整个程序编译通过之后,开始运行之前完成初始化;
2 修饰变量,称为静态变量,局部变量(如方法中的变量)不能被static 修饰,因为static就有全局的意思;
3 修饰方法,称为静态方法,静态方法只能调用其他静态资源,不能调用非静态变量,不能应用this和super,因为静态资源的加载先于实例化;
4 被static修饰的变量和方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被该类的所有实例共享静态资源可以直接通过类名调用
5 修饰内部类(静态类),外部类不需要实例化,可以直接通过外部类名调用

HashMap原理
1 数据结构是数组加链表,jdk1.8之后又加入了红黑树;
2 当添加一个元素(key-value)时,首先计算元素的key的hash值,以此来确定插入数组中的位置;
3 如果hash值相同,这时就添加到同一个hash值(hashCode)的元素的后面,他们在数组的同一位置,于是形成了链表;
4 当链表长度大于8且元素(k-v)个数超过64时,链表就转换为红黑树,这样就提高了查找的效率;
5 当红黑树中的节点个数小于6时,红黑树又重新转换为链表;
6 扩容因子0.75,一次扩两倍.

访问权限修饰符
private:只能在本类访问
默认:能被本类或同包下的类访问
protected:能被本类或同包下的类访问,也能在不同包的子父类中访问
public:权限最大,只要能访问到该类便可访问

计算机网络五层架构
自上而下:
应用层 超文本传输协议HTTP
传输层 传输控制协议TCP 用户数据报协议 UDP
网络层 网际互连协议IP
数据链路层
物理层

OSI体系结构
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层

本地服务器的IP地址
127.0.0.1

发送时延
主机或者路由器发送数据帧所需要的时间。即从数据帧的第一个比特开始发送算起,到最后一个比特发送完毕所需的时间。

传播时延
电磁波在信道中传播一定的距离所需要花费的时间。

索引类型及使用原则
单列索引 :普通索引 唯一索引 主键索引
组合索引
全文索引
空间索引
使用原则:表数据量大,查询频繁,单列不同值较多的情况下可以建立索引
触发原则:遵从最左前缀原则,条件必须有左边的字段,才会用到索引,中间如果断开了,则都不会用到后面的索引

123范式

mysql排序
升序降序,字符根据ascii码

mysql引擎
innodb 默认加行锁,触发条件是加索引。
只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。
myisam 默认加表锁 innodb默认隔离级别:可重复读。产生幻读


读锁
其他请求可读不可写(共享)
SELECT加共享锁:
SELECT * FROM [TABLE] LOCK IN SHARE MODE
写锁
其他请求不可读不可写(排他),用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。
SELECT加排他锁:
SELECT * FROM [TABLE] FOR UPDATE;
悲观锁
它指的是对数据被外界修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。
乐观锁
它认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回错误信息,让用户决定如何去做。

悲观锁和乐观锁的实现方式
1 版本号
2 时间戳
每次查询,记录当前行的版本号(version)或时间戳(timestamp),在提交修改前判断版本号是否改变,没有改变则提交数据并更新版本号(+1)。

事务的四大特性
– 1. 原子性(Atomicity):事务是最小单位,不可再分
– 2. 一致性(Consistency):事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
– 3. 隔离性(Isolation):事务A和事务B之间具有隔离性,互相不影响
– 隔离性的隔离级别(4个):
– (1)读未提交:read uncommitted
– (2)读已提交:read committed
– (3)可重复读:repeatable read(默认事务隔离级别)
– (4)串行化:serializable
– 4. 持久性(Durabilit):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)
脏读
脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。
可重复读
可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。通常针对数据更新(UPDATE)操作。
不可重复读
对比可重复读,不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了。通常针对数据更新(UPDATE)操作。
幻读
幻读是针对数据插入(INSERT)操作来说的。
假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读。

存储过程
一组为了完成特定功能的SQL 语句集,它存储在数据库中
预编译,执行效率快,调试困难

having作用
where不可以使用聚合函数

filter过滤器的作用
拦截请求
如何拦截:webxml配置映射,路径包括映射时拦截

转发与重定向
1、请求次数:重定向是客户端向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向请求两次,转发请求一次;
2、地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;
3、是否共享数据:重定向不共享数据,转发请求共享数据
4、跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源;
5、发生行为不同:重定向是客户端行为,转发是服务器端行为;

jsp四大作用域
page,request,session,application

jsp九大内置对象
request、response、out、session、application、config、pageContext、page、excepiton

反射
1)只要给定类的全路径,即可通过反射获取类的所有信息
2)反射可以在程序运行时获取任意一个对象所属的类对象
3)在运行时可以获取到类中所有属性对象,并对其操作(包括私有属性)
4)在运行时可以获取到类中、父类中所有方法,并调用
5)目前主流的应用框架如Struts2,Hibernate,Spring,SpringMVC等框架的核心全部是利用Java的反射机制来实现的。

Servlet生命周期
servlet对象是单例的
每一次请求到达服务器时,服务器(tomcat)会检查有没有目标对象(servlet对象),如果没有则创建,如果有,则拿来直接使用。
由于servlet是单例的,所有的用户共享的是一个对象,所以在servlet实现类中不建议定义成员变量,在高并发情况下Servlet是线程不安全的。
1 在创建servlet对象时,通过调用init()方法进行初始化
2 通过service()方法来处理客户端的请求,根据请求方式的不同转发给doGet()或doPost()方法
3 停止服务时,通过调用destory()方法销毁Servlet对象
4 Servlet对象被JVM垃圾回收器回收

Service作用
接受请求,分析请求方式转发给doGet、doPost

SpringMVC入口
DispatcherServlet,即调度器。解析请求,将请求转发给controller,返回mv

GET与POST请求方式的区别
1 GET请求业务参数以键值对的形式拼接在URL后面;POST请求业务参数存放在HTTP包体中;
2 GET请求URL长度是受限制的,URL 的最大长度是1024个字符,即2KB;POST请求理论上数据长度无限制,但是IIS4服务器最大数据量为80KB,IIS5服务器最大数据量为100KB;
3 GET请求安全性较差,因为参数是URL的一部分,对用户可见;POST请求相对更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中
4 GET请求只允许 ASCII 字符;POST请求没有限制。也允许二进制数据,所以提交多媒体文件用POST方式提交。

IOC
控制反转:将创建类对象的权利交给容器
注解:
@Controller一般声明controller层的类
@Service一般声明Service层的类
@Repository一般声明dao层的类
@Component其他没有特殊要求的层用该注解修饰
DI
依赖注入:从容器中取出创建的类对象
注解:
@Resource、@Autowired
区别:
获取bean对象
@Autowired默认按类型注入
@Resource 默认根据变量名称(对象名)注入(即变量名称要与service别名一致),当找不到与名称匹配的bean时才会按类型注入

面向切面编程AOP
AOP 用来封装多个类的公共行为,将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,减少系统的重复代码,降低模块间的耦合度。
应用场景:日志、事务、权限

ModeAndView作用
1 存储向客户端发送的参数
2 指定要请求的客户端页面

拦截器Interceptor
拦截器类似于Servlet中的过滤器Filter,用于对进入controller的请求进行预处理和后处理。Filter只能预处理。
应用场景︰
1日志记录 2权限检查 3性能监控

状态码
1XX:服务器收到请求,需要请求者继续执行操作
2XX:成功,操作被成功接收
3XX:重定向,需要进一步操作以完成请求
4XX:客户端错误
5XX:服务器错误

Bean属性
scope
用于设定Bean实例的作用域,其默认值是singleton
singleton 单例模式,表示在 Spring 容器中只有一个 Bean 实例,Bean 以单例的方式存在。
lazy-init
懒加载
值为true,容器在首次请求对象时才会创建Bean实例;
值为false,容器在启动时创建Bean实例。该属性只在scope=singleton时有效

Spring两大特性
IOC、AOP

mybatis一级缓存与二级缓存
在参数和SQL完全一样的情况下, 多次调用mapper方法,只会执行一次SQL,第一次执行sql查询到的结果集会被保存在缓存中,后面重复调用mapper方法返回的是缓存中的结果集;
缓存的意义:提高对数据库查询的效率,提高应用程序的性能
一级缓存
1 一级缓存是默认开启的;
2 一级缓存只是相对于同一个SqlSession而言
二级缓存
1 二级缓存默认不开启的;
2 二级缓存是Application级别的缓存;
3 二级缓存要求返回的POJO(简单java类)必须是可序列化的

${} 与 #{} 的区别
(1) #{}与${}都是从参数列表中取值;
(2) #{}是编译好SQL语句再取值;${}是取值以后再去编译SQL语句;
(3) #{}是经过预编译的,是安全的。#{}引用参数的时候,Mybatis会把这个参数认为是一个字符串,并自动加上单引号’’;
(4) ${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入的风险;

SpringMVC工作原理
在这里插入图片描述
第一步:用户发起请求到前端控制器DispatcherServlet
第二步:前端控制器DispatcherServlet请求处理器映射器(HandlerMappering)去查找具体的处理器Handle:通过xml配置,注解进行查找
第三步:找到以后处理器映射器(HandlerMappering)向前端控制器DispatcherServlet返回执行链(HandlerExecutionChain)
第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行具体的处理器(Handler)
第五步:Handler执行完向处理器适配器HandlerAdapter返回ModelAndView
第六步:处理器适配器HandlerAdapter向前端控制器DispatcherServlet返回ModelAndView
第七步:前端控制器DispatcherServlet将ModelAndView传给视图解析器(ViewResolver)去进行视图解析
第八步:视图解析器ViewResolver解析后向前端控制器DispatcherServlet返回View
第九步:前端控制器DispatcherServlet根据View对视图进行渲染
第十步:前端控制器DispatcherServlet响应用户

TCP连接的建立
三次握手
首先Client端发送连接请求报文,Server端接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server端发生ACK报文,并分配资源,这样TCP连接就建立了。
请添加图片描述

  • 首先客户端向服务器端发送一段TCP报文,其中 标志位为SYN,表示“请求建立新连接”; 序号为seq=x(x一般为1);随后客户端进入SYN-SENT阶段。
  • 服务器端接收到来自客户端的TCP报文之后,结束LISTEN阶段。并返回一段TCP报文,其中:
    标志位为SYN和ACK,表示“确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接”; 序号为seq=y; 确认号为ack=x+1,表示收到客户端的序号seq并将其值加1作为自己确认号ack的值;随后服务器端进入SYN-RCVD阶段。
  • 客户端接收到来自服务器端的确认收到数据的TCP报文之后,明确了从客户端到服务器的数据传输是正常的,结束SYN-SENT阶段。并返回最后一段TCP报文。其中:
    标志位为ACK,表示“确认收到服务器端同意连接的信号”
    序号为seq=x+1,表示收到服务器端的确认号ack,并将其值作为自己的序号值;
    确认号为ack=y+1,表示收到服务器端序号seq,并将其值加1作为自己的确认号ack的值;
    随后客户端进入ESTABLISHED阶段。
    服务器收到来自客户端的“确认收到服务器数据”的TCP报文之后,明确了从服务器到客户端的数据传输是正常的。结束SYN-SENT阶段,进入ESTABLISHED阶段。

TCP连接的断开
四次挥手
请添加图片描述

  • 首先客户端想要释放连接,向服务器端发送一段TCP报文,其中: 标记位为FIN,表示“请求释放连接“; 序号为Seq=U;
    随后客户端进入FIN-WAIT-1阶段,即半关闭阶段。并且停止在客户端到服务器端方向上发送数据,但是客户端仍然能接收从服务器端传输过来的数据。
    注意:这里不发送的是正常连接时传输的数据,非确认报文,所以客户端仍然能发送ACK确认报文
  • 服务器端接收到从客户端发出的TCP报文之后,确认了客户端想要释放连接,随后服务器端结束ESTABLISHED阶段,进入CLOSE-WAIT阶段(半关闭状态)并返回一段TCP报文,其中:
    标记位为ACK,表示“接收到客户端发送的释放连接的请求”; 序号为Seq=V;
    确认号为Ack=U+1,表示是在收到客户端报文的基础上,将其序号Seq值加1作为本段报文确认号Ack的值;
    随后服务器端开始准备释放服务器端到客户端方向上的连接。
    客户端收到从服务器端发出的TCP报文之后,确认了服务器收到了客户端发出的释放连接请求,随后客户端结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段
    前"两次挥手"既让服务器端知道了客户端想要释放连接,也让客户端知道了服务器端了解了自己想要释放连接的请求。于是,可以确认关闭客户端到服务器端方向上的连接了
  • 服务器端自从发出ACK确认报文之后,经过CLOSED-WAIT阶段,做好了释放服务器端到客户端方向上的连接准备,再次向客户端发出一段TCP报文,其中:
    标记位为FIN,ACK,表示“已经准备好释放连接了”。注意:这里的ACK并不是确认收到服务器端报文的确认报文。 序号为Seq=W;
    确认号为Ack=U+1;表示是在收到客户端报文的基础上,将其序号Seq值加1作为本段报文确认号Ack的值。
    随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段。并且停止在服务器端到客户端的方向上发送数据,但是服务器端仍然能够接收从客户端传输过来的数据。
  • 客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器端发送一段报文,其中:
    标记位为ACK,表示“接收到服务器准备好释放连接的信号”。
    序号为Seq=U+1;表示是在收到了服务器端报文的基础上,将其确认号Ack值作为本段报文序号的值。
    确认号为Ack=W+1;表示是在收到了服务器端报文的基础上,将其序号Seq值作为本段报文确认号的值。
    随后客户端开始在TIME-WAIT阶段等待2MSL
    服务器端收到从客户端发出的TCP报文之后结束LAST-ACK阶段,进入CLOSED阶段。由此正式确认关闭服务器端到客户端方向上的连接。
    客户端等待完2MSL之后,结束TIME-WAIT阶段,进入CLOSED阶段,由此完成“四次挥手”。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码领袖开发者/article/detail/61320
推荐阅读
相关标签
  

闽ICP备14008679号