0、Oracle-那些列可以建索引,那些列不可以建索引
什么字段应该建立索引
在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
什么字段不适合建立索引
在查询中很少使用或者参考的列
只有很少数据值的列 ,例如性别
更新频繁,检索不频繁的列
大数据对象类型的列
1、多态的实现机制
◆强制的:一种隐 式做类型转换的方法。◆重载的:将一个标志符用作多个意义。
◆参数的:为不同类型的参数提供相同的操作。
◆包含的:类包含关系的抽象操作。
2、类加载的原理
JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先
将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
3、举一个线程同步的例子
4、对SOA的理解
类似玩积木,模块拼接
5、用过什么开源web框架
Struts2、hibernate、spring、ibatis。
6、讲述各种排序算法的特点
插入、希尔、冒泡、合并、选择、堆、快速、桶式排序
7、如何处理对数据库某张表的大量并发处理,性能提高
Oracle只在修改时才对数据加行级锁
8、数据库中各种表的关联关系的理解
一对一、一对多、多对多
9、面向对象的特征
封装、继承、多态、抽象
1、Lucene和Nutch的区别
Lucene 不是完整的应用程序,而是一个用于实现全文检索的软件库。
Nutch 是一个应用程序,可以以 Lucene 为基础实现搜索引擎应用。
2、通过什么途径了解最新的技术发展
3、HashMap和HashTable的区别
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
4、Hibernate工作原理及为什么要用?
原理:
1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息
3.通过config.buildSessionFactory();//创建SessionFactory
4.sessionFactory.openSession();//打开Sesssion
5.session.beginTransaction();//创建事务Transation
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事务
8.关闭Session
9.关闭SesstionFactory
为什么要用:
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
5、一个请求在Struts2框架中的处理大概分为以下几个步骤
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
6、常用设计模式
1.单例模式:如果一个类始终只能创建一个实例,则这个类被称为单例类,这种模式就被称为单例模式。
单例模式主要有如下两个优势:
1)减少创建Java实例所带来的系统开销
2)便于系统跟踪单个Java实例的生命周期、实例状态等。
2.简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例。
缺陷:当产品修改时,工厂类也要做相应的修改。
优势:让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的
调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。
3.工厂方法:如果我们不想在工厂类中进行逻辑判断,程序可以为不同产品类提供不同的工厂,不同的工厂类和
产不同的产品。当使用工厂方法设计模式时,对象调用者需要与具体的工厂类耦合。
4.代理模式:当客户端代码需要调用某个对象时,客户端实际上不关心是否准确得到该对象,
它只要一个能提供该功能的对象即可,此时我们就可返回该对象的代理。
Spring所创建的AOP代理就是这种动态代理。但是Spring AOP更灵活。
5.命令模式:某个方法需要完成某一个功能,完成这个功能的大部分步骤已经确定了,但可能有少量具体步骤无
法确定,必须等到执行该方法时才可以确定。传入该方法的是某个接口的匿名实现类的实例,该接口通常被称为命令接口,这种设计方式也被称为命令模式
HibernateTemplate使用了executeXxx()方法弥补了HibernateTemplate的不足,该方法需要接受一个HibernateCallback接口
6.策略模式用于封装系列的算法,这些算法通常被封装在一个被称为Context的类中,客户端程序可以自由选择其中一种算法,或让Context为客户端选择一种最佳算法。
优势是为了支持算法的自由切换。
缺点:客户端代码
需要和不同的策略耦合。
7。门面模式(Facade)也被称为正面模式、外观模式,这种模式用于将一组复杂的类包装到一个简单的外部接口中。
8.桥接模式:桥接模式的做法是把变化部分抽象出来,使变化部分与主类分离开来,从而将多个的变化彻底分离。最后提供一个管理类来组合不同维度上的变化,
通过这种组合来满足业务的需要。
Java EE应用中常见的DAO模式正是桥接模式的应用。
9.观察者模式:观察者模式定义了对象间的一对多依赖关系,让一个或多个观察者对象观察一个主题对象。
当主题对象的状态发生变化时,系统能通知所有的依赖于此对象的观察者对象,从而使得观察者对象能够自动更新。
10.State模式:允许一个对象在其内部状态改变时改变它的行为
7、比如spring有哪些常用技术:
Spring是一个轻型容器(light-weight container),其核心是Bean工厂(Bean Factory),用以构造我们
所需要的M(Model)。在此基础之上,Spring提供了AOP(Aspect-Oriented Programming, 面向层面的编程)
的实现,用它来提供非管理环境下申明方式的事务、安全等服务;对Bean工厂的扩展ApplicationContext更
加方便我们实现J2EE的应用;DAO/ORM的实现方便我们进行数据库的开发;Web MVC和Spring Web提供了Java Web应用的框架或与其他流行的Web框架进行集成。
8、AOP面向切面--Proxy模式:AOP为Aspect Oriented Programming的缩写,意为:面向切面编程。
可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术,我
们可以理解为在一个服务的流程中,插入与该服务的业务逻辑无关的系统服务逻辑,如日志、安全认证等等
8、IOC(Inversion of Control)控制反转(DI--Dependency Injection依赖注入)--State模式:容器动态的将某种依赖注入到组件之中。
9、JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。
0、乐观锁和悲观锁的区别:悲观锁假定其他用户企图访问或者改变你正在访问、更改的对象的概率是很高的,因此
在悲观锁的环境中,在你开始改变此对象之前就将该对象锁住,并且直到你提交了所作的更改之后才释放锁。悲
观的缺陷是不论是页锁还是行锁,加锁的时间可能会很长,这样可能会长时间的限制其他用户的访问,也就是说
悲观锁的并发访问性不好。与悲观锁相反,乐观锁则认为其他用户企图改变你正在更改的对象的概率是很小的,
因此乐观锁直到你准备提交所作的更改时才将对象锁住,当你读取以及改变该对象时并不加锁。
1、transient和volatile是java关键字吗?(瞬联)
transient是修饰变量不被序列化
volatile是修饰变量局部的线程同步
2、能说一下java的反射机制吗?(瞬联)
开放性和原因连接(causally-connected)是反射系统的两大基本要素
反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。
下面具体介绍一下java的反射机制。这里你将颠覆原来对java的理解。
Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method;其中class代表的时类对 象
3、如果类a继承类b,实现接口c,而类b和接口c中定义了同名变量,请问会出现什么问题?
ambiguous 引起歧义的
4、请说一下java中为什么要引入内部类?还有匿名内部类?
nner class得以让你控制“某个class在另一个class中的可视性”。
anonymous inner class 为可实现一个功能或者实例化一个对象, 需要实现一个接口, 但是接口应用的地方很多, 但是每个地方的实现
都不尽相同, 而且需要实例化的地方就只只有那么一两处, 这个时候, 如果为了这些地方, 每个声明一个类来
实现接口的话, 就会浪费很多空间, 还得费时编译, 匿名内部类可以在需要的地方使用接口, 可以在使用的同
时实现, 这样不但节省了空间, 还可以使代码更加明了
5、请说一下HTTP请求的基本过程
http1
http1.1
会。java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,
尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。
7、请说一下java中的内存回收机制所采用的算法(IBM,瞬联)
标记-清除算法:
经典方法,网上有很多,这里只说一下finalize。
1.在finalize()中再次引用自己,可以避免对象被回收掉;
2.finalize()方法只会被调用一次,如果对象面临下一次回收,finalize是不会执行第二遍的;
3.需要执行finalize()的对象会被放入一个F-Queue中,由一个优先级比较低的线程去执行。(需注意多线程同步)
复制算法:
将内存划分为大小相等的两块,每次只使用其中的一块,当这一块用完了,就将还存活着的对象复制到另一块,
然后清理掉使用过的内存。非活动的对象就被回收了,并且内存分配时也不用考虑内存碎片,只需按顺序分配即可。
这种实现比较简单、高效。缺点是每次浪费一半内存空间。
优化:
1.实践中可以根据每次会被回收的比例,安排一个合适的内存空间比例,比如9:1,90%的内存可被使用,仅有10%的空闲。
2.向一端移动:有点类似memcpy,将所有存活对象向一端移动,覆盖可回收对象,边界以外的内存空间都是可用内存空间。
8.精简指令集与复杂指令集的区别比较
复杂指令集CPU内部为将较复杂的指令译码,也就是指令较长,分成几个微指令去执行,正是如此开发程序比较
容易(指令多的缘故),但是由于指令复杂,执行工作效率较差,处理数据速度较慢,PC 中 Pentium的结构都
为CISC CPU。
RISC是精简指令集CPU,指令位数较短,内部还有快速处理指令的电路,使得指令的译码与数据的处理较快,所
以执行效率比CISC高,不过,必须经过编译程序的处理,才能发挥它的效率,
9.对于单链表的逆置有两种方法可以实现:
(1)利用辅助指针
基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。
(2)递归
基本思想:在对当前结点逆置时,先递归地逆置其后继结点,然后将后继结点指向当前结点。
0.两个有序的数组,如何高效地判断相同字编程实现?
O(n)算法。因为两个数组都是排好序的。所以只要一次遍历就行了。首先设两个下标,分别初始化为两个数组
的起始地址,依次向前推进 。推进的规则是比较两个数组中的数字,小的那个数组的下标向前推进一步,直
到任何一个数组的下标到达数组末尾时,如果这时还没碰到相同的数字,说明数组中没有相同的数字。
1.有1000桶酒,其中1桶有毒。而一旦吃了,毒性会在1周后发作。现在我们用小老鼠做实验,要在1周后找出那桶
毒酒,问最少需要多少老鼠
10只老鼠按顺序排好,每桶酒按照编号转换成二进制,给相应位置上是1的老鼠喝。最后按死掉的老鼠是哪几只,然后排成二进制,再转成十进制就是第几桶酒。
比如:第70桶酒,70转换成二进制就是0001000110,那么就给第四、八、九只老鼠喝。如果最后死掉第三、七、八只老鼠,那么就是0010001100,转换成十进制就是140,即140桶酒有毒。
2.topn指的是从已经存在的数组中,找出最大(或最小)的前n个元素。
topn算法实现思路(找最大的n个元素)
1:取出数组的前n个元素,创建长度为n的最小堆。
2:从n开始循环数组的剩余元素,如果元素(a)比最小堆的根节点大,将a设置成最小堆的根节点,并让堆保持最小堆的特性。
3:循环完成后,最小堆中的所有元素就是需要找的最大的n个元素。
堆的定义是:n个元素的序列{k1,k2,…,kn},当且仅当满足如下关系时被成为堆
(1)Ki <= k2i 且 ki <= k2i-1
或 (2) Ki >= k2i 且 ki >= k2i-1
(i = 1,2,…[n/2])
当满足(1)时,为最小堆,当满足(2)时,为最大堆。
3.java语言特点
1.Java是面向对象语言
2.Java是静态类型
3.Java是编译型的
4.Java是跨平台的
5.Java的鲁棒性
6.Java是多线程的
7.Java自动收集无用的垃圾对象
8.Java是快速的安全的
9.Java是可扩展的
4.Thread.setDaemon的用法,经过学习以后了解:
1. setDaemon需要在start方法调用之前使用
2. 线程划分为用户线程和后台(daemon)进程,setDaemon将线程设置为后台进程
3. 如果jvm中都是后台进程,当前jvm将exit。(随之而来的,所有的一切烟消云散,包括后台线程啦)
4. 主线程结束后,
1) 用户线程将会继续运行
2) 如果没有用户线程,都是后台进程的话,那么jvm结束
另外:
setDaemon方法把java的线程设置为守护线程,此方法的调用必须在线程启动之前执行。只有在当前jvm中所有的线程都为守护线程时,jvm才会退出。
如果创建的线程没有显示调用此方法,这默认为用户线程。
5.java语言的鲁棒性(robustness)
控制系统在其特性或参数发生摄动时仍可使品质指标保持不变的性能。
Java在编译和运行程序时 ,都要对可能出现的问题进行检查 ,以消除错误的产生。它提供自动垃圾收集来进
行内存管理 ,防止程序员在管理内存时容易产生的错误。通过集成的面向对象的例外处理机制 ,在编译时,
Java提示出可能出现但未被处理的例外 ,帮助程序员正确地进行选择以防止系统的崩溃。另外, Java在编译
时还可捕获类型声明中的许多常见错误,防止动态运行时不匹配问题的出现。