面试宝典已回答篇.docx
- 文档编号:26707721
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:15
- 大小:26.76KB
面试宝典已回答篇.docx
《面试宝典已回答篇.docx》由会员分享,可在线阅读,更多相关《面试宝典已回答篇.docx(15页珍藏版)》请在冰豆网上搜索。
面试宝典已回答篇
Java面试宝典(待回答篇)
1、oracle如何实现读写分离
(1)基于RAC架构的,使用其中某个节点作为读库;
(2)基于Streams数据复制技术的,实时将数据复制到另外一个库供读取;
(3)使用第三方数据复制软件的,如GoldenGate(已经被Oracle收入囊中)、DSG的,也是实时复制数据到另外一个库中。
(4)使用Logicalstandby技术,实时复制数据到一个库,且该库是对应用而言是只读的。
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(longtimeout,TimeUnitunit)
(2)公平锁
按照申请锁的顺序来一次获得锁称为公平锁.synchronized的是非公平锁,ReentrantLock可以通过构造函数实现公平锁. newRenentrantLock(booleanfair)
(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 a[i]=i+1; //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: InversionofControl(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序。 对象及其依赖对象的创建及维护都不需要在应用程序中实现,将其交给IOC容器去管理。 对于IOC而言,它强调是将主动变为被动,由IOC容器来负责依赖对象的创建和查找,由IOC容器来进行注入组合对象,我们只需要在相关的配置文件中维护对象之间的依赖关系即可。 AOP利用一种称为“横切”的技术,剖解开封装的对象内部,将那些影响多个类的公共行为封装到一个可重用模块,并将其名为方面(Aspect)。 所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑封装起来的部分。 以便于减少系统的重复代码,降低模块间的耦合度,并有利于系统维护。 22、jdk1.5以后出来的并发包了解吗? 介绍lock接口的signal与notify区别,wait与await()区别 CyclicBarrier是JDK5中Java.util.Concurrent包中提出的同步类。 CyclicBarrier可以用来等待子任务都完成后执行最后的任务。 所有的线程等待其它线程到达Barrier。 CyclicBarrier初始化时指定需要等待的线程数,通过调用CyclicBarrier.await()方法,所有线程阻塞等待直到都调用了await()方法。 (1).lock不再用synchronize把同步代码包装起来; (2).阻塞需要另外一个对象condition; (3).同步和唤醒的对象是condition而不是lock,对应的方法是await和signal,而不是wait和notify。 23、如何解决闭环的链表(快慢指针或者mark换效率) 24、生产者消费问题实现 (1)wait()/nofity()方法是基类Object的两个方法,也就意味着所有Java类都会拥有这两个方法,这样,我们就可以为任何对象实现同步机制。 wait()方法: 当缓冲区已满/空时,生产者/消费者线程停止自己的执行,放弃锁,使自己处于等等状态,让其他线程执行。 notify()方法: 当生产者/消费者向缓冲区放入/取出一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态。 (2)在JDK5.0之后,Java提供了更加健壮的线程处理机制,包括同步、锁定、线程池等,它们可以实现更细粒度的线程控制。 await()和signal()就是其中用来做同步的两种方法,它们的功能基本上和wait()/nofity()相同,完全可以取代它们,但是它们和新引入的锁定机制Lock直接挂钩,具有更大的灵活性。 通过在Lock对象上调用newCondition()方法,将条件变量和一个锁对象进行绑定,进而控制并发程序访问竞争资源的安全。 25、数据结构了解吗? HashMap实现原理? 数据结构主要指逻辑结构和物理结构;数据之间的相互关系称为逻辑结构。 通常分为四类基本结构: 集合结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构结构中的数据元素之间存在一对一的关系。 树型结构结构中的数据元素之间存在一对多的关系。 图状结构或网状结构结构中的数据元素之间存在多对多的关系 HashMap结构的实现原理是将put进来的key-value封装成一个Entry对象存储到一个Entry数组中,位置(数组下标)由key的哈希值与数组长度计算而来。 如果数组当前下标已有值,则将数组当前下标的值指向新添加的Entry对象。 26、hibernate orm的实现原理(xml解析,反射调用javaBean方法) 在使用它实现ORM功能的时候,主要的文件有: 映射类(*.java)、映射文件 (*.hbm.xml)以及数据库配置文件(*.properties或*.cfg.xml),它们各自的 作用如下。 ⑴映射类: 它的作用是描述数据库表的结构,表中的字段在类中被描述成属性, 将来就可以实现把表中的记录映射成为该类的对象。 ⑵映射文件: 它的作用是指定数据库表和映射类之间的关系,包括映射类和数据 库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对 应关系等。 ⑶数据库配置文件: 它的作用是指定与数据库连接时需要的连接信息,比如连接 哪中数据库、登录用户名、登录密码以及连接字符串等。 27、对http协议了解吗? get,post,put,delete使用场景以及http1.1与1.0区别(长短连接) http叫超文本传输协议,是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。 GET: 请求指定的页面信息,并返回实体主体。 POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。 PUT: 从客户端向服务器传送的数据取代指定的文档的内容。 DELETE: 请求服务器删除指定的页面 1,HTTP/1.0协议使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象,; 2,HTTP/1.1默认使用持久连接(然而,HTTP/1.1协议的客户机和服务器可以配置成使用非持久连接)。 在持久连接下,不必为每个Web对象的传送建立一个新的连接,一个连接中可以传输多个对象! 28、介绍下你的项目,sql常用的优化技巧(结构优化,索引优化,sql优化) (1)不要在建立的索引的数据列上进行下列操作: 避免对索引字段进行计算操作 避免在索引字段上使用not,<>,! = 避免在索引列上使用ISNULL和ISNOTNULL 避免在索引列上出现数据类型转换 避免在索引字段上使用函数 避免建立索引的列中使用空值 (2)SELECT子句中避免使用’*’ (3)使用表的别名(Alias) (4)ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾 29、谈谈你对分布式和cluster的理解 所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。 簇(cluster),我们知道磁盘是由一个一个扇区组成的,若干个扇区合为一个簇,文件存取是以簇为单位的,哪怕这个文件只有1个字节。 每个簇在文件分配表中都有对应的表项,簇号即为表项号,每个表项占1.5个字节(磁盘空间在10MB以下)或2个字节(磁盘空间在10MB以上)。 30、介绍jvm内存模型和垃圾回收机制(栈帧,堆,方法区,分代回收机制) JVM内存模型 1.栈 Java栈是与每个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程.存储局部变量,引用,方法,返回值等. StackOverflowError: 如果在线程执行的过程中,栈空间不够用,那么JVM就会抛出此异常,这种情况一般是死递归造成的. 2.堆 JVM堆一般分为三个部分: (1).Young: 年轻代 Young区被分为三个部分,Eden区和两个大小严格相同的Survivor区,其中Survivor区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用,在Young区间变满的时候,minorGC就会将存活的对象一到空闲的Survivor区间中,根据JVM的策略,在经过几次垃圾收集后,仍然存活于Suvivor的对象被移动到Tenured区间. (2)Tenured: 老年代 Tenured区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在Young复制转移一定的次数以后,对象就会被转移到Tenured区,一般如果系统中用了application级别的缓存,缓存中的对象往往会被转移到这一区间. (3)Perm持久代: Perm代主要保存class,method,filed等对象,这部分空间一般不会溢出. Java.lang.OutofMemoryError: PermGenspace的错误,造成这个错误的很大原因就是可能每次都重新部署,但重新部署后,类的class没有被卸载掉,这样就造成了大量class对象保存在了perm中,这种情况下,一般重新启动应用服务器可以解决问题. 3.堆的大小 -Xmx: 指定JVM堆得最大内存,在JVM启动以后,会分配-Xmx参数指定大小的内存给JVM,但是不一定全部使用,JVM会根据-Xms参数来调节真正用于JVM的内存 -Xms: 指定了JVM初始启动以后初始化内存 -Xmx-Xms之差就是三个Virtual空间的总大小(年轻代、年老代、持久代) JVM垃圾回收机制 分代垃圾回收 不同的对象生命周期不同,与业务信息有关的对象生命周期较长,如Http请求中的Session对象,线程,socket连接.程序运行过程中的临时变量生命周期较短,如String对象. 把不同生命周期的对象放在不同代上,不同代上采用最合适它的垃圾回收方式进行回收。 JVM中共划分为三个代: 年轻代、年老代和持久代,其中持久代主要存放Java类的类信息,与垃圾收集要收集的Java对象关系不大,年轻代和年老代的划分是对垃圾收集影响较大的。 年轻代: 存放所有新生的对象 年老代: 在年轻代中经历了N次垃圾回收仍然存活的对象,将被放到年老代中,故都是一些生命周期较长的对象; 持久代: 用于存放静态文件,如Java类,方法等,(持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类) 新生代的垃圾收集器命名为"minorGC",l老生代的GC命名为"fullGC"或"MajorGC",其中用System.gc()强制执行的是FullGC. 31、对CMS回收了解吗? CMS(ConcurrentMark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。 对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。 在启动JVM参数加上-XX: +UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。 CMS采用的基础算法是: 标记—清除。 32、String的引用在哪里,对象在哪里 在java中引用也是对象。 (1)堆栈: 一般存储引用和基本类型变量,堆栈主要是通过堆栈指针上下移动来对内存进行分配和释放。 基本类型变量并不适应于new进行创建,因为其所占的内存较小。 (2)堆: 用于存储java对象,当程序执行new的时候,堆就会分配一个空间给这个对象,记住堆进行内存的分配和释放是比堆栈进行存储和释放内存消耗更多的时间,这就是基本类型变量要存在堆栈中了,因为基本类型变量是用的最频繁的,频繁的存储和释放内存,在消耗更多的时候,性能可想而知的 33、说说redis的数据类型(String list set lset) (1)全局key操作 (2)String(字符串) (3)Hashes类型: (map) (4)List类型 (5)set类型 (6)Sorted-Sets类型 34、为什么要使用缓存? 缓存离客户端更近,因此,从缓存请求内容比从源服务器所用时间更少,呈现速度更快,网站就显得更灵敏。 35、在实际项目中如何解决并发问题,并发和并行的区别? 大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节: 使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。 HTML静态化、图片服务器分离、数据库集群、库表散列、缓存、镜像、负载均衡、CDN加速技术。 并发与并行是两个既相似而又不相同的概念: 并发性,又称共行性,是指能处理多个同时性活动的能力;并行是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行,也亦是说并发事件之间不一定要同一时刻发生。 并发的实质是一个物理CPU(也可以多个物理CPU)在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。 并行性指两个或两个以上事件或活动在同一时刻发生。 在多道程序环境下,并行性使多个程序同一时刻
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面试 宝典 回答
![提示](https://static.bdocx.com/images/bang_tan.gif)