java面试总结

一. 常问知识点:
集合、线程、GC、jvm
sql、索引、优化
spring、springboot、spring cloud、mybatis、redis、springMVC、hibernate

二.笔试(考题来源普通公司)

1.hashcode()的作用
根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。解决了向含有大量数据的集合中添加元素时,大量频繁的操作equals方法的问题。

2.为什么需要重写equals方法
默认equals在比较两个对象时,是看他们是否指向同一个地址的。但有时,希望两个对象只要是某些属性相同就认为他们的quals为true。比如:
Student s1 = new Student(1,“name”); Student s2 = new Student(1,“name”);
如果不重写equals的话,他们是不相同的,因为引用s1和s2指向的堆内存地址显然不一样,所以我们要重写equals。
a. 在java应用程序运行时,无论何时多次调用同一个对象时的hsahCode()方法,这个对象的hashCode()方法的返回值必须是相同的一个int值
b. 如果两个对象equals()返回值为true,则他们的hashCode()也必须返回相同的int值
c. 如果两个对象equals()返回值为false,则他们的hashCode()返回值也必须不同
定义类时,我们经常会希望两个不同对象的某些属性值相同时就认为他们相同,所以我们要重写equals()方法,按照原则,我们重写了equals()方法,也要重写hashCode()方法,要保证上面所述的b,c原则;所以java中的很多类都重写了这两个方法,例如String类,包装类。
当我们自定义的一个类,想要把它的实例保存在集合中时,我们就需要重写这两个方法。
简单来说,重写equals和hashcode必要性:
如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等
其实简单的说就是为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的

3.sleep和wait的区别
自不同的类分别是Thread和Object
sleep方法没有释放锁,而wait方法释放了锁
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
yield()方法是停止当前线程,让同等优先权的线程或更高优先级的线程有执行的机会。如果没有的话,那么yield()方法将不会起作用,并且由可执行状态后马上又被执行。
join方法是用于在某一个线程的执行过程中调用另一个线程执行,等到被调用的线程执行结束后,再继续执行当前线程

4.forward和redirect的区别
是服务器内部的重定向,服务器直接访问目标地址的 url网址,把里面的东西读取出来,但是客户端并不知道,因此用forward的话,客户端浏览器的网址是不会发生变化的。
关于request: 由于在整个定向的过程中用的是同一个request,因此forward会将request的信息带到被重定向的jsp或者servlet中使用。
是客户端的重定向,是完全的跳转。即服务器返回的一个url给客户端浏览器,然后客户端浏览器会重新发送一次请求,到新的url里面,因此浏览器中显示的url网址会发生变化。 因为这种方式比forward多了一次网络请求,因此效率会低于forward

5.Class.forName的作用
class.forName就是其中一种,它会让jvm对指定的类执行加载、连接、初始化操作,其结果是会在方法区中为该类生成一个class对象作为访问类型信息的入口,还会为类的类变量分配空间并赋值。
6.TreadLocalMap和ThreadLocal
ThreadLocal类用于存储以线程为作用域的数据,线程之间数据隔离。
ThreadLocalMap类是ThreadLocal的静态内部类,通过操作Entry来存储数据。
一句话理解ThreadLocal:向ThreadLocal里面存东西就是向它里面的Map存东西的,然后ThreadLocal把这个Map挂到当前的线程底下,这样Map就仅仅属于这个线程。
ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景

7.数据连接池的工作机制
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其标记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

8.将一个编码为ISO8859-1的字符串转化为一个编码为GBK
dst=new String(src,“GBK”).getBytes(“UTF-8”)
new String(s.getBytes(“GB2312”),“iso-8859-1”);

9.百万级数据查询
select * from Customer limit 10,5;–检索从第10行开始向前加5条数据,共显示id为11,12…15
select * from news
where id > (select id from news order by id desc limit 1000000, 1)
order by id desc
limit 0,10

select * from news
where cate = 1 and id > (select id from news where cate = 1 order by id desc limit 500000,1 )
order by id desc
limit 0,10 加上条件后极慢,可以建个索引表news2
10.switch的参数
jdk1.7版本以后,参数类型除了short、byte、int、char外,String、Integer类、 Character类、枚举类型都可以正常运行。而long、double、float依旧会报错
11.object转换
用Object,任何对象都能转换成Object,而Object又可以转换任何对象,一个List类型的对象listObject,
Object ob = (Object) listObject; Lsit listUser = (Lsit)ob ;

