leftso 618 0 2018-01-02 20:43:51

引言

记录常见的java面试题及解决思路方法。

java冒泡排序

package net.xqlee.project;

public class TestMaoPao {

	public static void main(String[] args) {
		int[] arr = new int[] { 0, 2, 3, 7, -1, 90, 290, -1, 100 };
		int swap = 0;
		for (int i = 0; i < arr.length; i++) {
			for (int j = i; j < arr.length; j++) {
				if (arr[j] > arr[i]) {
					swap = arr[i];
					arr[i] = arr[j];
					arr[j] = swap;
				}
			}
		}
		System.out.println(arr[0]);
	}

}

冒泡排序原理: 从第一个开始,与后面的每一个比较,找到比他大/小的就交换,一轮下来就可以将最大/小值放在索引的第一个位置,后面以此类推。

servlet执行流程

  客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request、response对象传递给找到的servlet,servlet根据request就可以知道是谁发出的请求,请求信息及其他信息,当servlet处理完业务逻辑后会将信息放入到response并响应到客户端。

springMVC的执行流程

  springMVC是由dispatchservlet为核心的分层控制框架。首先客户端发出一个请求web服务器解析请求url并去匹配dispatchservlet的映射url,如果匹配上就将这个请求放入到dispatchservlet,dispatchservlet根据mapping映射配置去寻找相对应的handel,然后把处理权交给找到的handel,handel封装了处理业务逻辑的代码,当handel处理完后会返回一个逻辑视图modelandview给dispatchservlet,此时的modelandview是一个逻辑视图不是一个正式视图,所以dispatchservlet会通过viewresource视图资源去解析modelandview,然后将解析后的参数放到view中返回到客户端并展现。

Java设计模式思想(单列模式,工厂模式,策略模式,共23种设计模式)

  • a) 单例模式:单例模式核心只需要new一个实例对象的模式,比如数据库连接,在线人数等,一些网站上看到的在线人数统计就是通过单例模式实现的,把一个计时器存放在数据库或者内存中,当有人登陆的时候取出来加一再放回去,有人退出登陆的时候取出来减一再放回去,但是当有两个人同时登陆的时候,会同时取出计数器,同时加一,同时放回去,这样的话数据就会错误,所以需要一个全局变量的对象给全部人使用,只需要new出一个实例对象,这就是单例模式的应用,并且单例模式节省资源,因为它控制了实例对象的个数,并有利于gc回收。
  • b) 策略模式:就是将几个类中公共的方法提取到一个新的类中,从而使扩展更容易,保证代码的可移植性,可维护性强。比如有个需求是写鸭子对象,鸭子有叫,飞,外形这三种方法,如果每个鸭子类都写这三个方法会出现代码的冗余,这时候我们可以把鸭子中的叫,飞,外形这三个方法提取出来,放到鸭父类中,让每个鸭子都继承这个鸭父类,重写这三个方法,这样封装的代码可移植性强,当用户提出新的需求比如鸭子会游泳,那么对于我们oo程序员来讲就非常简单了我们只需要在鸭父类中加一个游泳的方法,让会游泳的鸭子重写游泳方法就可以了。
  • c) 工厂模式:简单的工厂模式主要是统一提供实例对象的引用,通过工厂模式接口获取实例对象的引用。比如一个登陆功能,后端有三个类,controller类,interface类,实现接口的实现类。当客户端发出一个请求,当请求传到controller类中时,controller获取接口的引用对象,而实现接口的实现类中封装好了登陆的业务逻辑代码。当你需要加一个注册需求的时候只需要在接口类中加一个注册方法,实现类中实现方法,controller获取接口的引用对象即可,不需要改动原来的代码,这种做法是的可拓展性强。

内部类与外部类的调用

  • a) 内部类可以直接调用外部类包括private的成员变量,使用外部类引用的this.关键字调用即可
  • b) 而外部类调用内部类需要建立内部类对象

AOP与IOC的概念(即spring的核心)

  • a) IOC:Spring是开源框架,使用框架可以使我们减少工作量,提高工作效率并且它是分层结构,即相对应的层处理对应的业务逻辑,减少代码的耦合度。而spring的核心是IOC控制反转和AOP面向切面编程。IOC控制反转主要强调的是程序之间的关系是由容器控制的,容器控制对象,控制了对外部资源的获取。而反转即为,在传统的编程中都是由我们创建对象获取依赖对象,而在IOC中是容器帮我们创建对象并注入依赖对象,正是容器帮我们查找和注入对象,对象是被获取,所以叫反转。
  • b) AOP:面向切面编程,主要是管理系统层的业务,比如日志,权限,事物等。AOP是将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为切面(aspect),切面将那些与业务逻辑无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

