线程有几种状态?
1.新建(NEW):新创建了一个线程对象。
2.可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。
3.运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。
4.阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。阻塞的情况分三种:
(一). 等待阻塞: 运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
(二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
(三). 其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
5.死亡(DEAD):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。
类加载过程?
类加载的五个过程:加载、验证、准备、解析、初始化
Java编码思想之什么是高内聚低耦合?
高内聚是说模块内部要高度聚合,低耦合是说模块与模块之间的藕合度要尽量低。前者是说模块内部的关系,后者是说模块与模块间的关系。
耦合性也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
jsp与servlet的区别与联系
*JSP的本质就是Servlet*
1、不同之处在哪?
Servlet在Java代码中通过HttpServletResponse对象动态输出HTML内容
JSP在静态HTML内容中嵌入Java代码,Java代码被动态执行后生成HTML内容
2、各自的特点
Servlet能够很好地组织业务逻辑代码,但是在Java源文件中通过字符串拼接的方式生成动态HTML内容会导致代码维护困难、可读性差
JSP虽然规避了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂的业务逻辑同样也是不可取的
多线程安全问题
多个线程共享同一数据,当某一线程执行多条语句时,其他线程也执行进来,导致数据在某一语句上被多次修改,执行到下一语句时,导致错误数据的产生。
原理:某一时间只让某一线程执行完操作共享数据的所有语句。
办法:使用锁机制:synchronized或lock对象
线程的同步
当两个或两个以上的线程需要共享资源,他们需要某种方法来确定资源在某一刻仅被一个线程占用,达到此目的的过程叫做同步(synchronization)。
同步代码块:synchronized(对象){},将需要同步的代码放在大括号中,括号中的对象即为锁。
同步函数:放于函数上,修饰符之后,返回类型之前。
==和equals的区别
1)对于==,比较的是值是否相等
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
Object和String的==和equals没有区别,都是比较的值
ArrayList的自动扩容
看底层,它默认是10个容量,当第11个值插入,就会自动扩容,底层是数组
Java六个设计原则
1单一职责原则
一个类应该是一组相关性很高的方法,数据封装。
2开闭原则
对于扩展是开放的,对于修改是封闭的。
3里氏替换原则
引用基类的地方必需能透明的使用其子类的对象。
4依赖倒置原则
高层模块不应该依赖低层模块,细节应该依赖抽象,抽象不应该依赖细节。
5接口隔离原则
客户端不应该依赖它不需要的接口。
6迪米特原则
一个类应该对自己需要耦合或者调用的类有最少的了解。
为什么需要配置文件?
在我们的实际开发中,很多组件是要频繁调用的,我们为了方便开发写在配置文件中。频繁修改的组件也方便修改
SpringMVC五大核心组件
1.DispatcherServlet 请求入口
2.HandlerMapping 请求派发,负责请求和控制器建立一一对应的关系
3.Controller 处理器x
4.ModelAndView 封装模型信息和视图信息
5.ViewResolver 视图处理器,定位页面
JAVA常见的运行时异常
ArrayStoreException 由于数组存储空间不够引起的异常;
NullPointerException 空指针异常,程序试图访问一个空的数组中的元素或访问空的对象中的方法或变量时产生异常;
IndexOutOfBoundsExcention 索引越界异常,由于数组下标越界或字符串访问越界引起异常;
ConcurrentModificationException 并发修改异常;
NoSuchElementException 找不到元素异常;
UnsupportedOperationException 不支持请求异常;
synchronized 修饰在 static方法和非static方法的区别
static的方法属于类方法,它属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static获取到的锁,是属于类的锁。而非static方法获取到的锁,是属于当前对象的锁。
AOP的五种增强方式
前置增强 后置增强 环绕增强 返回增强 异常增强
TCP连接
TCP三次握手四次断开
属性值在堆里,对象在栈里,堆存放的是对象和数组
JAVA的字节流与字符流
字节流直接操作文件,字符流是先把文件放在缓存,通过缓冲区操纵文件
都是操纵字节流,字符流是因为可视化,字节不可见
1.Java的字节流
InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。
2.Java的字符流
Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
InputStream,OutputStream,Reader,writer都是抽象类。所以不能直接new
字节和字符的区别
字节是存储容量的基本单位,字符是数子,字母,汉子以及其他语言的各种符号。1字节=8个二进制单位:一个一个字符由一个字节或多个字节的二进制单位组成。
基本类型和引用类型的区别
基本类型保存原始值,引用类型保存的是引用值(引用值就是指对象在堆中所处的地址)
Java的四个基本特性及多态的理解
java的四个基本特性:封装继承多态抽象
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象行为和行为抽象两个方面/抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
继承:继承是从已有类得到继承的信息创建新类的过程,提供继承信息的类被称为父类;得到继承信息的类被称为子类。继承让父类有了一定的延续性,同时继承也是我们进行封装操作时可变性的重要手段
封装:
count(*)、count(1)和count(列名)的区别
1、执行效果上:
l count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL
l count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL
l count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。
2、执行效率上:
l 列名为主键,count(列名)会比count(1)快
l 列名不为主键,count(1)会比count(列名)快
l 如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
l 如果有主键,则 select count(主键)的执行效率是最优的
l 如果表只有一个字段,则 select count(*)最优。
幂等性
HTTP幂等方法,是指无论调用多少次都不会有不同结果的HTTP方法,无论调用一百次一千次结果都是相同的
转发与重定向的五点区别
1.请求次数 重定向:2次 转发1次
2.url地址栏 重定向:最终页面 转发:中间的处理页面
3.位置:客户端VS服务器 重定向:客户端主动发起 转发:服务器内部
4.速度: 重定向速度慢 转发:快
5.能否跨站跳转:重定向是可以的 转发是不可以的
POJO:entity
BO:Service
VO:
代表值对象的意思,通常用于业务层之间的数据传递,由new创建,由GC回收。
主要体现在视图的对象,对于一个WEB页面将整个页面的属性封装成一个对象,然后用一个VO对象在控制层与视图层进行传输。与页面的交互,
相当于前台传到后台的数据
vo和po的区别
例如 数据库有一个用户表(id, username,password,age),我们需要把它显示在页面上那么 po 的属性应该包括 id,username,password,age,表中所有的字段;但是vo中就不能包含password这种敏感属性,不应该在页面上显示。
drop,delete,truncate的区别
drop是删除表结构的
delete是删除表数据的
truncate是清空整个表
@Repository、@Service、@Controller 、@Component
将类标识为Bean
@Repository在dao层
@Service Service在实现类
@Controller 在Controller
@Component 在Service
@RestController:Controller+Responsbody@NotNull:加在变量上可以校验不能为空
https://blog.csdn.net/woheniccc/article/details/79804600@Value的注解
@Autowired 与@Resource的区别:
1、@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
2、 @Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false)
3、@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
Spring Boot是什么,解决哪些问题
1) Spring Boot使编码变简单
2) Spring Boot使配置变简单
3) Spring Boot使部署变简单
4) Spring Boot使监控变简单
SpringBoot是伴随着Spring4.0诞生的;
从字面理解,Boot是引导的意思,因此SpringBoot帮助开发者快速搭建Spring框架;
SpringBoot帮助开发者快速启动一个Web容器;
SpringBoot继承了原有Spring框架的优秀基因;
SpringBoot简化了使用Spring的过程。
HTTP协议的8种请求类型
1、OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可利用向Web服务器发送'*'的请求来测试服务器的功能性。
2、HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
3、GET:向特定的资源发出请求。
4、POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
5、PUT:向指定资源位置上传其最新内容。
6、DELETE:请求服务器删除Request-URI所标识的资源。
7、TRACE:回显服务器收到的请求,主要用于测试或诊断。
8、CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
什么是分布式
1、应用可以按业务类型拆分成多个应用,再按结构分成接口层、服务层;我们也可以按访问入口分,如移动端、PC端等定义不同的接口应用;
2、数据库可以按业务类型拆分成多个实例,还可以对单表进行分库分表;
3、增加分布式缓存、搜索、文件、消息队列、非关系型数据库等中间件;
很明显,分布式系统可以解决集中式不便扩展的弊端,我们可以很方便的在任何一个环节扩展应用,就算一个应用出现问题也不会影响到别的应用。
数据库的ACID
原子性
一致性
隔离性
持久性
action是单实例还是多实例,为什么
struts2中action是多例的,即一个session产生一个action
背景:
1) Struts2会对每一个请求,产生一个Action的实例来处理.
2) Spring的Ioc容器管理的bean默认是单实例的.
首先从数据安全性的问题上考虑,我们的Action应该保证是多例的,这样才不会出现数据问题。但是如果有的action比如只有admin才能操作,或者某些action,全站公用一个来提高性能,这样的话,就可以使用单例模式。
不过幸好,Spring的bean可以针对每一个设置它的scope,所以,上面的问题就不是问题了。如果用单例,就在spring的action bean配置的时候设置scope=”prototype”
如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修改时间不同,两个用户访问得到的属性不一样,操作得出的结果不一样.
举个例子:有一块布长度300cm,能做一件上衣(用掉100cm)和一件裤子(用掉200cm);甲和乙同时访问得到的长度都是300cm,
甲想做上衣和裤子,他先截取100cm去做上衣,等上衣做完再去做裤子,而乙这时正好也拿100cm去做上衣,那好,等甲做完上衣再做裤子的时候发现剩下的布(100cm)已经不够做裤子了…..这就是影响系统的性能,解决的办法就是给甲和乙一人一块300cm的布,就不会出现布被别人偷用的事情,也是就单实例和多实例的区别
如果设置成单例,那么多个线程会共享一个ActionContext和ValueStack,这样并发访问的时候就会出现问题了
struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。所以Struts2的Action是多例模式的。
问题出现了,可以让Struts2的action变成单例模式么?
Struts2中,可以使用注解开发,在Action上@Scope(“prototype”) 指定为多例 , 默认为singleton()单例)
基本上action的scope需要是prototype,就是每次请求都建立新的线程
不写的话,默认是singleton了
JSP九大内置对象详解
1.PageContext javax.servlet.jsp.PageContext JSP的页面容器
2.requestjavax.servlet.http.HttpServletrequest 获取用户的请求信息
3.response javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
4.session javax.servlet.http.HttpSession 用来保存每一个用户的信息
5.application javax.servlet.ServletContext 表示所有用户的共享信息
6.config javax.servlet.ServletConfig 服务器配置信息,可以取得初始化参数
7.out javax.servlet.jsp.jspWriter 页面输出
8.page java.lang.object)
9.exception java.lang.Throwable
四种属性范围:
page(pageContext):只在一个页面中保存属性。 跳转之后无效。
request:只在一次请求中有效,服务器跳转之后有效。 客户端跳无效
session:再一次会话中有效。服务器跳转、客户端跳转都有效。 网页关闭重新打开无效
application:在整个服务器上保存,所有用户都可使用。 重启服务器后无效
数据库的三大范式
什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些
规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。
数据库三大范式是什么
第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。
项目中找到的Spring中的切面编程最多的地方:
声明式事务管理:
1.定义一个事务管理
2.配置事务特性(相当于声明通知。一般在业务层的类的一些方法上定义事务)
3.配置哪些类的哪些方法需要配置事务(相当于切入点。一般是业务类的方法上)
SpringBoot的核心注解
springboot的核心就是注解。springboot通过各种组合注解,极大地简化了spring项目的搭建和开发。
@Configuration
用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
@Conditional
@Conditional是spring4就提供出来的基于条件的注解。该注解可以根据是否满足某一个特定条件来决定是否创建某个特定的Bean。
比如可以通过@Conditional注解来实现只有当某个Bean被已创建时(存在时)才会创建另外一个Bean,这样就可以依据这一特定的条件来控制Bean的创建行为,这样的话我们就可以利用这样一个特性来实现一些自动的配置。
@Conditional是springboot实现自动配置的关键基础能力。在此基础上,springboot又创建了多个适用于不同场景的组合条件注解。
@ConditionalOnBean:当上下文中有指定Bean的条件下进行实例化。@ConditionalOnMissingBean:当上下文没有指定Bean的条件下进行实例化。@ConditionalOnClass:当classpath类路径下有指定类的条件下进行实例化。@ConditionalOnMissingClass:当类路径下没有指定类的条件下进行实例化。@ConditionalOnWebApplication:当项目本身是一个Web项目时进行实例化。@ConditionalOnNotWebApplication:当项目本身不是一个Web项目时进行实例化。@ConditionalOnProperty:当指定的属性有指定的值时进行实例化。@ConditionalOnExpression:基于SpEL表达式的条件判断。@ConditionalOnJava:当JVM版本为指定的版本范围时进行实例化。@ConditionalOnResource:当类路径下有指定的资源时进行实例化。@ConditionalOnJndi:在JNDI存在时触发实例化。@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化。具体用法还要具体查看文档或源码
@SpringBootApplication
这是SpringBoot最核心的注解。当然也是个组合注解。
springboot最常见三个注解
1、@RestController and @RequestMapping是springMVC的注解,不是springboot特有的
2、@RestController = @Controller+@ResponseBody
3、@SpringBootApplication = @Configuration+@EnableAutoConfiguration+@ComponentScan