12.实现多线程的方式,线程同步的方式
1.继承Thread类,重写run方法
2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
3.通过Callable和FutureTask创建线程,有返回值,方法体是call
4.通过线程池创建线程
wait和notify,synchronized关键字
volatile,在多线程环境下,一个线程对共享变量的操作对其他线程是不可见的。Java提供了volatile来保证可见性,当一个变量被volatile修饰后,表示着线程本地内存无效,当一个线程修改共享变量后他会立即被更新到主内存中,其他线程读取共享变量时,会直接从主内存中读取。当然,synchronize和Lock都可以保证可见性。synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。对volatile变量的单次读/写操作可以保证原子性的,如long和double类型变量,但是并不能保证i++这种操作的原子性,因为本质上i++是读、写两次操作。
第二个特性,禁止指令重排。即执行到volatile变量时,其前面的所有语句都执行完,后面所有语句都未执行。且前面语句的结果对volatile变量及其后面语句可见。在JVM底层volatile是采用“内存屏障”来实现的。

13.webservice是什么,特点
WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
WebService的主要目标是跨平台的可互操作性。为了达到这一目标,WebService完全基于XML、XSD (XMLSchema)等独立于平台、独立于软軟件供应商的标准,是创建可互操作的、分布式应用程序的新平台。带来的好处是应该程序集成、跨防火墙通信、B2B集成及软件重用。从这些可以看出WebService主要是通过Web的推进互操作及远程调用最好用。而对于单机程序不会还来什么好处。
XML,SOAP和WSDL就是构成WebService平台的三大技术
WebService采用Http协议来在客户端和服务端之间传输数据。WebService使用XML来封装数据,XML主要的优点在于它是跨平台的。

WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议规定的。

WebService服务器端首先要通过一个WSDL文件来说明自己有什么服务可以对外调用。简单的说,WSDL就像是一个说明书,用于描述WebService及其方法、参数和返回值。 WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者

14.主键和索引的区别
主键是表中的一个或多个字段,它的值用于惟一地标识表中的某一条记录.且不能为空;
索引是对数据库表中一列或多列的值进行排序的一种结构,只有当经常查询索引列中的数据时,才需要在表上创建索引,使用索引可快速访问数据库表中的特定信息。
索引占用磁盘空间,并且降低添加、删除和更新行的速度。当然索引也有好处就是查询速度快
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
唯一性索引列允许空值,而主键列不允许为空值。
主键列在创建时,已经默认不为空值 + 唯一索引了。
主键可以被其他表引用为外键,而唯一索引不能。
一个表最多只能创建一个主键,但可以创建多个唯一索引。
主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
建立索引常用的规则如下:
表的主键、外键必须有索引;
数据量超过300的表应该有索引;
经常与其他表进行连接的表,在连接字段上应该建立索引;
经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
索引应该建在选择性高的字段上;
索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
频繁进行数据操作的表,不要建立太多的索引;
删除无用的索引,避免对执行计划造成负面影响

15.springIOC理解
ioc是一种思想,传统直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;
DI组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。
●谁依赖于谁:当然是应用程序依赖于IoC容器;
  ●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
  ●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
  ●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)
  IOC原理:
   Spring中的IoC的实现原理就是工厂模式加反射机制.使用反射机制实现的工厂模式可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类,所以我们通过属性文件的形式配置所需要的子类.
   可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言提供的反射机制,根据配置文件中给出的类名生成相应的对象.
  IoC容器启动的三个基本过程
1)Resource资源信息定位
2)BeanDefinition的载入(将资源中的信息初始化为BeanDefinition对象)
3)向IoC容器注册生成的BeanDefinition对象
bean容器的启动阶段:
读取bean的xml配置文件,将bean元素分别转换成一个BeanDefinition对象。
然后通过BeanDefinitionRegistry将这些bean注册到beanFactory中,保存在它的一个ConcurrentHashMap中。
将BeanDefinition注册到了beanFactory之后,在这里Spring为我们提供了一个扩展的切口,允许我们通过实现接口BeanFactoryPostProcessor 在此处来插入我们定义的代码。典型的例子就是:PropertyPlaceholderConfigurer,我们一般在配置数据库的dataSource时使用到的占位符的值,就是它注入进去的。

