实习生面试题总结

文章目录

javaSE

面向对象编程的理解

OOP把对象作为程序的基本单元,也就是说,在面向对象编程的世界里,万事万物皆对象。一种事物对应一个类,事物的属性定义为变量,事物的行为写成方法,把封装好的对象对外提供访问,提高了软件的重用性、灵活性和扩展性。

什么是继承

就是给对象提供了从基类获取方法得能力,java中提供了extends关键字。好处是在不修改原类得情况下,给现存得类添加新特性

什么是多态

同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性

多态有什么好处?

大大提高程序的可复用性,提高可扩充性和可维护性

什么是抽象

抽象类就像定义了一个框架,其下所有的实现类必须按照这个框架来,而且强制规定实现类必须去实现抽象类的抽象方法

Error 和 Exception 的区别

Error 通常是灾难性的致命的错误,是程序无法控制和
处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程; Exception 通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。

什么情况下会内存溢出

内存泄漏定义(memory leak):一个不再被程序使用的对象或变量还在内存中占有存储空间。
一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。
编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来进行处理,当java对象不再被应用时,等到堆内存不够用时,jvm会进行垃圾回收,清除这些对象占用的堆内存空间,如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从Heap中获取足够的内存分配给对象,这时候就会导致内存溢出。而出现内存泄露的地方,一般是不断的往容器中存放对象,而容器没有相应的大小限制或清除机制。容易导致内存溢出。

集合

java集合

arrayList的使用
Add(“值”)在尾部插入,可以add(3,“值”)指定索引插入
Get(index),获取指定索引的值
IndexOf(“值”)获取这个值对应的索引
Remove(“值”),remove(index)
替换 set(“index”,xx)
查看集合是否包含 contains
获取大小 size()
清空list的所有值,heros.clear();
添加另一个list的所有的值
arrayList默认长度是10,一旦add的数据大于容量则会扩容原来的1.5倍

实现list接口都有这些方法

数组和list(集合)的区别

  1. 数组声明了它容纳的元素的类型,而集合不声明。
  2. 数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。
  3. 数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。
  4. 数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查都是最快的。

collection与collections有什么不同

  • javutil.Collection是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

  • java.util.Collections是一个包装类。它包含有各种有关集合操作的静态多态方法

List,Set,Map三者的区别?

List(对付顺序的好帮手):存储的元素是有序的、可重复的。

Set(注重独一无二的性质):存储的元素是无序的、不可重复的。

Map(用Key来搜索的专家):使用键值对(key-Value)存储,里面key-value映射的规则是Hash函数映射,一个key只能映射到一个Value。

Arraylist与LinkedList区别?

底层数据结构:ArrayList使用的是数组,LinkedList使用的是双向链表。
插入和删除是否受元素位置的影响:①ArrayList采用数组储存,所以插入和删除元素的时间复杂度受元素位置的影响。会将目标元素的后面所有元素进行移动。②LinkedList采用链表存储,所以插入和删除操作不受元素位置的影响。直接断开链表进行插入与删除,不必大规模操作之后的元素。
快速随机访问(查询)Arraylist效率更快,LinkedList效率慢(因为,尽管有使用索引获取元素的方法,内部实现是从起始点开始遍历,遍历到索引的节点然后返回元素)
ArrayList和LinkedList两者都实现了List接口,但是它们之间有些不同。

25另一种说法

ArrayList与Vector区别呢?为什么要用Arraylist取代Vector呢?

ArrayList和Vector底层都是Object[ ]数组。

Vector是线程安全的,就是说某一个时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性。但是实现同步需要很高的花费,因此,访问它比访问Arraylist慢。

HashMap和HashSet区别

HashSet底层是基于HashMap实现的。除了clone()、writeObject()、readObject()是HashSet自己不得不实现之外,其他方法都是直接调用HashMap中的方法。

HashMap和HashSet区别

HashSet底层是基于HashMap实现的。hashSet的大部分方法都是直接调用HashMap中的方法。
储存结构是不一样的,HashMap储存的是键值对,HashSet储存的是对象

HashSet如何检查重复(hashcode和euqals为什么要一起使用)

1.如果两个对象相等,则hashcode一定也是相同的

2.两个对象相等,对两个euqals方法返回true

3.两个对象有相同的hashcode值,他们也不一定是相等的

4.综上,equals()方法被覆盖过,则hashCode()方法也必须被覆盖

5.hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即时这两个对象指向相同的数据)

异常

Error与Exception的区别

Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。

Exception(异常)表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

throw和throws的区别

throw和throws都是在异常处理中使用的关键字,区别如下:

  • throw:指的是在方法中人为抛出一个异常对象(这个异常对象可能是自己实例化或者抛出已存在的);
  • throws:在方法的声明上使用,表示此方法在调用时必须处理异常。

