8.29
1.抽象类和接口的异同
答:
相同点:都不能创建对象,都可以有抽象方法
不同点:抽象类中也可以有普通方法,接口中都是抽象方法;抽象类单继承,接口多实现;抽象类中可以定义属性,接口中只能有常量;
2.线程安全的单例模式(延迟初始化方式)
public class Singleton {
private static volatile Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
if (instance == null){
synchronized (Singleton.class){
if (instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
3.实现多线程的方式
答:
1)继承Thread类
2)实现Runnable接口
3)实现Callable接口
4.get和post区别
答:
form 中的get和post 方法,在数据传输过程中分别对应HTTP协议中的GET和POST方法
Get将表单中数据按照variable=value 的形式,添加到action所指向的URL 后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form 的数据体中,按照变量和值相对应的方式,传递到action所指向URL;
Get是不安全的,因为在传输过程,数据被放在请求的URL 中;Post的所有操作对用户来说都是不可见的;
Get传输的数据量小,这主要是因为受URL长度限制;而Post可以传输大量的数据,所以在上传文件只能使用Post;
Get限制Form 表单的数据集必须为ASCII字符,而Post支持整个ISO10646字符集;
5.redis常用的数据类型
答:
string以key value形式存储
hash 以key field value形式存储
set 是无序集合
list有序列表,可以在表头和表尾插入数据
zset(sortedSet) 有序集合 key score member 元素可以根据score进行排序
6.sleep和wait的区别
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify⽅方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态相同点在于都会造成线程阻塞.
7.sql语句 考聚合函数,分组,where和having
========================
8.30
1.String 、StringBuilder、StringBuffer之间的区别
答:String 字符串常量是不可变的,它的底层是final char value[]存储值。每一次赋值或拼接都会创建一个新的对象,开辟新的空间。
StringBuilder和StringBuffer底层是char[] value;拼接字符串是操作数组。StringBuffer线程安全,StringBuilfer是非线程安全的。StringBuilfer效率大于StringBuffer
2.数据库查询中,左连接和右连接、内连接的差别
left join 如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
right join 如果右表的某行在左表中没有匹配行,则将为左表返回空值。
inner join 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行
3.int和Integer的区别
答:
1)Integer是int的包装类,int则是java的一种基本数据类型
2)Integer变量必须实例化后才能使用,而int变量不需要
3)Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4)Integer的默认值是null,int的默认值是0
5)对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false
4.Spring事务的隔离级别
答:
1)DEFAULT 默认的隔离级别,使用数据库默认的事务隔离级别.
未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生
2)已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生
3)可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.
4)串行化的 (serializable) :避免以上所有读问题.
=======================
8.31
1.SpringBean的生命周期
答:
1)调用构造方法实例化一个Bean;
2)实现ioc注入;
3)如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName方法,此处传递的就是Spring配置文件中Bean的id值
4)如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory传递的是Spring工厂自身
5)如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext方法,传入Spring上下文
6)如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;
7)如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
8)如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization方法;
9)当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法
10)最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
2.jsp九大内置对象
1)request对象
request 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。
2)response对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。
3)session对象
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
4)application对象
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。
5)out 对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。
6)pageContext 对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。
7)config 对象
config 对象的主要作用是取得服务器的配置信息。
8)page 对象
page 对象代表JSP本身,只有在JSP页面内才是合法的。
9)exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用
3.volatile作为java中的关键词之一,用以声明变量的值可能随时会别的线程修改,使用volatile修饰的变量会强制将修改的值立即写入主存,主存中值的更新会使缓存中的值失效(非volatile变量不具备这样的特性,非volatile变量的值会被缓存,线程A更新了这个值,线程B读取这个变量的值时可能读到的并不是是线程A更新后的值)。volatile会禁止指令重排。
4.ConcurrentHashMap
答:ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。这里“按顺序”是很重要的,否则极有可能出现死锁,在ConcurrentHashMap内部,段数组是final的,并且其成员变量实际上也是final的,但是,仅仅是将数组声明为final的并不保证数组成员也是final的,这需要实现上的保证。这可以确保不会出现死锁,因为获得锁的顺序是固定的。
ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构, 一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素, 每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。
===============================
9.1
1.SpringMVC执行流程
1)WEB 容器将该请求转交给 DispatcherServlet 处理
2)DispatcherServlet 接收到请求后, 将根据 请求信息 交给 处理器映射器 (HandlerMapping)
3)HandlerMapping 根据用户的url请求 查找匹配该url的 Handler,并返回一个执行链
4)DispatcherServlet 再请求 处理器适配器(HandlerAdapter) 调用相应的 Handler 进行处理并返回 ModelAndView 给 DispatcherServlet
5)DispatcherServlet 将 ModelAndView 请求 ViewReslover(视图解析器)解析,返回具体 View
6)DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)
7)DispatcherServlet 将页面响应给用户
2.Mybatis中 #{}和${}区别
答:
{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。
${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
使用#可以很大程度上防止sql注入
3.nginx负载均衡策略
答:
轮询 :每个请求按时间顺序逐一分配到不同的后端服务器
权重 :指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
ip_hash :每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题
url_hash :按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器时比较有效。
fair (第三方插件)按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4.为什么做动静分离
答:在软件开发中,有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等⽂文件)这些不需要经过后台处理的文件称为静态文件,静态文件会增加后台请求次数。
在我们对资源的响应速度有要求的时候,我们应该使用动静分离的策略。动静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问,我们将静态资源放到nginx中,动态资源转发到tomcat服务器中
5.负载均衡
答:负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中。负载均衡主要解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力
======================
9.3
1.HashMap数据结构是什么?为什么这么设计HashMap?
是数组+链表结构+红黑树,因为综合了数组跟链表的优点,首先可根据数组下标快速查询到对应元素,而使用链表的优点是,计算出key的hash值后根据下标查找到插入位点后,快速进行插入,删除这样保证了插入,删除的速度。所以链表HashMap采用链表+数组的数据结构,结合了两者优点
当数组长度达到64,链表长度达到8,链表转红黑树,查找快。红黑树的时间复杂度是O(log(n)),红黑树弥补了平衡二叉树的缺点(b-Tree存在两个子节点长度大小不一,如左树长度远远大于右树,如果长度太长,那这个结构的查询 就相当于线性表了),红黑树保证了,任何子节点到根节点的长度都是相同的
2.乐观锁悲观锁如何理解?如何实现的?优缺点是什么
悲观锁认为,查询就是为了修改,必须要锁住,不管我修改不修改,在我事务未提交之前,我不允许其他线程对我的数据进行任何操作,只有我的事务提交,或回滚我才释放锁。实现是在sql后面加for update
乐观锁认为,我不关心你查询是为了什么,放心大胆的让线程去操作,出了问题再处理,它的实现方式是在表里加一个version字段 查询时查version,修改时version最为条件。
=========================
9.4
1.aop的实现原理
Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。
如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
由 AOP 框架动态生成的一个对象,该对象可作为目标对象使用。AOP 代理包含了目标对象的全部方法,但 AOP 代理中的方法与目标对象的方法存在差异,AOP 方法在特定切入点添加了增强处理,并回调了目标对象的方法。
2.Lock与Synchronize的区别
1)获取和释放锁的作用域范围
synchronized 方法或语句的使用提供了对与每个对象相关的隐式监视器锁的访问,但却强制所有锁获取和释放均要出现在一个块结构中
Lock 接口的实现允许锁在不同的作用范围内获取和释放
2)获取和释放锁的顺序
synchronized当获取了多个锁时,它们必须以相反的顺序释放,且必须在与所有锁被获取时相同的词法范围内释放所有锁。
Lock允许以任何顺序获取和释放多个锁,从而支持使用这种技术。
3)多线程访问
锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。不过,某些锁可能允许对共享资源并发访问,如 ReadWriteLock 的读取锁。 而synchronized不支持
3.springboot的部署如何区分开发环境和生产环境
application.properties是SpringBoot默认加载的,全局配置,则全部放在这里,假如有需要不同环境,配置不同的参数,比如日志、数据源,则放在不同的properties文件下面,在application.properties上面配置一句话即可:
开发/测试/生产环境分别对应dev/test/prod
spring.profiles.active=dev
4.简述 Shiro 的核心组件
Shiro 架构 3 个核心组件:
Subject: 正与系统进行交互的人, 或某一个第三方服务.
所有 Subject 实例都被绑定到(且这是必须的)一个SecurityManager 上。
SecurityManager: Shiro 架构的心脏, 用来协调内部各安全组件, 管理内部组件实例, 并通过它来提供安全管理的各种服务.
当 Shiro 与一个 Subject 进行交互时, 实质上是幕后的 SecurityManager 处理所有繁重的 Subject 安全操作。
Realms: 本质上是一个特定安全的 DAO. 当配置 Shiro 时, 必须指定至少一个 Realm 用来进行身份验证和/或授权.
Shiro 提供了多种可用的 Realms 来获取安全相关的数据. 如关系数据库(JDBC), INI 及属性文件等.
可以定义自己 Realm 实现来代表自定义的数据源。
5、MyBatis编程步骤是什么样的?
① 创建SqlSessionFactory
② 通过SqlSessionFactory创建SqlSession
③ 通过sqlsession执行数据库操作
④ 调用session.commit()提交事务
⑤ 调用session.close()关闭会话
============================
9.5
1.在实际项目中如何解决并发问题?
大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。HTML静态化、图片服务器分离、数据库集群、库表散列、缓存、镜像、负载均衡、CDN加速技术。
2.运行时异常和一般异常有何异同
Java提供了两类主要的异常:运行时异常runtime exception和一般异常checked exception。checked 异常。对于后者这种异常,JAVA要求程序员对其进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。
运行时异常我们可以不处理。这样的异常由虚拟机接管。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
3.什么是值传递和引用传递
答: 值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。 所以对引用对象进行操作会同时改变原对象.
4.谈谈对 mvc 的认识
由模型(model),视图(view),控制器(controller)完成的应用程序由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;
MVC 是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用 MVC 应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。视图是用户看到并与之交互的界面。模型表示企业数据和业务规则。控制器接受用户的输入并调用模型和视图去完成用户的需求。
MVC 的优点:低耦合性、高重用性和可适用性、较低的生命周期成本、快速的部署、可维护性、可扩展性,有利于软件工程化管理
MVC 的缺点:没有明确的定义,完全理解 MVC 并不容易。不适合小型规模的应用程序。
5.sendRedirect()和forward()方法有什么区别?
sendRedirect()方法会创建一个新的请求,而forward()方法只是把请求转发到一个新的目标上。重定向(redirect)以后,之前请求作用域范围以内的对象就失效了,因为会产生一个新的请求,而转发(forwarding)以后,之前请求作用域范围以内的对象还是能访问的。一般认为sendRedirect()比forward()要慢。
==================
9.5
1.什么是cookie?session和cookie有什么区别?
cookie是Web服务器发送给浏览器的一块信息。浏览器会在本地文件中给每一个Web服务器存储cookie。以后浏览器在给特定的Web服务器发请求的时候,同时会发送所有为该服务器存储的cookie。下面列出了session和cookie的区别:
session能够存储任意的Java对象,cookie只能存储String类型的对象。
session是存储在服务端的,cookie是存储在浏览器端的。
2.解释下Servlet的生命周期。
对每一个客户端的请求,Servlet引擎载入Servlet,调用它的init()方法,完成Servlet的初始化。然后,Servlet对象通过为每一个请求单独调用service()方法来处理所有随后来自客户端的请求,最后,调用destroy()方法销毁。
3.Spring有哪些优点?
轻量级:Spring在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB。
控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。
面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。
容器:Spring包含并管理应用程序对象的配置及生命周期。
MVC框架:Spring的web框架是一个设计优良的web MVC框架,很好的取代了一些web框架。
事务管理:Spring对下至本地业务上至全局业务提供了统一的事务管理接口。
异常处理:Spring提供一个方便的API将特定技术的异常(由JDBC, Hibernate, 或JDO抛出)转化为一致的、Unchecked异常
4.如果我的网站用的 utf-8 编码,为防止乱码出现,都需要注意哪些地方?
1)数据库中库和表都用 utf8 编码
2)java连接 mysql,指定数据库编码为 utf8 ;
3)java文件指定编码为 utf-8
4)网站下所有文件的编码为 utf8
5)html 文 件 指 定 编 码 为 utf-8
5.什么是Spring的依赖注入?有哪些不同类型的IOC(依赖注入)方式?
依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
什么是可重复锁 为什么要用可重复锁
juc中常见的线程安全集合
java的内存划分
hashmap底层结构
gc标记和收集的算法
同步锁和lock的区别
新生代转为老年代的标准 为什么是这个值
网友评论