简单总结一下IoC容器的bean生命周期

1)Bean实例的创建
2)为Bean实例设置属性
3)调用Bean的初始化接口方法
4)应用可以通过IoC容器获取bean
5)当容器关闭时,调用Bean的销毁方法

	AOP:面向切面,扩展功能时不通过源代码,横向抽取机制.
	有接口的情况:创建接口的实现类的代理对象,jdk动态代理;没有接口的情况:创建User类的子类的代理对象,cglib动态代理

16.string,stringbuffer,stringbulider
速度:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
安全:StringBuilder是线程不安全的,而StringBuffer是线程安全的
String:适用于少量的字符串操作的情况
  StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
  StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

 string转化int转化:int a = Integer.parseInt(str);int b = Integer.valueOf(str).intValue()
 转string:String s = String.valueOf(i);

17.spring用到了那些设计模式
单例:保证一个类仅有一个实例,并提供一个访问它的全局访问点BeanFactory。Spring默认将所有的Bean设置成 单例模式,即对所有的相同id的Bean的请求,都将返回同一个共享的Bean实例。这样就可以大大降低Java创建对象和销毁时的系统开销。使用Spring将Bean设置称为单例行为,则无需自己完成单例模式。
工厂:Spring容器就是实例化和管理Bean的工厂;BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象。
代理:为其他对象提供一种代理以控制对这个对象的访问,spring的Proxy模式在aop中有体现
观察者:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。常用的地方是listener的实现。如ApplicationListener

18.左连接和右连接
左连接的定义:是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。
内连接:inner join on,返回两个表的交集

19单例模式
代理模式
工厂模式

20.微服务:微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分一组小的服务,每个服务运行在其独立的自己的进程中,服务之间相互协调、互相配合,为用户提供最总价值。务之间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API),每个服务都围绕着具体的业务进行构建,并且能够被独立的构建在生产环境、类生产环境等。
RPC,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务.RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源.是一个泛化的概念,严格来说一切远程过程调用手段都属于rpc范畴,包括rmi、hessian、soap、thrift、protobuf等等。
SOA,是一种思想,解决多服务凌乱问题,SOA架构解决数据服务的复杂程度,同时SOA又有一个名字,叫做服务治理,就是帮助我们把服务之间调用的乱七八糟的关系给治理起来,然后提供一个统一的标准(各系统的协议、地址、交互方式)。

REST可以看着是http协议的一种直接应用,默认基于json作为传输格式,使用简单,学习成本低效率高,但是安全性较低,而SOAP可以看着是一个重量级的协议,基于xml。基于 REST 的服务被称为 RESTful 服务.安全方面,是由于OAUTH的严谨性和安全性,现在OAUTH已成为RESTful架构风格中最常用的认证机制,和RESTful架构风格一起,成为企业级服务的标配。
SOAP:简单对象访问协议(Simple Object Access Protocol)是一种标准化的通讯规范,主要用于Web服务(web service)中。
RESTful架构风格的特点:
“资源”,就是网络上的一个实体,或者说是网络上的一个具体信息,资源总要通过某种载体反应其内容,文本可以用txt格式表现,也可以用HTML格式、XML格式表现,JSON是现在最常用的资源表示格式.
统一接口,数据的元操作,即CRUD(create, read, update和delete,即数据的增删查改)操作,分别对应于HTTP方法:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,这样就统一了数据操作的接口,仅通过HTTP方法,就可以完成对数据的所有增删查改工作
url,可以用一个URI(统一资源定位符)指向资源,即每个URI都对应一个特定的资源。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或识别符。
所谓无状态的,即所有的资源,都可以通过URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变。