==检查型异常(Checked Exception)与非检查型异常(Unchecked Exception)区别? ==

  • 所有的检查性异常都继承自java.lang.Exception;所有的非检查性异常都继承自java.lang.RuntimeEx ception。
  • 检查性异常和非检查性异常最主要的区别在于其处理异常的方式:检查性异常必须使用try catch或者throws等关键字进行处理,否则编译器会报错;非检查性异常一般是程序代码写的不够严谨而导致的问题,可以通过修改代码来规避。
  • 常见的运行时异常:空指针异常(NullPointerException)、除零异常(ArithmeticException)、数组越界异常(ArrayIndexOutOfBoundsException)等;
  • 常见的检查性异常:输入输出异常(IOException)、文件不存在异常(FileNotFoundException)、SQL语句异常(SQLException)等。

检查异常和不受检查异常

不受检查异常 为编译器不要求强制处理的异常, 检查异常 则是编译器要求必须处置的异常

javaweb

Servlet的生命周期

一般来讲,servlet只会初始化一次,也就是整个过程中只存在一个servlet对象,即便是有多次访问,依然只有一个对象,这个对象是可以复用的。服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf),该servlet对象去处理所有客户端请求,service(ServletRequest req,ServletResponse res)方法中执行,最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。

  • init方法只会调用一次,只是在创建servlet实例的时候才会创建
  • service方法,是进行数据处理的,只要接受了一次请求,就会被调用一次
  • destroy方法,销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象,同样也是调用一次
  • 在这里插入图片描述

Servlet多线程问题

一个servlet在服务器中只会存在一个实例,不论是有多少访问,都掉用的同一个实例,也就是单实例多线程的.这就存在着一定的线程安全问题,比如说,我在servlet中定义了一个全局变量,那么这个变量的值很有可能不是我期待的值,所以,在servlet中要尽量避免使用全局变量.

Servlet中重要的对象

HttpServletRequest  请求对象:获取请求信息
HttpServletResponse 响应对象: 设置响应对象
ServletConfig对象    servlet配置对象
ServletContext对象  servlet的上下文对象

ServletConfig对象

  • 创建时间:在创建完servlet对象的时候,接着创建servletConfig对象.
  • 如何得到对象:直接使用ServletConfig config = this.getServletConfig();
  • 简单使用
    这是web.xml的配置文件(也是知道了springmvc前端控制器那个初始化参数怎么被调用的了)
 <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.roobtyan.LoginServlet</servlet-class>
    <!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
    <init-param>
    	<param-name>location</param-name>
    	<param-value>doom</param-value>
    </init-param>
  </servlet>
java.lang.String getInitParameter(java.lang.String name)  根据参数名获取参数值
java.util.Enumeration getInitParameterNames()    		 获取所有参数
ServletContext getServletContext()     					 得到servlet上下文对象
java.lang.String getServletName()       				 得到servlet的名称

ServletContext对象

  • 创建时间:加载web应用时创建ServletContext对象
  • 得到对象:从ServletConfig对象的getServletContext方法得到
  • 这个对象又几个比较重要的方法,我们来介绍一下.
  • 作用:在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等
java.lang.String getContextPath()   --得到当前web应用的路径

java.lang.String getInitParameter(java.lang.String name)  --得到web应用的初始化参数
java.util.Enumeration getInitParameterNames()  

void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
java.lang.Object getAttribute(java.lang.String name)  
void removeAttribute(java.lang.String name)  

RequestDispatcher getRequestDispatcher(java.lang.String path)   --转发(类似于重定向)

java.lang.String getRealPath(java.lang.String path)     --得到web应用的资源文件
java.io.InputStream getResourceAsStream(java.lang.String path) 

Servlet三大域对象

对象名称对象的类型
requestHttpServletRequest
sessionHttpSession
applicationServletContext

Servlet三大域对象

Servlet详细教程
Servlet的生命周期

spring三大框架

spring是什么

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

spring的优点

  1. 方便解耦,简化开发
    使用ioc控制反转,使对象的创建和依赖关系维护都交给了spring容器管理,使减少了手动编码引起的过度程序耦合。

  2. aop的支持
    将哪些非核心的功能而且可重复的功能,编入一个类中,但要使用它的时候可以通过aop去织入。

  3. 声明式事务的支持
    在Spring中,只需要配置就可以完成对事务的管理,而无需手动编程,提高开发效率和质量。

spring容器的核心

org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具体实现,用来包装和管理各种bean。BeanFactory和ApplicationContext是Spring的两大核心接口,它们都可以当做Spring的容器

什么是SpringMVC

是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,可以帮助我们进行更简洁的Web层的开发,并且它与Spring框架集成。Spring MVC一般把后端项目分成Service层(处理业务)、Dao层(数据库操作)、Entity层(实体类)、Controller

