java面试题摘记

1.Q:finally块中的代码一定会执行吗?

  A:JVM正常运行的情况下,finally块一定会执行。
  E:
    public static void main(String[] args) {
        try {
            System.out.println("how's the weather today?");
            System.exit(0);
        } catch (Exception e) {
            System.out.println("i don't know");
        }finally{
            System.out.println("weather is fine");
        }

2.什么是AJAX?

AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术。它使用:
使用XHTML+CSS来标准化呈现;
使用XML和XSLT进行数据交换及相关操作;
使用XMLHttpRequest对象与Web服务器进行异步数据通信; 
使用Javascript操作Document Object Model进行动态显示及交互; 
使用JavaScript绑定和处理所有数据。
**工作原理**:
Ajax的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步化。
并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做, 
只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。
    Ajax其核心只有JavaScript、XMLHTTPRequest和DOM,在旧的交互方式中,由用户触发一个HTTP请求到服务器,服务器对其进行处理后再返回一个新的HTHL页到客户端,
    每当服务器处理客户端提交的请求时,客户都只能空闲等待,并且哪怕只是一次很小的交互、只需从服务器端得到很简单的一个数据,都要返回一个完整的HTML页,
而用户每次都要浪费时间和带宽去重新读取整个页面。而使用Ajax后用户从感觉上几乎所有的操作都会很快响应没有页面重载(白屏)的等待。

3.转发与重定向的区别?

转发:一个请求
重定向:两个请求

4.过滤器与拦截器的区别?

过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符
拦截器,是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

拦截器与过滤器的区别 :
拦截器是基于java的反射机制的,而过滤器是基于函数回调。
拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
执行顺序 :过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。个人认为过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;Action处理完成返回后,拦截器还可以做其他过程(还没想到要做啥),再向上返回到过滤器的后续操作。

面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。
但是人们也发现,在分散代码的同时,也增加了代码的重复性。什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。
也许有人会说,那好办啊,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。
这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的。
AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充。

5.Java实现四舍五入的方法?

Math.round(3.2)=3;  Math.round(3.5)=4; Math.round(-3.2)=-3; Math.round(-3.5)=-3; Math.round(-3.6)=-4;

6.abstract class和interface有什么区别?

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),
它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。
不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。
不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。
取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。
接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。
接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。
当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。
由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。
引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

7. 编码问题

      GBK:编码中文占用2个字节,英文占用1个字节;
    UTF-8:编码中文占用3个字节,英文占用1个字节;
 UTF-16be:编码中文占用2个字节,英文占用2个字节;

8. 字节流&& 字符流:

(5)FileInputStream -->具体实现了在文件上读取数据
(6)FileOutStream 实现了向文件中写出byte数据的方式
(7)DataOutputStream/DataInputStream
    对"流"功能的扩展,可以更加方便的读取int,long,字符等类型数据
    DataOutputStream
        writeInt()/writeDouble()/writeUTF()
(8)BufferedInputStream&BufferedOutputStream
    这两个流类为IO提供了带缓冲区的操作,一般打开文件进行写入或读取操作时,都会加上缓冲,这种流模式提高了IO的性能
    从应用程序中把输入放入文件,相当于将一缸水倒入到另一个缸中:
    FileOutputStream    --->write()方法   相当于一滴一滴
    DataOutputStream    --->writeXxx()方法      方便一些一瓢一瓢
    BufferedOutputStream    --->write()     更方便先一瓢一瓢放入水桶,再倒入另一个缸里

(3)字符流(Reader Writer)--->操作的是文本文本文件
     字符的处理,一次处理一个字符
     字符的底层依然是基本的字节序列
     字符流的基本实现
    InputStreamReader   完成byte流解析为char流,按照编码解析
    OutputStreamWriter  提供char流到byte流,按照编码处理

    FileReader/FileWriter

9.List与Set的区别?

List接口 
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。
Set接口   Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。  很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素
List和Set都是接口 他们各自有自己的实现类,有无顺序的实现类,也有有顺序的实现类。
最大的不同就是List是可以重复的。而Set是不能重复的。List适合经常追加数据,插入,删除数据。但随即取数效率比较低。Set适合经常地随即储存,插入,删除。但是在遍历时效率比较低。
list,set都是可以使用collections.sort()排序的

10.多线程

如何正确的开启、停止一个线程?
---------
开启:
XXThread xxThread=new XXThread();
xxThread.start();
停止:
    [1].使用标志  boolean xx=false;停止;
    [2].stop();方法被弃用了,原因是因为该方法会使线程事务戛然而止,有可能存在未完成的事务。
    [3].interrupt();该中断线程方法初衷并不能正确地停止线程,它会修改中断线程的状态,不过如果当一个线程因为调用了某些方法而被阻塞的情况下(如wait(),wait(long),join(),join(long),sleep(),sleep(long)等),
         会使得中断状态被清除,并且该线程会收到一个中断异常InterruptedException

11.Maven:构建依赖管理的工具

【1】Maven为我们提供良好的依赖管理,是我们从繁琐的依赖管理中解脱出来
【2】.M2中settings.xml是为了以后升级Maven时不用再更改配置
Maven的安装使用

12.springMVC

MVC的核心思想是业务数据抽取与业务数据展示相分离

springMVC:
        第一步:发起请求到前端控制器(DispatcherServlet)
        第二步:前端控制器请求HandlerMapping查找Handler
            可根据xml配置、注解进行查找
        第三步:处理器映射器HandlerMapping向前端控制器返回Handler
        第四步:前端控制器调用处理器适配器去执行Handler
        第五步:处理器适配器执行Handler
        第六步:Handler执行完成给适配器返回ModelAndView
        第七步:处理器适配器向前端控制器返回ModelAndView
             ModelAndView是springmvc框架的一个底层对象,包括Model和view
        第八步:前端控制器请求视图解析器进行视图解析
            根据逻辑视图名解析成真正的视图(jsp)
        第九步:视图解析器向前端控制器返回view
        第十步:前端控制器进行视图渲染
            视图渲染将模型数据(在ModelAndView对象中)填充到request域
        第十一步:前段控制器向用户响应结果

13.Cookie与Session的区别

 1.  cookie数据存放在客户的浏览器上,session数据放在服务器上;
 2.  cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session; 
 3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
 4. 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;

Cookie和Session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用。注意:有些资料说ASP解决这个问题,当浏览器的cookie被禁掉,服务端的session任然可以正常使用
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值