java初级面试的常见问题

面向对象

面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能,行为等通过对象来实现,将功能封装进对象中,让对象去实现具体的细节;这种思想是将数据作为第一位,而方法或者说是算法做为其次,这是一种对数据的优化,操作起来更加的方便,简化了过程.
面向对象有三大特征:封装,继承,多态;
封装:隐藏了对象的属性和实现细节,仅提供对外的公共访问方式,这样就隔离了具体的变化,便于使用,提高了代码的复用性和安全性;
继承:两种事务之间存在着一定的所属关系,那么继承的类就可以从被继承的类中获得一些属性和方法,提高了代码的复用性;
多态:父类或接口的引用指向了子类对象,也就是说只要实现了接口或继承了一个类,就可以使用接口或父类中的方法,提高了程序的扩展性;一个父类实例的不同子类对象执行相同的方法得到不同的执行结果;

连接查询的区别

等值连接和内连接查询到的是两张表的交集数据
外连接查询的是一张表的全部数据和另外一张表的交集数据

Overload(重载)和Override(重写)的区别?

1.重写必须继承,重载不用。
2.重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同。
3.重写的方法修饰符大于等于父类的方法,重载和修饰符无关.
4.重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常.

简述static

1.可以用来修饰成员变量,常量,方法,代码,统称为静态成员;
2.静态成员归整个类所有,不依赖特定的实例,被类的所有实例所共享,只要JVM加载就可以根据类名在全局数据区内找到;
3.实例变量:每创建一个实例,JVM就会为实例变量分配一次内存,可以在内存中有多个备份,互不影响.实例变量隶属于对象,在类的内部,本类中的静态方法或其他类,都需要通过被类的实例对象调用才能进行访问.
4.静态变量:加载类的过程中完成静态变量的内存分配,且只分配一次内存,可以被所有的对象之间共享,
在本类中,任何方法内部可以直接访问静态变量,其它类中需要类名.(静态变量)来访问;

常用的类所在的包;常用类:集合,IO,线程,网络

java.lang.;
这是java的核心功能包,主要包括和语言相关的类,提供基本数据类型处理,基本数值函数,字符串处理,线程和异常处理等。该包由解释程序自动加载,不需要显示导入。
java.io.
;
该包提供和输入输出相关的类,用于不同设备对数据的输入输出处理。
java.util.;
该包提供一些实用工具,包括集合框架以及遗留的集合类,事件模型,时间和日期实施,随机数生成器和位数组等。
java.net.
;
该包提供一些与网络应用开发的类。
java.awt.;java.swing.;
该包提供了用于GUI开发的窗口组件,布局管理,监听事件以及用户交互控制的一些类。
java.applet.;
该包提供浏览器中应用程序插件的类,所需要的类可继承Applet并实现相应功能。
java.sql.
;
该包提供java和数据源存储数据交互的接口。
java.text.*;
该包提供和自然语言无关的方式处理文本,日期,数字和消息的类和接口。

为什么要生成hashCode和equals方法,用什么方法?

  1. hashCode和equals方法主要为基于Hash算法的数据结构服务,如HashSet,HashMap,HashTable…
  2. 此类数据结构会先计算要存入的对象的hash值,对桶数取余得到保存的目标位置的下标,如果目标位置没有元素,则直接保存,如果目标位置已有元素,则调用目标元素的equals方法,与当前元素进行比较,如果equals方法返回true,则证明元素一致。
  3. Web容器(Tomcat)提供的一些缓存机制底层是基于hash结构的,会用到hashCode和equals方法,因此实体类需要重写hashCode和equals方法

什么是索引?

索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度。
索引的优点是可以提高检索数据的速度
索引的缺点是创建和维护索引需要耗费时间。
索引可以提高查询速度,会减慢写入速度。

索引建的越多越好吗?

1.数据量小的表不需要建立索引,建立索引会增加额外的索引开销;
2.数据变更需要维护索引,因此更多的索引以为着更多的维护成本;
3.更多的索引意味着也需要更多的空间;

Equals 和 ==的区别