SpringMVC和Ajax之间如何相互调用

通过JackSon框架把java里面对象直接转换成js可识别的json对象,具体步骤如下:

(1) 加入JackSon.jar

(2) 在配置文件中配置json的映射

(3) 在接受Ajax方法里面直接返回Object,list等,方法前面需要加上注解@ResponseBody

如何配置拦截器拦截get方法

在@RequestMapping注解里面加上method=RequestMethod.GET。

什么是 Spring Boot?

是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

Spring Boot 有哪些优点?(为什么要用SpringBoot)

快速开发,快速整合,配置简化、内嵌服务容器

springboot的核心功能是什么

自动装配
3.springboot的自动装配的的核心注释是什么
@SpringBootApplication,主要组合包含了以下 3 个注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

自动装配的原理是什么

主要是Spring Boot的启动类上的核心注解SpringBootApplication注解主配置类,有了这个主配置类启动时就会为SpringBoot开启一个@EnableAutoConfiguration注解自动配置功能。
有了这个EnableAutoConfiguration的话就会:
从配置文件META_INF/Spring.factories加载可能用到的自动配置类
去重,并将exclude和excludeName属性携带的类排除
过滤,将满足条件(@Conditional)的自动配置类返回
**

Spring Boot 中如何解决跨域问题 ?

**
可以使用jsonp来解决,但是这个只能使用get请求。
可以使用CORS来解决跨域问题。使用WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。

Spring Boot 需要独立的容器运行吗?

可以不需要,内置了 Tomcat/ Jetty 等容器。

运行 Spring Boot 有哪几种方式?

打包用命令或者放到容器中运行

用 Maven/ Gradle 插件运行

直接执行 main 方法运行

开启 Spring Boot 特性有哪几种方式?

继承spring-boot-starter-parent项目

导入spring-boot-dependencies项目依赖

SpringBoot事务的使用

SpringBoot的事物很简单,首先使用注解EnableTransactionManagement开启事物之后,然后在Service方法上添加注解Transactional便可。

Spring Boot 有哪几种读取配置的方式?

Spring Boot 可以通过 @PropertySource,@Value,@Environment, @ConfigurationPropertie注解来绑定变量

springboot常用注释的作用

@controller 作用是标识为控制器,将用户的请求url传给接口service层
@responebody 表示(将java对象转为json格式的数据)方法返回的是json数据而不会再走视图处理器,而是将数据写入到response对象的body区中
@Resquempping 用于建立请求URL和处理请求方法之间的对应关系
@PathVariable通过 @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)
@Parm
是MyBatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);其实是将json格式的数据转为java对象

Spring事务

Spring事务的本事其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照这几步:

1.获得连接

2.开启事务

3.执行JDBC

4.提交事务/回滚事务

5.关闭连接

Sprig管理事务的方式有几种?

1.编程式事务,在代码中硬编码。(不推荐使用)

2.声明式事务,在配置文件中配置(推荐使用)

声明式事务分为以下两种:

1.基于XML的声明式事务

2.基于注解的声明式事务

Spring、SpringMVC、SpringBoot、SpringCloud的联系与区别

Spring:一个轻量级的控制反转和面向切面的容器。

SpringMVC: MVC 框架提供了模型-视图-控制的体系结构和可以用来开发灵活、松散耦合的 web 应用程序的组件

SpringBoot: 它基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。

SpringCloud: 它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。

联系与区别:Spring提供IOC和AOP的容器,并具有强大的扩展功能;Springmvc在上面拓展了WEB开发,基于Servlet的一个MVC框架,通过XML配置,统一开发前端视图和后端逻辑;SpringBoot专注于微服务方面的接口开发,和前端解耦,同时也解决了Spring配置非常复杂,各种XML、Servlet处理起来比较繁琐,默认优于配置,简化了SpringMVC的配置流程;SpringCould更关注全局微服务的整合和管理,相当于管理多个springBoot框架的单体微服务。

#{}与${}的区别

‘#{ }’:解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个‘ #{ }’ 被解析为一个参数占位符 ? ,会按序给sql的?占位符设置参数值。

‘${ }’ 仅仅为一个纯粹的 string 替换,在动态 SQL 解析阶段将会进行变量替换。在预编译之前已经被变量替换了

‘${ }’变量的替换阶段是在动态 SQL 解析阶段,而’#{ }’变量的替换是在 DBMS 中。

什么是预编译
PreparedStatement与Statement有什么区别,什么是#{},${}
PreparedStatement为什么能防止sql注入(详细)

mybatis使用#{}为什么能防止sql注入

