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)来代替子查询