1.是值比较,对于引用类型变量是判断引用的值是否是同一个对象地址值,如果是相同对象其内容也一定是相同的
2.equals方法判断的是对象的内容是否相同,由于其默认方法采用的==进行引用比较,所以需要重写为按照对象内容比较是否相同。

StringBuffer和StringBuilder的区别

1.String是字符串不可变的,StringBuffer是可变的,是线程安全的,StringBuilder是非线程安全的。
2.由于字符串链接会自动创建String对象,为了避免复杂字符串拼接时候大量创建String对象,可以利用StringBuilder优化字符串链接操作。
3.StringBuilder是jdk5之后新增的,其用法与StringBuffer完全一致,但它是线程不安全的,在单线程中最佳,因为其不需要维护线程的安全,因此是最快的。
使用策略: 如果要操作少量的数据,用String;单线程操作大量数据,用StringBuilder;
多线程操作大量数据,用StringBuffer. StringBuilder一般在方法内部完成字符串链接,因为线程是不安全的,所以用完之后可以丢弃.StringBuffer主要用在全局变量中;

简述SSM

Spring
Spring 是一个开源的轻量级JavaBean容器框架,丰富了企业应用功能,降低应用开发的复杂性;
Spring 核心功能
核心功能:
1.IOC/DI 控制翻转/依赖注入

2.AOP 面向切面(儿)编程,

Spring IOC:相对于主动控制管理来说,将控制管理权交给容器的现象叫做控制反转;
由Spring控制管理对象, 应用程序从Spring获得对象, 应用程序再使用对象.

Spring DI : Spring 提供了DI(依赖注入)功能.通过xml配置或注解即可注入需要的资源,完成自身的业务逻辑.

面试题1:什么是AOP?说说你对它的理解
1.AOP,是面向切面编程(Aspect Oriented Programming),是一种编程思想,在实际应用中是对OOP的有效补充。
2.应用程序中的处理逻辑可以分为两类:核心关注点 和 横切关注点。
3.横切关注点指那些会被多个业务重复调用,但是和具体业务关系不大的模块,例如日志模块,性能统计模块,事务管理模块,安全验证模块等。
4.AOP可以将横切关注点的内容封装在Aspect内部,并注入到所需的地方。有效实现核心关注点和横切关注点的解耦,提高了程序的可扩展性和可维护性,提高了开发效率。

面试题2:你在项目中是如何实现AOP的?
1.在项目中可以利用Spring来实现AOP编程
2.Spring的IOC为AOP提供了强大的支持,利用Spring,可以非常便捷的实现AOP编程
3.在权限管理子系统中的日志模块里面,有个记录日志的用例,是使用AOP注入到用户相关业务的Service层方法中,实现自动的日志记录。

面试题3:使用Spring 具体如何实现AOP编程?
1.需要在项目中添加aspectj-tools和aspectjweaver的依赖
2.开发一个切面类,类前添加@Aspect和@Component
3.在类中添加通知(advice)方法,在方法中添加横切关注点的处理逻辑
4.在通知方法前添加注解@Around("…"),配置通知注入的方式和位置

AOP :通过xml配置或注解,即可加入面向切面编程的能力,完成切面功能;如日志,事务的统一处理;
实现AOP方式:采用动态代理技术,利用拦截方法的方式,对该方法进行装饰,以取代原有对象行为的执行;
采用静态织入的方式,引用特定的语法装饰切面,而使编译器可以在编译期间织入有关切面的代码;

SpringMVC :

SpringMVC 是spring框架的一部分,是一个mvc设计模型的表现层框架.

SpringMVC具体流程:客户端发送请求—>DispatcherServlet接收所有请求,组织核心处理请求

—>HandlerMapping—>记录请求路径与Controller的对应关系—>controller进行业务处理和数据操作后

–>返回ModelAndView(处理后得到的数据及视图名称)给DispatcherServlet

–>然后通过ViewResolver根据视图名称确定具体的视图组件—>最后在某视图组件上响应

Mybatis:

MyBatis框架是一个支持定制化SQL,存储过程以及高级映射的持久层框架,它内部封装了通过jdbc访问数据库的操作。
Mybatis避免了几乎所有的jdbc代码和手工设置参数以及抽取结果集.
Mybatis使用简单的XML或注解来配置和映射基本体,将接口和java对象映射成数据库中的记录;

