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;
饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,
而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。
请说出作用域 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底层实现方式?
是一旦数组超出长度,就开始扩容数组。扩容数组调用的方法 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安全.