Arraylist与linkedlist的区别

a) 都是实现list接口的列表,arraylist是基于数组的数据结构,linkedlist是基于链表的数据结构,当获取特定元素时,ArrayList效率比较快,它通过数组下标即可获取,而linkedlist则需要移动指针。当存储元素与删除元素时linkedlist效率较快,只需要将指针移动指定位置增加或者删除即可,而arraylist需要移动数据。

数据库优化

  • a) 选择合适的字段,比如邮箱字段可以设为char(6),尽量把字段设置为notnull,这样查询的时候数据库就不需要比较null值
  • b) 使用关联查询( left join on)查询代替子查询
  • c) 使用union联合查询手动创建临时表
  • d) 开启事物,当数据库执行多条语句出现错误时,事物会回滚,可以维护数据库的完整性
  • e) 使用外键,事物可以维护数据的完整性但是它却不能保证数据的关联性,使用外键可以保证数据的关联性
  • f) 使用索引,索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快的多的速度检索特定的行,特别是对于max,min,order by查询时,效果更明显
  • g) 优化的查询语句,绝大多数情况下,使用索引可以提高查询的速度,但如果sql语句使用不恰当的话,索引无法发挥它的特性。

Java集合类框架的基本接口有哪些

Collection集合接口,
List、set实现Collection接口,
arraylist、linkedlist,vector实现list接口,
stack继承vector,Map接口,
hashtable、hashmap实现map接口

事物的理解

  • a) 事物具有原子性,一致性,持久性,隔离性
  • b) 原子性:是指在一个事物中,要么全部执行成功,要么全部失败回滚。
  • c) 一致性:事物执行之前和执行之后都处于一致性状态
  • d) 持久性:事物多数据的操作是永久性
  • e) 隔离性:当一个事物正在对数据进行操作时,另一个事物不可以对数据进行操作,也就是多个并发事物之间相互隔离。

对象的创建

  • a) 遇到一个新类时,会进行类的加载,定位到class文件
  • b) 对所有静态成员变量初始化,静态代码块也会执行,而且只在类加载的时候执行一次
  • c) New 对象时,jvm会在堆中分配一个足够大的存储空间
  • d) 存储空间清空,为所有的变量赋默认值,所有的对象引用赋值为null
  • e) 根据书写的位置给字段一些初始化操作
  • f) 调用构造器方法(没有继承)

JAVA WEB 九大内置对象

  九大内置对象分别是: request response session application out page config exception pageContent

  其中:
  • request  response  out page config exception pageContent对象的有效范围是当前页面的应用 
  • session 有效范围是当前会话(当前客户端的所有页面)
  • application 有效范围是整个应用程序,只要服务器不关闭对象就有效
====================================================================
request
====================================================================
request.getParameter();获得用户提交的表单信息
request.setCharacterEncoding("UTF-8");设置请求编码,防止乱码
request.setAttribute("Unmae", new Object());将数据保存到request范围内的变量中
request.forward(String Url);转发
request.getRequestURL();获得当前页的IE地址
request.getHeader("resref");获得请求也的IE地址
request.getRemoteAddr();获得用户的IP地址
====================================================================
cookie
====================================================================
cookie.getCookies()获得所有cookie对象的集合
cookie.getName()获得指定名称的cookie
cookie.getValue()获得cookie对象的值
URLEncoder.encode();将需要保存到cookie中的数据进行编码
URLEncoder.decode();读取cookie信息时将信息解码
====================================================================
response
====================================================================
response.addCookie()将一个cookie对象发送到客户端
response.sendRedirect(String path); 重定向
====================================================================
application
====================================================================
application.setAttribute(key,value);给application添加属性值
application.getAttribute(key,value);获取指定的值
====================================================================
session
====================================================================
session.setMaxInactiveInterval(int num);设置session对象的有效活动时间
session.isNew();判断是否为新用户  返回Boolean
session.setAttribute();
session.getAttribute();
session.invalidate();销毁当前session
====================================================================