MVC (Modle View Controller) 架构: 当业务规模很小时,将所有功能都部署在同一个进程中,通过双机或者前置负载均衡器实现负载分流;此时,用于分离前后台逻辑的 MVC 架构是关键。
RPC (Remote Procedure Call)架构:当垂直应用越来越多,应用之间交互不可避免,将核心和公共业务抽取出来,作为独立的服务,实现前后台逻辑分离。此时,用于提高业务复用及拆分的 RPC 框架是关键。
SOA (Service Oriented Architecture)架构:随着业务发展,服务数量越来越多,服务生命周期管控和运行态的治理成为瓶颈,此时用于提升服务质量的 SOA 服务治理是关键。
微服务架构:随着敏捷开发、持续支付、DevOps 理论的发展和实践,以及基于 Docker 等轻量级容器 (LXC) 部署应用和服务的成熟,微服务架构开始流行,逐渐成为应用架构的未来演进方向。通过服务的原子化拆分,以及微服务的独立打包、部署和升级,小团队敏捷交付,应用的交付周期将缩短,运营成本也将大幅下降

 SpringBoot和SpringCloud,请你谈谈对他们的理解?
1)、SpringBoot专注于快速方便的开发单个个体微服务。
2)、SpringCloud是关注全局的微服务协调、整理、治理的框架,它将SpringBoot开发的单体整合并管理起来。
3)、SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系

21.springboot热部署
spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。

22.spring cloud断路器
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内调用20次,如果失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand
服务降级,一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值。这样做,虽然水平下降,但好歹可用,比直接挂掉强

23.springMVC原理
用户发送请求至前端控制器DispatcherServlet。
DispatcherServlet收到请求调用HandlerMapping处理器映射器。
处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
DispatcherServlet调用HandlerAdapter处理器适配器。
HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
Controller执行完成返回ModelAndView。 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
ViewReslover解析后返回具体View。
DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
DispatcherServlet响应用户

24.jvm加载class文件的原理机制

  1. 装载:查找并加载类的二进制数据;
    2)链接:
    验证:确保被加载类的正确性;
    准备:为类的静态变量分配内存,并将其初始化为默认值;
    解析:把类中的符号引用转换为直接引用;
    3)初始化:为类的静态变量赋予正确的初始值;

25.jsp和servlet的区别
1.jsp经编译后就变成了Servlet.
(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。
而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

26.cookie和session的区别
cookie数据存放在客户的浏览器上,session数据放在服务器上;cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session;单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie;

27.过滤器和拦截器的区别
Filter 是在 Servlet 规范中定义的,是 Servlet 容器支持的。而拦截器是在 Spring容器内的,是Spring框架支持的
Filter 是被 Server(like Tomcat) 调用,Interceptor 是被 Spring 调用,因此 Filter 总是优先于 Interceptor 执行

28.spring的事务管理,事务隔离级别
事务特性(4种):
原子性 (atomicity):强调事务的不可分割.
一致性 (consistency):事务的执行的前后数据的完整性保持一致.
隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰
持久性(durability) :事务一旦结束,数据就持久到数据库

如果不考虑隔离性引发安全性问题:
脏读 :一个事务读到了另一个事务的未提交的数据
不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致.
虚幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.

解决读问题: 设置事务隔离级别(5种)
DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生
已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生
可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.
串行化的 (serializable) :避免以上所有读问题.

propagation_required 支持当前事务,如果不存在 就新建一个(默认)
propagation_supports 支持当前事务,如果不存在,就不使用事务
propagation_mandatory 支持当前事务,如果不存在,抛出异常

  • 保证没有在同一个事务中
    propagation_requires_new 如果有事务存在,挂起当前事务,创建一个新的事务
    propagation_not_supported 以非事务方式运行,如果有事务存在,挂起当前事务
    propagation_never 以非事务方式运行,如果有事务存在,抛出异常
    propagation_nested 如果当前事务存在,则嵌套事务执行

29.创建对象的几种方式
用new语句创建对象,这是最常用的创建对象的方式。
运用反射手段,调用Java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
调用对象的clone()方法。 不会调用构造方法
运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法. 不会调用构造方法

30.ajax的理解
AJAX就是在客户端申请页面时,在不重新加载整个页面的情况下,只对网页的局部进行更新的技术。使用了AJAX后,浏览器与服务器只会进行少量数据交换,这样页面的执行效率就会大幅提升.
核心是XMLHttpRequest拥有两个方法,open()和send()
过程:
1). 创建 XMLHttpRequest 对象,也就是创建一个异步调用对象
2). 创建一个新的 HTTP 请求,并指定该 HTTP 请求的方法、URL 及验证信息
3). 设置响应 HTTP 请求状态变化的函数
4). 发送 HTTP 请求
5). 获取异步调用返回的数据
6). 使用 JavaScript 和 DOM 实现局部刷新

