Java面试宝典

1 HashMap和HashTable的区别


答:HashMap是HashTable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空键值,由于非线程安全,效率上可能高于HashTabel. HashMap可以将null作为一个key或value,而hashTable不允许,HashMap把HashTabled的contains方法去掉了,改成了containskey 和containsvalue,因为contains方法容易让人产生误解。

HashTable继承自Dictionary类,而hashMap是Java1.2引进的map interface的一个实现。最大的不同是,hashtable的方法是Synchronize的,而hashmap不是,在多个线程访问hashtable时,不需要自己为他的方法实现同步,而hashmap则必须为之提供外同步。

HashTabel和hashmap采用的是hash/rehash算法,都大概一样,所以性能上差异不会很大



2 详细描述MVC

答:基于Java的Web应用系统采用MVC架构模式,即model(模型),view(视图),control(控制)分离设计。这是目前WEB应用服务系统的主流设计方向。

Model:处理业务逻辑模块,每一种处理一个模块。

View:负责页面显示,显示Model的处理结果给用户,主要实现数据到页面的转换过程。

Control:负责每个请求的分发,把form数据传递给Model处理,把处理结果的数据传递给view显示。

3 数据连接池的工作机制

答:首先,普通的数据库访问是这样的:程序和数据库建立连接,发送数据操作指令,完成后断开连接,等下一次请求的时候重复这个过程,即每个请求都需要和数据库建立连接和断开,这样当数据量大的时候系统的消耗是很大的。连接池就是为了解决这个问题,在一个空间中预先建立好一定数量的连接,当程序请求数据时直接实现池中现存的连接,不需要重复建立连接和断开的过程,节省了时间并提高的效率。

注:数据库连接池(DBCP,c3p0)耗尽/超时怎么办?

答:关闭连接,加大连接数,释放空闲连接,配置超时选项(dbcp的maxWait,proxool的maximum-connection-lifetime,jboss自带连接池的IdelTimeoutMinutes).

造成数据库连接池的超时总结:

        1. 连接池配置时,要注意的地方:最大连接数<=数据库服务器端配置的最大连接数,否则多余的连接在被应用程序使用时将可能出现连接超时

        2. 网络阻塞:由于每次连接同时往数据库服务器端提交或者维护大量数据,如网络不稳定也会造成连接超时。

        3. 应用程序中释放占用的数据库资源,由于connect(爷)-->statement(父) -->resultSet(子),statement和resultSet被实例化,实际上在数据库端开启游标之类的资源,需要应用程序这边close掉,所以在close连接时,需先关闭resultSet,statement,否则可能导致服务器端资源耗尽,也会出现应用程序超时的问题。

        4 .说出Servlet的生命周期,并说出Servlet和CGI的区别

                答:Servlet的生命周期是由servlet容器来控制的,可以分为3个阶段,初始化,运行,销毁。

初始化阶段

    1.servlet容器加载servlet类,把servlet类的.class文件中的数据读到内存中。

    2. 然后servlet容器创建一个servletConfig对象。ServletConfig对象包含了servlet的初始化配置信息。

    3. Servlet容器创建一个servlet对象。

    4. Servlet容器调用servlet对象的init()方法进行初始化。

运行阶段:

当servlet容器接收到一个请求时,servlet容器会针对这个请求创建servletRequest 和servletResponse对象。然后调用service()方法。并把这2个参数传递给service()方法。Service方法通过servletRequest对象获得请求的信息。然后通过servletResponse对象生成的这个请求的响应结果。然后销毁servletRequest和servletResponse对象,不管这个对象是post提交的还是get提交的,最终这个请求都会游service()方法来处理.

销毁阶段:

当Web应用被终止时,servlet容器会先调用对象的destroy方法,然后再销毁servlet对象,同时也会销毁与servlet对象相关联的servletConfig对象,我们可以在destroy方法的实现中,释放servlet所占用的资源,如,关闭数据库连接,关闭文件的输入输出流等。

