Java面试宝典(待回答篇)
1、oracle如何实现读写分离
(1)基于RAC架构的,使用其中某个节点作为读库;
(2)基于Streams数据复制技术的,实时将数据复制到另外一个库供读取;
(3)使用第三方数据复制软件的,如Golden Gate(已经被Oracle收入囊中)、DSG的,也是实时复制数据到另外一个库中。
(4)使用Logical standby技术,实时复制数据到一个库,且该库是对应用而言是只读的。
2、说说你对排它锁,读写锁的理解
(1)排它锁,也称作独占锁,一个锁在某一时刻只能被一个线程占有,其它线程必须等待锁被释放之后才可能获取到锁。
(2)读写锁拆成读锁和写锁来理解。读锁可以共享,多个线程可以同时拥有读锁,但是写锁却只能只有一个线程拥有,而且获取写锁的时候其他线程都已经释放了读锁,而且该线程获取写锁之后,其他线程不能再获取读锁
3、在读写锁的基础上如何实现防止幻读(不能使用MVCC,也不能使用序列化的隔离级别)
4、线程池用过吗?newcachedThreadPool在使用过程中有什么需要注意的吗
创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
5、oracle的联合主键在创建的时候有什么需要注意的吗
6、谈谈你对分布式的理解
分布式就是把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。
7、js写的怎么样,js是怎样实现继承的
js常用的继承方法有:原型链、借用构造函数、组合继承、原型式继承、寄生式继承、寄生组合式继承。
8、struts Filter和拦截器有什么区别?
拦截器是基于java的反射机制的,而过滤器是基于函数回调。 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
9、抽象工厂方法和工厂方法区别是什么?
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
10、在负载不能支撑的情况下,如何将redis实例从10个扩充到20个
11、说说你对ThreadLocal的理解
(1)每个线程都有自己的局部变量
每个线程都有一个独立于其他线程的上下文来保存这个变量,一个线程的本地变量对其他线程是不可见的(有前提,后面解释) (2)独立于变量的初始化副本
ThreadLocal可以给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证不同的线程都有一份拷贝。 (3)状态与某一个线程相关联
ThreadLocal 不是用于解决共享变量的问题的,不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一个机制,理解这点对正确使用ThreadLocal至关重要。
12、http协议,put用过吗?讲讲,如何使用http协议传送多个文件
(1)在form中设置多个文件输入框,用数组命名他们的名字 (2)在form中设置多个文件输入框,但名字不同
13、可重入锁与syncronized区别() 完美世界:
ReentrantLock除了synchronized的功能,多了三个高级功能. 等待可中断,公平锁,绑定多个Condition. (1)等待可中断
在持有锁的线程长时间不释放锁的时候,等待的线程可以选择放弃等待. tryLock(long timeout, TimeUnit unit)
(2)公平锁
按照申请锁的顺序来一次获得锁称为公平锁.synchronized的是非公平锁,ReentrantLock可以通过构造函数实现公平锁. new RenentrantLock(boolean fair) (3)绑定多个Condition
通过多次newCondition可以获得多个Condition对象,可以简单的实现比较复杂的线程同步的功能.通过await(),signal();
14、约瑟夫问题知道吗?15分钟写出来
public class RingTest{
public static void main(String[] args){ System.out.println(\程序说明如下:\
System.out.println(\由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序.\
//提示输入总人数
System.out.println(\请输入做这个游戏的总人数:\ Scanner sca=new Scanner(System.in); int m=sca.nextInt(); //提示输入要出圈的数值
System.out.println(\请输入要出圈的数值:\
int n=sca.nextInt();
System.out.println(\按出圈的次序输出序号:\
//创建有m个值的数组 int[] a=new int[m];
//初始长度,以后出圈一个,长度就减一 int len=m; //给数组赋值
for(int i=0;i //i为元素下表,j代表当前要报的数 int i=0; int j=1; while(len>0){ if(a[i%m]>0){ if(j%n==0){//找到要出圈的人,并把圈中人数减一 System.out.print(a[i%m]+\ \ a[i%m]=-1; j=1; i++; len--; }else{ i++; j++; } }else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数 i++; } } } } 15、session的实现机制 Session保存在服务器端,为了获得更高的存取速度,服务器一般把Session保存在内存里。需要注意的是只有访问jsp、Servlet等程序时才会创建Session,访问HTML、IMAGE等静态资源时并不会创建Session。Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。 由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间没有活跃的用户的Session从内存里删除。这个时间就是Session的超时时间。如果超过了超时时间没访问服务器,Session就自动失效了。 16、生产者消费者模型的实现 (1)采用某种机制保护生产者和消费者之间的同步; (2)在生产者和消费者之间建立一个管道。第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式。第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强。 17、介绍垃圾回收机制 在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。 垃圾回收能自动释放内存空间,减轻编程的负担。这使Java 虚拟机具有一些优点。首先,它能使编程效率提高。在没有垃圾回收机制的时候, 可能要花许多时间来解决一个难懂的存储器问题。在用Java语言编程的时候,靠垃圾回收机制可大大缩短时间。其次是它保护程序的完整性, 垃圾回收是Java语言安全性策略的一个重要部份 18、如何确定TCP连接关闭(4次握手) 由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭 19、shell用过吗?python用过吗 Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。 Shell有两种执行命令的方式: ?交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。 ?批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。 Python是一种开放源代码的脚本编程语言,这种脚本语言特别强调开发速度和代码的清晰程度。它可以用来开发各种程序,从简单的脚本任务到复杂的、面向对象的应用程序都有大显身手的地方。Python还被当作一种入门程序员最适合掌握的优秀语言,因为它免费、面向对象、扩展性强同时执行严格的编码标准。 20、使用java语言将一个整数分解成一系列的2的n次幂的和,要求输出的顺序从小到大,分解后的数目个数最小,分解后的数目个数最小 比如:65分解输出 1 64;51分解输出1 2 16 32 8、 21、Spring IOC和AOP简单介绍下 IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序。对象及其依赖对象的创建及维护都不需要在应用程序中实现,将其交给IOC容器去管理。对于IOC而言,它强调是将主动变为被动,由IOC容器来负责依赖对象的创建和查找,由IOC容器来进行注入组合对象,我们只需要在相关的配置文件中维护对象之间的依赖关系即可。 AOP利用一种称为“横切”的技术,剖解开封装的对象内部,将那些影响多个类的公共行为封装到一个可重用模块,并将其名为方面(Aspect)。所谓“方面”,简单地说,就是将那些