总结面试题

1springmvc 工作原理

1.用户发送请求被核心控制器DispacherServlet捕获,交给HadlerMapping

2.HadlerMapping处理器映射器,根据请求路径找到相应的HadlerAdpter处理适配器(或拦截器controller拦截)。

3.HadlerAdpater处理器适配器,处理一些请求返回一个modleandview (包括模型数据,逻辑视图名)。

4.VireResolver 试图解析器,先根据ModelAndView中设置的view解析具体视图。

5然后再将Modelandview 返回数据渲染到view上。

//该方法是HandlerMapping接口中的唯一方法,此方法可以利用用户请求request中的信息来生成HandlerExecutionChain对象

 HadlerMapping 有两个分支一个是AbstractUrlHandlerMapping,AbstractHandlerMethodMapping他们又统一继承于AbstractHandlerMapping。

 //该方法是HandlerMapping接口中的唯一方法,此方法可以利用用户请求request中的信息来生成HandlerExecutionChain对象
    HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
 二
单例模式:
1.单例类只有一个实例
2.单例类必须有一个自己的唯一实例
3.单例类必须给所有其他对象提供这一实例。
 

饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,

而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。

想实现单例有几种典型方式:懒汉模式,双重校验锁。饿汉模式,登记式/静态
 三
“==”和equals 的区别:
如果判断值类型的话就是判断的内容是否相同,如果判断引用类型判断的是内存地址是否相同。
 
Integer 和int区别:
Interger是引用类型默认是null,int是数值类型 默认0.
 

请说出作用域 public private protected,以及不写时的区别

作用域      当前类     同一包  子孙类   其他包

public      √         √        √         √

private     √          √       √          错

protected     √                   √                错                错

friendly         √                     √             错                错

重载与重写区别?

重载是在同一个类中,方法名称相同,但是参数或个数不同,与返回值类型无关

重写是在多个类中, 产生继承关系。父类与子类的方法方法必须相同

接口与抽象类的区别?

不同点;

定义接口的关键字是:interface 而定义抽象类的关键字是:abstract。

接口中不能有私有的,而抽象类可以有

接口中不能有普通方法,抽象类可以有

相同点:

都不用new

String、StringBuffer与StringBuilder的区别

先从运行速度快慢来说

StringBuilder》》StringBuffer>>>String

String最慢,StringBuilder最快

  String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的

 
1 String str="abc";
2 System.out.println(str);
3 str=str+"de";
4 System.out.println(str);

因为String str是常量,StringBuffer和StringBuilder是变量,作为常量1行是将str =abc付给String ,第三行 str有在str上+了abcde ,表面上虽然改了,但是在后台虚拟机中jvm将回收垃圾,原来的str将回收了第一次付的,一旦创建了就不可更改了。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。

       我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来    执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。

     而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。

说一下ArrayList底层实现方式?

 一:Arraylist 通过无参构造函数 默认长度数组是10,add方法底层如果长度超度10,那么arraylist就会生成一个新的数组,长度为原数组的1.5倍+1,然后将原数组的内容复制到新的数组中,并且后续的新加的内容都加到arraylist中,当新数组无法容纳增加新数组时,重复该过程时,又

是一旦数组超出长度,就开始扩容数组。扩容数组调用的方法 Arrays.copyOf(objArr, objArr.length + 1);

List、Map、Set 三个接口,存取元素时,各有什么特点?

List 存储:有序的,可重复的

访问 可以foreatch 循环,iterrator 迭代

set存储:无序 的,不可重复的。

访问可以foreatch循环,itorter 迭代

map 一对一迭代 映射 一对一  “key==value“ key值无序,不重复的,value 可重复的

Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?它们有何区别?

set里的元素是不能重复的,用iterator()方法来区分重复与否。

equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。

==用于比较引用和比较基本数据类型时具有不同的功能:

比较基本数据类型,如果两个值相同,则结果为true

而在比较引用时,如果引用指向内存中的同一对象,结果为true

HashMap 和 Hashtable 的区别

hashmap    线程不安全  允许有null值和key  如果方法不是Synchronize要提供方方法同步。 

HashMap是Hashtable的轻量级实现

hashtable  线程安全  

不允许有null的键和值  

方法是是Synchronize的

Hashtable 比HashMap 要旧

什么是泛型,怎么使用的,有什么好处?

答案

 定义一个集合时,可以知道里面定义的是什么类型

使用:在集合类型后面加< 数据类型 >

使用泛型后,从集合中取得元素后就不用再用强转 

HashMap和ArrayList是不是都是线程不安全的?

ArrayList是线程不安全的;HashMap是线程不安全的;还有我们常见的一些JAVA集合都是线程不安全,这样做是为了提高性能

JDK5以后提供了线程安全的并发包java.util.concurrent并发包,譬如里面的类CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap等

ArrayList集合加入1万条数据,应该怎么提高效率

因为arraylist的底层是数组是,并且数组默认是10,如果是插入10000条数据,需要不断扩容就耗费时间,所以我们调用arraylist 的Arraylist(int size )就可以实现不断扩容。

说一下Http协议中302状态(阿里经常问)

http协议中,返回状态码302表示重定向。

这种情况下,服务器返回的头部信息中会包含一个 Location 字段,内容是重定向到的url

组成:http请求由三部分组成,分别是:请求行、消息报头、请求正文

特性:HTTP协议的主要特点可概括如下:

1.支持客户/服务器模式。

get与post请求区别?(初级程序员必备问题)

get与post请求区别?(初级程序员必备问题)

区别一:

  get重点在从服务器上获取资源,post重点在向服务器发送数据;

区别二:

   get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用"?"连接,多个请求数据间用"&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的;

post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的;

区别四:

   get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;

post较get安全性较高;

区别五:

   get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码。

post支持标准字符集,可以正确传递中文字符。

区别三:

讲下Servlet的执行流程。doGet和doPost的区别

  Servlet的执行流程也就是servlet的生命周期,当服务器启动的时候生命周期开始,然后通过init()《启动顺序根据web.xml里的startup-on-load来确定加载顺序》方法初始化servlet,再根据不同请求调用doGet或doPost方法,最后再通过destroy()方法进行销毁。

doGet和doPost都是接受用户请求的方法,doGet处理get请求,doPost处理post请求,doGet用于地址栏提交,doPost用于表单提交,在页面提交数据时,get的数据大小有限制4k,post没有限制,get请求提交的数据会在地址栏显示,post不显示,所以post比get安全.

原文地址:https://www.cnblogs.com/hualishu/p/10115590.html