在这里插入图片描述

  1. 解析阶段
  2. 编译阶段
  3. 优化阶段
  4. 缓存阶段
  5. 执行阶段
    PrepareStatement发送到服务器后会经历上述1、2、3、4过程,PrepareStatement并不是完整的sql语句,在执行之前还需要进行用户数据替换。在填入用户数据时,PrepareStatement已经经历了上述过程,就不会重新编译,用户的数据只能作为数据进行填充,而不是sql的一部分,默认其是一个参数,参数中的or或者and 等就不是SQL语法保留字了。
    在这里插入图片描述

Mybatis是什么

Mybatis是一款优秀的持久层框架支持自定义SQL查询、存储过程和高级映射,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索~~,MyBatis可以使用简单的XML或者注解进行映射和配置,通过将参数映射到配置的SQL最终解析为执行的SQL语句,查询后将SQl结果集映射成java对象返回~~

Mybatis plus是什么

MyBatis-plus是一款MyBatis的增强工具,在MyBatis 的基础上只做增强不做改变~~。其是国内团队苞米豆在MyBatis基础上开发的增强框架,扩展了一些功能,以提高效率。~~ 引入 Mybatis-Plus 不会对现有的 Mybatis 构架产生任何影响,而且 MyBatis-plus 支持所有 Mybatis 原生的特性

Mybatis 和 Mybatis Plus 的区别

MyBatis:
所有SQL语句全部自己写
手动解析实体关系映射转换为MyBatis内部对象注入容器
不支持Lambda形式调用
Mybatis Plus:
强大的条件构造器,满足各类使用需求
内置的Mapper,通用的Service,少量配置即可实现单表大部分CRUD操作
支持Lambda形式调用
提供了基本的CRUD功能,连SQL语句都不需要编写
自动解析实体关系映射转换为MyBatis内部对象注入容器

Mybatis 一级缓存 和二级缓存的区别

一级缓存的作用域是一个sqlsession内;
二级缓存作用域是针对mapper进行缓存;
都是基于PerpetualCache 的 HashMap本地缓存,二级缓存是默认基于

一级缓存

在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。

缓存失效

一级缓存时执行commit,close,增删改等操作,就会清空当前的一级缓存

从Springboot集成Mybatis看Mybatis到底是怎么集成到Spring中的

https://www.jianshu.com/p/9f289300b9c

mysql

Mysql的简介

Mysql是关系型数据库管理系统(DBMS),Sql是结构化查询语言。

DBMS负责执行SQL去操作数据库(DB,一般存储在硬盘上)中的数据

查看MySql提供的所有存储引擎

Show engines;
Show table status like “表名”:查看表的存储引擎

什么是事务?

事务是逻辑上的一组操作,要么都执行,要么都不执行。

左连接和右连接和内连接的区别

使用的不同
内连接是用inner join on,内连接的话是将所有匹配的都显示出来
左连接是用left join on,
右连接时用right join on
左连接和右连接就是将不符合条件的也显示出来,左连接显示左边的表,右连接显示右边表的。

mysql数据库引擎有哪些(区别)

Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别,不支持全文索引
MyIASM引擎是MySQL默认的引擎,但是它没有提供对数据库事务的支持,支持全文索引
是否支持外键:MyISAM不支持,InnoDB支持。

索引有那些

  1. 主键索引(InnoDB存储引擎支持)
  2. 唯一索引(InnoDB存储引擎支持)
  3. 全文索引(InnoDB存储引擎不支持,MyISAM存储引擎支持)
  4. 常规索引(InnoDB存储引擎支持)
    终于理解 MySQL 索引要用 B+tree ,而且还这么快

mysql 索引的作用

  1. 查询速度快
  2. 确保数据的唯一性
  3. 可以加速表与表的连接速度,实现表与表之间的参照性
  4. 使用分组和排序进行数据检索时,减少分组和排序的时间

redis

redis的简介

Redis 是一个非关系型数据库,但是与传统的数据库相比,Redis 的数据是存在内存中的, 所以读写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。Redis 提供了多种数据类型来支持不同的业务场景。除此之外,redis 支持事务、持久化、Lua 脚本、LRU 驱动时间,多种集群方案。

为什么用redis缓存

高性能:
假如用户第一个访问数据库中的某些数据库的时候,是从磁盘中取,取到内存,从内存读取。
如果将数据库的数据就放在内存,我们就会少一个磁盘的读取时间,那么大大增加了我们的读取效率。
如果数据库的数据改变后,那么我们缓存中的数据跟改变即可。
高并发:
直接操作缓存能承受的请求远远大于操作数据库的数量。所以我们可以将数据库的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。

redis 持久化机制(怎么保证 redis 挂掉之后再重启数据可以进行恢复)

因为 redis 是运行在内存的,所以断电即失,所以 redis 为了支持防止自己内存的数据丢失,支持两种不同的持久化操作:

1.快照(snapshotting,RDB[redis batabase]);

2.只追加文件(append-only file,AOF)。

redis 常见数据结构

String
Hash
List
Set

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值