开发者在使用MyBatis开发某个增/删/改/查功能时,只需要定义这个功能的抽象方法,及匹配的SQL语句即可!

除此以外,MyBatis还提供了数据缓存的处理等其它功能!

进程与线程

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
2).线程是进程的一个实体, 是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
3).一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

(略:进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序 健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。)

线程的生命周期

1.一个线程是进程的一个顺序执行流程。一个进程中的全部线程共享同一个堆空间。线程本身有一个供程序执行时的栈,一个进程中可以包含多个线程。
2.新建、就绪、运行状态、阻塞状态、死亡状态
3.新建状态:利用NEW运算创建了线程对象,此时线程状态为新建状态,调用了新建状态线程的start()方法,将线程提交给操作系统,准备执行,线程将进入到就绪状态。
4.就绪状态:由操作系统调度的一个线程,没有被系统分配到处理器上执行,一旦处理器有空闲,操作系统会将它放入处理器中执行,此时线程从就绪状态切换到运行时状态。
5.阻塞状态:线程正在运行的过程中,碰到调用Sleep()方法,或者等待IO完成,或等待其他同步方法完成时,线程将会从运行状态,进入到阻塞状态。
6.死亡状态:线程一旦脱离阻塞状态时,将重新回到就绪状态,重新向下执行,最终进入到死亡状态。一旦线程对象是死亡状态,就只能被GC回收,不能再被调用。

创建线程有几种不同的方式?

在应用开发中有三种方式可以用来创建线程:
1.继承Thread类,重写run方法,创建thread对象,调用start()方法。
2.实现Runnable接口,重写run()方法,创建runnable实现类的实例,并以此实例作为参数创建Thread对象,调用start()方法。
3.创建callable的实现类,实现call方法(有返回值),创建callable类的实例,并以此实例作为参数创建futureTask对象,最后调用get()方法获取返回值;
4.通过Executor创建线程池;

拦截器与过滤器的区别 :

1.拦截器是基于java的反射机制的,而过滤器是基于函数回调。

2.拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

什么是反射机制?

Java 动态执行机制,可以实现动态执行功能:
1.反射提供了在运行时判断任意一个对象所属的类型,并可以检查解析类型的内部结构。
2.反射可以动态加载类型,并能够动态创建对象
3.反射可以动态访问对象的属性。
4.反射可以动态执行对象的方法。
5.利用反射API还可以动态的访问,不可见的属性和方法

哪里用到反射机制?

1.JDBC中,利用反射动态加载了数据库驱动程序。
2.Web服务器中利用反射调用了Sevlet的服务方法。
3.Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
4.很多框架都用到反射机制,注入属性,调用方法,如Hibernate、Struts2、Spring。

27.反射机制的优缺点?

1.优点:可以动态执行!在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
2.缺点:对性能有影响,这类操作总是慢于直接执行java代码。

介绍集合:

1.List特点:元素有顺序,元素可重复
ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,优点是索引读取快,从最后插入和删除元素速度快,但是头部插入和删除慢。
LinkedList使用双向循环链表方式存储数据,所以头尾插入或读取插入的速度快,而中部插入和读取慢.