注意:在servlet生命周期中,servlet的初始化和销毁只会发生一次,而service方法的执行次数取决于servlet被客户端访问的次数。

5. JAVA常用数据结构及原理分析

Java.util包中三个重要的接口及特点: List(列表),Set(保证集合中元素唯一),Map(维护多个key-value键值对,保证key唯一)。其不同子类的实现各有差异,如是否同步(线程安全),是否有序。

常用的类继承树


Collection(所有集合类的接口)

List,Set都继承自Collection接口,查看JDK API,操作集合的常用方法大部分都在该接口中定义了。


Collections(操作集合的工具类)

对于集合类的操作不得不提到工具类Collections,他提供了许多方便的方法,如求两个集合的并集,差集,拷贝,排序等等。

由于大部分的集合接口实现类都是不同步的,可以使用Collections.synchroniazed*方法创建同步的集合类对象。

如创建一个同步的List:

List synList=Collenctions.synchronizedList(new ArrayList());

    实现原理就是重新封装new出来的对象,操作对象时用关键字synchronized同步。

List(列表):

    ArrayList,Vector是线性表,使用Object数组座位容器去存储数据的,添加了很多方法维护这个数组,使其容量可以动态增长,极大的提升了开发效率。他们 明显的区别是ArrayList是非同步的。Vector是同步的。不用考虑多线程时应使用ArrayList来提升效率。

LinkedList(链表):

    链表随机位置插入,删除数据时比线性表快,遍历比线性表慢。

双向链表原理图:


由此可根据实际情况来选择使用ArrayList(非同步,非频繁删除时选择),Vector(需同步时选择),LinkedList(频繁在任意位置插入,删除是选择).

Map(存储键值对,key唯一)

HashMap的结构实现原理是将put进来的key-value封装成一个Entry对象存储到一个Entry数组中,位置(数组下标)由key的哈希值和数组长度计算而来。如果数据当前下标已有值,则将数组当前下标的值指向新添加的Entry对象。

TreeMap是由Entry对象为节点组成的一颗红黑树(网上很多资料),put到TreeMap的数据默认按key的自然顺序排序,new TreeMap时传入Comparator自定义排序。

Set(保证容器内元素唯一性)

Set结构其实就是维护一个Map来存储数据的,利用Map结构key值唯一性。

HashSet,TreeSet分别默认维护一个HashMap,TreeMap.

6. java开发中的23种设计模式

总体来说,设计模式分为三大类:

创建型模式:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。

结构型模式:适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。

行为型模式:策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,中介者模式,解释器模式。

jvm内存优化,缓存,高并发。

7. EJB到底是什么

    A.EJB实现原理:就是把原来放到客户端实现的代码放到服务器端,并依靠RMI进行通信

    B. RMI实现原理:就是通过Java对象序列化机制实现分布式计算

    C. 服务式集群:就是通过RMI通信,连接不同功能模块的服务器,以实现一个完整的功能。

    注:详解请参考:https://www.cnblogs.com/strugglion/p/6027318.html

8. EJB的3大组件

    1. 会话bean

    2.消息驱动bean

    3. 实体

会话bean和消息驱动bean用于实现EJB应用程序的业务逻辑,而实体用于持久化。


Spring的工作原理:

1. spring的原理

        内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调用对象里的方法的 。    

        Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过配置类达到的。   

         Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置 内部通过反射去动态的组装对象)要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。

        Spring里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了,是一个很常用的设计模式), Spring里的配置是很多的,很难都记住,但是Spring里的精华也无非就是以上的两点,把以上两点跟理解了 也就基本上掌握了Spring.

Spring AOP与IOC

一、IoC(Inversion of control): 控制反转

    1、IoC:

概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系

核心:bean工厂;在Spring中,bean工厂创建的各个实例称作bean

二、AOP(Aspect-Oriented Programming): 面向方面编程