31.JDBC链接
加载JDBC驱动程序,在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。
创建数据库的连接,使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得
创建一个preparedStatement,执行SQL语句,遍历结果集 。 Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate和execute
处理异常,关闭JDBC对象资源。

32.&和&&的区别
表示逻辑运输符and,&&的短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式

33.Spring Bean中为何有的地方要将scope属性设为prototype
设置为prototype之后,就会创建多个实例,可以理解为会new很多次。而singleton只会new一个实例
34.spring、springmvc、spring boot的注解及含义
@RestController:组合注解,这个注解相当于是@Controller和@RequestBody的组合注解,它的作用包含这两个。
可以返回视图或返回的结果是JSON格式
@RequestMapping:是用来处理请求映射的注解,他主要放在类上和方法上,放在类上就是所有请求的方法都是以这个来作为
父路径来请求的,作用方法上就是子路径映射
@RequestParam :获取请求参数的值
@ResponseBody
@EnableAutoConfiguration
@Configuration注解该类,等价与XML中配置beans;用@Bean标注方法等价于XML中配置bean
@ComponentScan,表示将该类自动发现扫描组件。如果扫描到有@Component、@Controller、@Service等这些注解的类,并注册为Bean,可以自动收集所有的Spring组件,包括@Configuration类。使用@ComponentScan注解搜索beans,并结合@Autowired注解导入

35.servlet的生命周期
加载。 容器通过类加载器使用servlet类对应的文件来加载servlet。
创建。通过调用servlet的构造函数来创建一个Servlet实例
初始化。通过调用init()方法来完成初始化工作。这个方法是在Servlet已被创建但向客户端提供服务之前调用的,注意!在一个Servlet的生命周期中 init()方法只会被调用一次。(servlet默认是单例多线程的)
处理客户请求。 servlet一旦被创建后,它就可以为客户端提供服务了。每当有新的请求到来时,容器就会创建一个新的线程来处理该请求,接着用service()方法来完成这个请求。当然,service()方法会根据请求的method属性值的不同来选择对应的方法来完成具体的响应。
卸载。容器在卸载Servlet之前要调用destroy()方法,让Servlet自己释放其占有的系统资源,一旦destroy()方法被调用,容器就不会再向这个Servlet发送任何请求消息了。

36.常见的异常及举例
NullPointerException: 空指针异常
ClassCastException: 类型强制转换异常
ArrayIndexOutOfBoundsException: 数组下标越界异常
ArithmeticException:算术运算异常
NumberFormatException: 数字格式异常
IllegalArgumentException - 传递非法参数异常

Error一般是指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常应用程序无法处理这些错误,因此应用程序不应该捕获Error对象,也无须在其throws子句中声明该方法抛出任何Error或其子类

37.web.xml的作用
web.xml主要用来配置Filter、Listener、Servlet等。但是要说明的是web.xml并不是必须的,一个web工程可以没有web.xml文件
38.你了解的框架及作用

39.hibernate有5个核心接口及其功能
Configuration接口:配置Hibernate,根启动Hibernate,创建SessionFactory对象。
  SessionFactory接口:初始化Hibernate,充当数据存储源的代理,创建Session对象。
  Session接口:负责保存、更新、删除、加载和查询对象。
  Transaction接口:管理事务。
  Query和Criteria接口:执行数据库查询。
mybatis的核心接口
SqlSessionFactoryBuilder:负责构建SqlSessionFactory,并且提供了多个build()方法的重载
SqlSessionFactory:创建SqlSession实例的工厂
SqlSession:用于执行持久化操作的对象