2.Set特点:元素无顺序,元素不可重复(注意:元素虽然无顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
HashSet :实现了Set接口;内部封装了HashMap,故也是无序的;HashSet本质就是HashMap,数据存储到HashSet的Key部分,Value部分被屏蔽不使用了。
Map特点:元素按键值对存储,无顺序
HashMap :实现Map接口;使用hash算法,里面的数据是无序的;并且存储的是键值对;HashMap可以插入一个null的key-value
Hashtable 是陈旧API,HashMap 是Java 1.2 引进的Map 接口的一个实现
同步性:Hashtable 是线程安全的,也就是说是同步的,而HashMap 是线程序不安全的,不是同步的。由于同步检查所以Hashtable性能稍慢。

2.聚合函数

MYSQL中聚合函数有AVG,SUM,MAX,MIN,COUNT,

常用注解:

@ResponseBody
@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

@Controller
单独使用@Controller不加@ResponseBody,用于返回一个视图,该情况属于比较传统的Spring MVC应用,前后端不分离的场景。Spring回去resources/templates目录下查找hello.html,并且携带参数

@RestController
只返回对象,并且对象直接以JSON或XML的形式传入HTTP响应中,该情况属于RESTful Web服务,前后端分离场景
@Controller + @ResponseBody
返回JSON或XML形式数据;在Spring4之前开发RESTful Web服务,需要使用@Controller + @ResponseBody 注解使用;在Spring4之后,使用@Controller + @ResponseBody在功能层面上等于@RestController

简述Spring中常用注解?
1.@Component :标准一个普通的spring Bean类。
2.@Repository:标注一个DAO组件类。
3.@Service:标注一个业务逻辑组件类。
4.@Controller:标注一个控制器组件类。
@Resource:注入组件

@RequestMapping(“xxx”)
用于建立请求URL和处理请求对应方法之间的关系;
@Autowired,方法及构造函数进行标注,让Spring完成bean自动装配的工作;
可以对类的成员变量
@MapperScan(“cn.tedu.store.mapper”)
@Bean
@Service
@Value("${project.max_count}")
@Test
@RunWith(SpringRunner.class)
@SpringBootTest

关于事务Transaction

事务是数据库领域中,能保证向一个业务中需要执行的多次增删改操作全部成功或全部失败的机制;
ACID特性:
原子性:事务是一个不可分割的整体,具有原子性,即不允许事务部分的完成,避免了只执行操作的一部分而带来的错误;
一致性:一个事务执行前和执行后,数据库中必须保持一致性状态,当数据库只包含事务成功提交的结果时,数据库处于一致性状态;
隔离性:当两个或多个事务并发执行时,为了保证数据的安全性,将一个事务内部的操作与其它事务的操作隔离起来,各个事务的执行互不干扰;
持久性:持久性是指一个事务一旦被提交,它对数据库的改变都要被记录到永久存储.

AJAX简述

什么是ajax(Asynchronous JavaScript and XML)
ajax是一种无需加载整个网页的情况下,能够更新部分网页的技术.
AJAX=异步JavaScript和XML,是一种快速创建动态网页的技术
AJAX是一种用来改善用户体验的技术,其实质是,使用XMLHttpRequest对象异步地向服务器发请求
服务器返回部分数据,而不是一个完整的页面,以页面无刷新的效果更改页面中的局部内容
通过在后台与服务器进行少量的数据交换,ajax可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页局部进行更新.
ajax用于创造动态性更强的应用程序;
ajax可用来与数据库进行通信;
ajax可用来与xml文件进行交互同信;

重定向和转发的区别。

区别一:
  重定向时浏览器上的网址改变
  转发是浏览器上的网址不变
区别二:
  重定向实际上产生了两次请求
转发只有一次请求
重定向:
  发送请求 —>服务器运行—>响应请求,返回给浏览器一个新的地址与响应码—>浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址—>服务器运行—>响应请求给浏览器
转发:
  发送请求 —>服务器运行—>进行请求的重新设置,例如通过request.setAttribute(name,value)—>根据转发的地址,获取该地址的网页—>响应请求给浏览器
区别三:
  重定向时的网址可以是任何网址
  转发的网址必须是本站点的网址

项目的xxxxxx功能如何实现

简述在持久层(在mapper接口定义持久层接口xxx抽象方法,再在resource下配置xml文件进行增删改查相应的操作),

业务层(在业务层接口内定义xxx抽象方法,并在该接口的实现类完成相应的业务逻辑操作),
控制器层(配置RequestMapping注解建立url和处理请求方法之间的关系,调用业务层接口方法,按需求返回状态码和需要的数据),
前端页面(使用jquery,ajax实现页面的动态显示)各做了什么;

servlet与jsp

早期的web服务器只能处理静态资源请求,无法根据请求计算后生成相应的html内容。
Servlet是扩展web服务器功能的组件规范。是一种服务器端的java应用程序,由web容器加载和管理,用于生成动态网页内容,负责处理客户端的请求

jsp是servlet的扩展,本质上还是servlet,每一个页面就是一个servlet实例,jsp页面会被web容器翻译成servlet,servlet再负责响应用户请求

区别:

Servlet适合动态输出web数据和业务逻辑处理,对于html页面内容的修改非常不方便;
jsp是在html代码中嵌入java代码,适合页面的显示

JSP共有以下9种基本内置组件

1、request对象 客户端请求,此请求会包含来自GET/POST请求的参数通过它才能了解到客户的需求,然后做出响应。
2、response对象 响应客户请求的有关信息
3、session对象 它指的是客户端与服务器的一次会话,从客户端连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。
4、out对象 它是JspWriter类的实例,是向客户端输出内容常用的对象
5、page对象 它是指向当前JSP页面本身,有点象类中的this指针,它是 Java.lang.Object类的实例
6、application对象 它实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭
7、exception对象 它是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。
8、pageContext对象 它提供了对JSP页面内所有的对象及名字空间的访问
9、config对象 它是在一个Servlet初始化时,JSP引擎向它传递信息用的

jsp的工作原理

1.浏览器发出请求:“ps:http://localhost:8080/servlet01/hello.jsp”

2.–>服务器在wtpwebapps文件夹下找到servlet01/WEB-INF目录/xx.jsp页面

3.–>翻译成 xx_jsp.java文件,然后将其转化成servlet文件

4.–>编译器将其编译成xx_jsp.class文件并调用service()方法

5.–>响应网页

ps:若浏览器以后再请求页面,则直接执行第四步.

servlet的运行详细步骤及生命周期

浏览器依据IP建立与容器的连接;
浏览器请求数据打包;
容器解析请求数据包,封装对象;
容器依据路径找到Servlet创建对象;
容器调用servlet对象的service方法;
容器将响应打包发给浏览器;
浏览器取出结果生成页面;

Servlet 生命周期:Servlet 加载—->实例化—->服务—->销毁。

init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。

service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。

destroy(): 仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

Mybatis中#和$占位符的区别

#{}:在Mybatis数据库语句中表示占位符,会预编译,自动加上’‘单引号,不会导致sql注入.
${}:在Mybatis数据库语句中是字符串拼接的意思,不会经过预编译,也就不会加上’'单引号,有可能导致SQL注入;

分页查询 limit

  • 格式: limit 跳过的条数,请求的条数(每页的条数)
  • 公式:limit (页数-1)*条数,条数
  1. 查询每个员工的编号,姓名,工资 按照工资降序排序 查询前三条数据
    select empno,ename,sal from emp order by sal desc limit 0,3;
  2. 查询每个员工的编号,姓名,工资 按照工资降序排序 查询第二页的三条数据
    select empno,ename,sal from emp order by sal desc limit 3,3;

Mybatis动态SQL的实现

Mybatis提供了动态SQL,也就是可以根据用户提供的参数,动态决定查询语句依赖的查询条件或SQL语句的内容;
常用的动态SQL标签:
if,where,choose,when,otherwise,set,trim,foreach,list

数组与集合的区别:

1.数组长度不可变,集合长度可变;
2.数组存储任意类型,集合存储引用数据类型;
3.数组只能存储相同数据类型,集合可以存储不同数据类型;

解决servlet乱码问题

乱码原因:传输方和接收方采用的编码不一致.传输方对参数采用的是UTF-8编码而接受方却用GBK进行解析,当然是乱码,且Tomcat服务器默认采用的ISO8859-1编码得到的参数值,如果没有设置,也有可能会出现乱码.

1.修改tomcat默认编码方式:
找到tomcat下conf/server.xml文件找到<connector…省略>
在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。

修改为:

注:tomcat7之前的编码格式都是ISO-8859-1,tomcat8以后默认编码格式是utf-8。

2.//在获取请求参数前设置字符集
request.setCharacterEncoding(“UTF-8”);?

3.//设置浏览器用UTF-8编码显示数据
response.setContentType(“text/html;charset=UTF-8”);

4.//使用jdbc连接MySQL数据库,可能会出现乱码
连接数据库url后+&characterEncoding=UTF-8
在创建表时设置编码格式 ENGING=InnoDB DEFAULT CHARSET=utf8;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值