1、 代理的两种方式: 

 静态代理:  

        针对每个具体类分别编写代理类;  

         针对一个接口编写一个代理类; 

 动态代理:针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类

2、动态代理:

不用写代理类,虚拟机根据真实对象实现的接口产生一个类,通过类实例化一个动态代理,在实例化动态代理时将真实对象及装备注入到动态代理中,向客户端公开的是动态代理,当客户端调用动态代理方法时,动态代理根据类的反射得到真实对象的Method,调用装备的invoke方法,将动态代理、 Method、方法参数传与装备的invoke方法,invoke方法在唤起method方法前或后做一些处理。

1、产生动态代理的类:

     java.lang.refect.Proxy

2、装备必须实现InvocationHandler接口实现invoke方法

3、反射

什么是类的返射?

通过类说明可以得到类的父类、实现的接口、内部类、构造函数、方法、属性并可以根据构造器实例化一个对象,唤起一个方法,取属性值,改属性值。如何得到一个类说明:

    Class cls=类.class;

    Class cls=对象.getClass();

    Class.forName("类路径");

如何得到一个方法并唤起它?

    Class cls=类.class;

    Constructor cons=cls.getConstructor(new Class[]{String.class});

    Object obj=cons.newInstance(new Object[]{"aaa"});

    Method method=cls.getMethod("方法名",new Class[]{String.class,Integer.class});

method.invoke(obj,new Object[]{"aa",new Integer(1)});

4、spring的三种注入方式是什么?

        setter

        interface

        constructor

5、spring的核心接口及核类配置文件是什么?

       FactoryBean:工厂bean主要实现ioc/di

    ApplicationContext ac=new     FileXmlApplicationContext(“applicationContext.xml”);

      Object obj=ac.getBean("id值");

6. Spring框架的7个模块

    Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

    核心容器:核心容器提供Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

    Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

    Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

    Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

     Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

    Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

    Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

    Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。

WebService工作原理

Map的工作原理

Restful接口

请求转发:即request.getRequestDispatcher().forword(),是一种服务器的行为,客户端只有一次请求。服务器端转发后会将请求对象保存,地址栏中的URL地址不会变,得到响应后服务器端再将响应发给客户端。

请求重定向:即response.sendRedirect(),是一种客户端的行文,从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的URL地址会改变。

举个生活中的例子,某人要去办理护照:

转发:某人去了甲局,甲局看了之后,知道护照应该由乙局来管,但甲局的工作人员并没有赶走某人,而是让某人等着,自己在办公室后面联系乙局的工作人员,乙局护照办好后送给甲局,然后甲局的工作人员将护照交给了某人。

重定向:某人去了甲局后,甲局的工作人员说护照不归他们他们管,应该去乙局,然后某人自己去了乙局,办了护照。

负载均衡https://www.cnblogs.com/danbing/p/7459224.html


Spring的3种注入方式:构造方法注入,setter注入,基于注解的注入

常见的5种runTimeException并加以说明:

1. Object x =new Integer(0);  System.out.println((String x));

当试图将对象强制转换为不是实例的子类时,抛出该异常(ClassCastException)

2.  int a=5/0

一个整数除以零时,抛出ArithmeticException异常

3.  String s=null;  int size=s.size();

当应用程序试图在需要对象的地方使用null时,抛出NullPointerException异常

4. String s=”hello”;  s.indexOf(-1);

当索引为负,或者超出字符串的大小时,抛出StringIndexOutOfBoundsException异常

5. String [] ss=new String[-1];

如果应用程序试图创建大小为负的数组,则抛出NegativeArraySizeException异常

MYSQL数据库优化:

1. 选取最适用的字段属性

        MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,可以尽量将表中的字段的宽度设的尽可能小。还有,尽量把字段设置为NOT NULL, 这样,在查询的时候,数据库不用去比较NULL值。

2.使用连接(join)来代替子查询

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容