对比:
Hibernate与MyBatis都是通过SessionFactoryBuider由XML配置文件生成SessionFactory,由SessionFactory 生成Session,由Session来开启执行事务和SQL(Structured Query Language,结构化查询语言)语句。
Hibernate和MyBatis都支持JDBC(Java DataBase Connectivity,java数据库连接)和JTA(Java Transaction API,Java事务API(Application Programming Interface,应用程序编程接口))事务处理。
基于ORM(Object Relational Mapping, 对象关系映射)思想解决了entity和数据库的映射问题。
sql方面:mybaits通过mapper.xml维护映射结果,程序员手动编写sql相比hibernate自动生成hql(hibernate sql)更加灵活,sql调优更加容易(hibernate因为更好的封装性,开发效率提高的同时,sql语句调优要更费力,当然可以手动修改sql来优化,但是同时也会影响开发效率);hibernate的hql数据库移植性更好,体现在强壮性。hibernate在级联删除的时候效率低;数据量大, 表多的时候,基于关系操作会变得复杂。
缓存方面:mybatis和hibernate都可以使用第三方缓存,而hibernate相比maybatis有更好的二级缓存机制。

mybatis分为1级缓存和2级缓存,2级缓存在sessionfactory中,1级缓存在session中。

session中的缓存在session连接关闭并被连接池回收时清理,或者手动清理
sessionfactory中的缓存需要在mybatis配置文件中手动配置。适合放入二级缓存的数据:很少被修改的数据 ;不是很重要的数据,允许出现偶尔并发的数据;不会被并发访问的数据 ;常量数据

Session内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务)
由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别

40.关系型和非关系型数据库的区别
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈

非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等

1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。

41.TCP三次握手建立连接
第一次握手:客户端的应用进程主动打开,并向服务端发出请求报文段
第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文
第三次握手:客户端收到确认报文之后,通知上层应用进程连接已建立,并向服务器发出确认报文,其首部:ACK=1,ack=y+1。当服务器收到客户端的确认报文之后,也通知其上层应用进程连接已建立
43.为保证数据和表结构不变,数据库如何转换到另一个数据库

44.tomcat调优

45.MVC各部分都有哪些技术实现,如何实现?
MVC模式的目的就是实现Web系统的职能分工。
Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。
View层用于与用户的交互,通常用JSP来实现。
Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。

46.MySQL索引建立规则
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名 ON 表名(字段名) [USING 索引方法]
show index from 表名;
DROP INDEX 索引名 ON 表名

选择唯一性索引;
为经常需要排序、分组和联合操作的字段建立索引;
为常作为查询条件的字段建立索引;
限制索引的数目;
尽量使用数据量少的索引;
删除不再使用或者很少使用的索引;
最左前缀匹配原则,非常重要的原则;
索引列不能参与计算,保持列“干净”;
尽量选择区分度高的列作为索引。

47.tomcat常用的端口有哪些?
8005 关闭tomcat通信接口.使用8009 接受其他服务器转发过来的请求,与其他http服务器通信接口,用于http服务器集合
8080建立http连接 用,如浏览器访问.每个Tomcat需要上门一套端口。如果多个Tomcat安装在同一台操作系统上,需要分配3组3个端口,共9个不同的端口。
在哪个配置文件中指定jdk路径及jvm大小:tomcat/bin/setclasspath set JAVA_HOME="“和catalina中 CATALINA_OPTS=”"
48.jsp的九大内置对象和四大作用域
pageContext,当前jsp页面 页面加载–页面结束 page config
request,同一请求,请求–响应
session,同一会话,打开浏览器–关闭浏览器
application,当前web应用,web应用加载–web应用卸载
out,exception
七大动作:
jsp:forward 执行页面的转向,将请求处理转发到下一个页面
jsp:param 传递参数, 到达跳转页面可以通过 request.getParameter(“参数名”)方式取出参数值
jsp:include 包含动态页面
jsp:useBean Jsp中使用JavaBean的一种方式,作用域默认为page
jsp:setProperty 为对象设置属性值
jsp:getProperty 获取对象的属性值
jsp:plugin 在jsp中引入插件
49.值类型和引用类型的区别
值传递就是当参数是基本类型时,传递参数的值,比如传递i=10,真实传参时,把10赋值给了形参。;当参数是对象时,传递的是对象的值,也就是对象的首地址。就是把对象的地址赋值给形参.
50.redis
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存.Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。
Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上.
数据类型:String 一个键最大能存储512MB、List、Set、Sorted Set、hashes

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值