java面试总结

更新时间:2024-05-31 16:13:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

任职要求: java

java面试宝典

精通java,熟悉socket和多线程开发,熟练掌握JSP、Servlet JDBC等相关技术,熟悉常用的数据模式

熟悉JVM性能调优(对JVM有一定的了解)

熟悉面向对象的系统分析、设计与编程思想了解设计模式、重构以及敏捷开发的基础知识 有敏捷开发和测试自动化经验者优先 框架

熟练使用主流来源框架,如Spring、struts2、mybatis、hibeenate,熟悉ssh、ssm框架集成 (使用过一种RPC协议、缓存技术)

能够熟练使用主流框架技术,包含:Spring Boot、Spring MVC 能够熟练使用主流框架技术,包含:Spring、Axon(CQRS) 熟练使用Springmvc+FreeMarker进行开发 数据库

熟悉关系型数据库,有redis等开源的NOSQL相关知识 能够熟练使用主流存储技术,包含:MySQL、MongoDB、Couchbase、Cassandra、Redis、FastDFS 熟练掌握MySql、Oracle等数据库,sql语言,索引、过程、触发器的使用,掌握pl/sql编程 熟悉mysql使用,有一定的sql优化,维护经验;熟练掌握SQL、存储过程、触发器、视图的编写

熟悉至少一种NoSQL数据库,如MongoDB、Memcached、Redis、HBase等 至少掌握Oracle、DB2、Sql Server三种数据库中的两种 了解Oracle,Sybase,DB2等数据库系统之一 熟练使用MsSql、MySql、Oracle中的一种数据库

掌握postgreSQL数据库的使用和开发,有相关数据库经验也可

熟练掌握常用sql,使用过sybase,sqlserver、mysql等主流数据中一种或几种

熟悉数据库建模,熟练使用Oracle、DB2、mysql数据库并进行调优熟悉设计模式和UML

数据库高并发

有数据库优化和设计经验(对软件系统的高性能、高并发、高可用等有了解和实践经验) (熟悉Linux/Nginx/haproxy负载均衡、反向代理等配置) 熟悉多线程及高性能的设计与编码及性能调优 Jquery

熟练使用HTML/XML、HTML5、CSS3、jquery、javascript、AJAX 、easyui、bootstrap等前端web应用程序开发技术

(掌握Ajax技术,熟悉jquery或Prototype应用) (了解前端dhtml技术,有一定js编程经验) 熟练使用js框架(extjs mootools) 熟悉Kendo UI开发者优先考虑。 服务器

熟练使用Aapache、tomcat、nginx等常见应用服务器,具有相关的部署和配置经验

(熟悉tomcat/Jetty/Jboss等主流服务器) 熟悉Tomcat、JBoss的配置和管理 (熟悉Tomcat等应用服务器,同时对在高并发处理情况下的负载调优有相关经验者优先考虑,具有分布式系统开发等方面经验者优先) 了解Tomcat,Jboss,Weblogic,Websphere等应用服务器中的两种以上 精通Tomcat、Apache、Nginx等多种开源服务器,熟练掌握至少2种应用服务器,如WebLogic、Tomcat、Resin、JBoss、WebSphere等; 至少熟练使用weblogic、websphere、resin、tomcat、Jboss五种中间件的三种 熟练掌握和使用apache、varnish、nginx、jetty、tomcat等应用服务 熟悉Java开发,对Weblogic、WebSphere App Server及WebSphere Portal Server中的至少一种以上 精通WebSphere、WebLogic、JBoss、Tomcat其中一到两种应用服务器,并具备服务器调优能力 工具 熟练掌握svn、git 、Ecplise、Maven等工具 熟练使用nodejs 能够熟练使用Eclipse、PowerDesigner、SVN或CVS等工具 熟练使用(My)Eclipse、NetBeans等开发工具并能够使PowerDesinger、Rational Rose进行设计工作 分布式工具 三年以上互联网产品开发经验,有海量数据存储、大用户量项目经验,有dubbo、thrift、zookeeper等分布式工具使用经验 建模工具 熟悉UML建模工具,能进行分析和设计 消息队列 熟练掌握和应用 acticemq、kafka、rocketmq等消息队列 Linux

基本Linux的使用(熟练在Linux下的开发与运行环境,有长期Linux使用经验者优先考虑) 熟悉OS原理,能使用linux/unix常用基本命令 结构算法 了解常用的数据结构和算法 架构 熟悉Dubbo,Zookeeper分布式架构,mysql集群,Lucene,solr全文检索 了解分布式架构、缓存、异步、消息系统等思想 大数据 熟悉hadoop生态系统,具备Hadoop/Storm等分布式计算平台的开发、运维经验者优先 了解Hadoop、Hive、HBase、Storm等相关技术基础,并能围绕展开开发工作 检索(电商) 了解Lucene全文检索机制,能参与到全文检索的开发 阿里云 有阿里云使用经验 能够熟练使用阿里云服务,包含:MQS、 SLS、ODPS、OAS等。

熟悉工作流、Auto、MQ

熟悉IM,websocket,XMPP,MQTT等即时通讯方面技术优先考虑

能够熟练使用主流队列技术,包含:ActiveMQ、RabbitMQ、kafka、Disruptor 能够熟练使用主流RPC技术,包含:Thrift、Dubbo

能够熟练使用主流通信技术,包含:Mina、Netty、Protobuf

资深java工程师

精通C++或java;能够在 Linux 系统上进行开发部署工作

精通 TCP/UDP 等常见协议,并具有丰富的网络服务器开发经验 熟悉代理服务器、负载均衡常用网络组件

熟悉常见的服务器开发模式,并精通其中的一种或多种

熟悉缓存/消息队列等常用中间件技术,并且熟悉常用的开源框架 能够带领团队设计、开发 10w 行以上代码的核心服务器

熟悉长期运行、高并发的 C++ 或java服务器的开发、部署、测试、排错等工作 熟悉至少一种网络协议栈,能够快速理解和开发新的协议栈 中等规模软件项目的规划和管理能力

自我评价: 有较好的沟通交流能力与抗压能力 学习能力强,拥有优秀的逻辑思维能力

性格开朗、善于沟通、有良好的学习能力、有良好的团队协作能力、较强的抗压能力、有良好的编码规范意识、勇于接受挑战、善于自我激励 职业规划 项目流程

*************JavaOOP******************

☆1.谈谈你对oop的理解,oop有哪些特性?各有什么特点? Java的三大特征[中科软科技有限公司]

oop :面向对象编程,oop有继承,多态,封装,抽象

继承 : 子类可以拥有父类的属性以及方法,也可以拥有自己的属性以及方法。 多态 : 父类的方法,子类有不同的实现方式 封装 : 将现实生活中具体的事封装成一个类。

抽象 : 使用private修饰属性和方法,对外提供公有的get和set方法 2、什么是方法重载和方法重写,有什么异同?

方法重载:同一类中,同名不同参 !方法名相同,参数列表不相同(个数 顺序),和访问修饰符 返回值类型 异常无关

方法重写:子类重写父类,同名同参数 !方法名相同,参数列表相同,访问修饰符大于等于父类 返回值和父类相关(基本数据类型等于) 异常是父类的子类或子集

3、抽象类和接口有什么异同?(面试) 抽象类 接口

抽象方法 0-多个 是 属性是静态 不一定 是 用途 给类继承 给类实现 构造方法 产生子类对象初始化父类属性 无

从语法角度上,接口是一种特殊的抽象类,但从设计角度理解而言是错误的 抽象类是父类的共同特征,是\中间产品\子类才是\最终产品\是子类是\的关系,既在概念上本质是一样的

接口表示一种约束和一种能力,是\a can do\的关系.接口定义\做什么\实现类负责\怎么做\体现是功能和实现相分离的原则

4、异常有哪几种类型,怎么自定义异常? RuntimeException Error CheckedException 继承Exception或子类 定义有参构造方法

在有异常的地方,throw异常

5、什么是多态?使用多态的两个前提条件?有哪两种表现形式和应用场合? 同一事物,有不同的表现形态...父类的方法,子类有不同的实现方式 前提: 继承 重写 表现形式:重载 重写 应用场合:方法形参 方法返回类型

6、什么是内部类?内部类有哪几种?有什么优缺点? 类中定义类 成员内部类 方法内部类 静态嵌套类 匿名内部类 优点:a.减少参数传递 b.封装(隐藏内部实现方法和细节) c.减少类文件 缺点:a.增加语法的难度 b.使结构复杂化

7、什么是构造方法,有什么作用,如何调用本类和父类的构造方法? 和类同名,无返回类型

初始化父类属性 this(参数) super(参数)

☆8、final、finally、finalize有什么异同? [上海优觉]

final 最终的 修饰属性表示常量 修改方法表示不能被重写 修饰类不能被子类继承 finally 异常中总会执行,除了System.exit(0) finalize 是Object类的一个方法,在垃圾收集器调用垃圾回收的此方法,会覆盖该方法提供的回收对象的其他资源

9、类和类之间有哪几种关系?面向对象设计原则有哪些? 类和类之间的关系:继承、实现、依赖、关联、聚合、组合 设计原则:

1.依赖倒置原则(面向接口编程)

2.迪米特法则 (尽量减少类和类之间的依赖) 3.接口隔离原则(一个接口只一个规定) 4.聚合/组合原则(尽量使用聚合组合关系) 5.里氏替换原则(慎用继承)

6.开闭原则(对扩展开放 对修改关闭) 7.单一职能原则 (一个类只做一件事情)

10、String和StringBuffer、StringBuilder的区别?[中软 上海优觉] 同:都是final类 异:

①String类是不可变字符串,可以像基本数据类型一样直接赋值(直接存放常量池), StringBuffer、StringBuilder是可变字符串,只能通过new产生对象

②StringBuilder是线程不安全的,用在字符串缓冲区被单个线程使用的时候,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

11、如何区分运行时异常与检查异常,他们使用时有何区别?[中软]

RuntimeException及其所有子类都属于运行时异常,在程序中可以不用处理,直接由jvm处理,

检查异常必须在程序中处理。

12、static, abstract可以修饰什么,有什么作用?abstract可以和final共同修饰吗?

①static修饰变量、方法,在类加载的时候就会初始化,所有实例共享,可以用类名.属性、类名.方法名;

abstract修饰方法表示该方法没有具体实现,必须由其子类实现,修饰类表示该类为抽象类不能被实例化。

②他们不能共同修饰,因为abstract是代表抽象必须被实现,final代表终极的不能重写和继承。

13、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回

作用:遍历集合

方法:.hasNext() next() remove() ⑧集合排序 Collection.sort()

多线程问题:

①线程和进程的区别与联系: [久雅科技有限公司] 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。 不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间 每个线程都拥有单独的栈内存用来存储本地数据

②sleep() 、yield() 和 wait() 有什么区别?

1.wait()方法是Object的方法,sleep()是Thread的方法 2.wait()方法必须写在synchronized里面

3.wait()方法在等待的时候会释放对象锁,sleep()睡过去也抱着对象锁不放!(重要) 4.yield()让当前正在执行的线程暂停,该方法不会阻塞线程,而是将线程转入可运行状态

③java中如何编写一个线程类,并启动他?

继承Java.lang.Thread类,并重写run() 方法,调用该对象的start()方法启动线程

实现Java.lang.Runnable接口,并实现run() 方法,将该对象实例作为Thread构造的参数再调用start()方法,使用了代理模式。

④如何实现线程之间的通信?

Java提供了3个方法解决线程之间的通信问题

wait() : 表示线程一直等待,并释放对象锁,直到其它线程通知再找回对象锁 notify() : (唤醒一个同一个对象上处于等待状态的线程) 唤醒在此对象监视器上等待的单个线程。['n??t?fa?

notifyAll():唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程优先运行 唤醒在此对象监视器上等待的所有线程。[

⑤多线程的状态[电话面试]

新建状态(就绪)->可执行状态(运行)->阻塞(可能)->死亡状态

⑥什么是线程安全,如何实现线程安全? 线程安全就是说多线程访问同一代码,不会产生不确定的结果。 编写线程安全的代码是低依靠线程同步

⑦☆启动一个线程是用run()还是用start()? ①什么时候使用Thread,什么时候使用Runable

②启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。

这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

⑧如何避免死锁 1、在程序中尽量使用开放调用(方法本身没有加锁,对方法操作的内容进行加锁)

2、注意锁的顺序:尽量减少潜在锁之间的交互数量,遵守并文档化该锁顺序协议 3、尝试定时的锁,来替代使用内部锁机制

26、同步和异步有何异同,在什么情况下分别使用他们?

同步就是当一个线程运行时其他线程不能访问该线程中锁定的对象,为保障数据完整而使用的方法,

而异步可以多个线程同时使用一个对象 如果数据将在线程间共享。例如正在写的数据可能被另一个

线程读到,或 者正在读的数据可能已经被另一个线程写过了,那么这些数据 就是共享数据,必须进行同步。

当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,

就应该使用异步编程,在采用异步往往更有效率。

☆27、java的网络编程有哪两种,他们之间有什么区别? **简述Socket

TCP协议:传输控制协议,提供可靠无差错的数据传输,资源消耗较大,性能和效率较低 UDP协议:用户数据报协议,不可靠的数据传输,资源消耗小,性能和效率较高

28、描述一下JVM加载class文件的原理机制?

JVM中类的加载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

29、描述下类实例化的详细过程(顺序)?

1. 父类静态成员和静态代码块,按在代码中出现的顺序依次执行 2. 子类静态成员和静态代码块,按在代码中出现的顺序依次执行 3.父类实例成员 4.父类构造方法 5.子类实例成员 6.子类构造方法

其中1.2是在类加载的时候执行

30、请描述Object中有哪些方法及其作用?

clone() 创建并返回此对象的一个副本。 equals(Object obj) 指示其他某个对象是否与此对象“相等” finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 getClass() 返回此 Object 的运行时类。 hashCode() 返回该对象的哈希码值。 notify() 唤醒在此对象监视器上等待的单个线程。['n??t?fa?] notifyAll() 唤醒在此对象监视器上等待的所有线程。 toString() 返回该对象的字符串表示。 wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。

wait(long timeout) 在其他线程调用此对象的notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。

wait(long timeout, int nanos)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,

或者已超过指定实际时间量前,导致当前线程等待。 nanometer ['ne?n?mi:t?] n.[计量]毫微秒

☆String的方法?[德邦 中国电信理想]

a.equals():字符串是否相等(区分大小写) f.trim():去字符串左右两边的空格 g.concat():连接字符串

h.indexOf():查找字符串所在位置

i.lastIndexof():查找字符串最后一次出现的位置

j.subString(int startIndex,int endIndex):截取字符串,第一个参数从0数,第二个参数从1数 k.split(\根据什么拆\:拆分字符串

String是否可以继承?[笔试题] final类,不能修改 jvm

**32.JVM的内存结构?(高级)

方法区 堆 虚拟机栈 本地方法栈 程序计算器

jvm性能优化? 1.内存微调优化 2.锁争夺微调: 多线程 不变性 单写原则 Actor Disrupotor

3.CPU使用率微调 4.I/O 微调

Java 平台与内存管理

解释内存中的栈(stack)、堆(heap)和静态存储区的用法。

答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、“hello”和常量都是放在静态存储区中。栈空间操作最快但是也很小,通常大量的对象都是放在堆空间,整个内存包括硬盘上的虚拟内存都可以被当成堆空间来使用。

String str = new String(“hello”);

上面的语句中 str 放在栈上,用 new 创建出来的字符串对象放在堆上,而“hello”这个字面量放在静态存储区。

33. 什么时候用assert? Assert有什么作用?

断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,

那么系统会报告一个 Assertionerror。它用于调试目的

34.Math.round(11.5)等於多少? Math.round(-11.5)等於多少? ceil: 向上取整 Math.ceil(11.3)=12 Math.ceil(-11.3)=-11 floor:向下取整 Math.ceil(11.6)=11 Math.ceil(-11.6)=-12

round:四舍五入 Math.round(11.5)=12 Math.round(-11.5)=-11

☆35.说出一些常用的类,包,接口,异常,请各举5个[笔试]

类 : String , Integer , Character , Float , ArrayList, Date,calendar,java.net.URL 包 : java.util

java.lang: Java语言包,主要包含与语言、数据类型相关的类。程序运行时,编译器

自动引入该包

java.awt和javax.swing:提供了创建图形界面元素的类,通过这些类,可以控制应用

程序的外观界面

java.sql: 包含了与数据库编程相关的类/接口

java.io: Java输入/输出包,包含与输入和输出操作相关的类,提供了不同的输入/输出

设备读写的支持

java.net: Java网络包,提供与网络操作相关的类 java.text java.math

接口 : Servlet ,Iterator , List, Map , Cloneable , Serializable

异常: IndexOutputBoundsException, NullPointException,NumberFormatException, ClassNotFoundException, MethodNotFoundException,IOException

☆☆常见的异常,如何解决?(重点) ClassCastException(类型转换异常)

IllegalArgumentException(非法计算异常) IndexOutOfBoundsException(下标越界异常) NoSuchElementException(没有这样的元素异常) NullPointerException(空指针异常)

RasterFormatException, SecurityException, SystemException(系统出现的异常) 项目中常见的问题: 1>.com.mysql.jdbc.exceptions.jdbc.MySQLSyntaxErrorExcption mysql关键字冲突 2>.json死循环

36.作用域public,private,protected,以及不写时的区别

访问修饰符有哪些?每个访问修饰符的作用?修饰方法和类的修饰符?以及它们的作用[湛腾]

作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × ×

37.int和Integer的区别?[上海卫城企业征信有限公司]

Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java

为int提供的封装类。Java为每个原始类型提供了封装类

39.&和&&的区别。

&是位运算符。&&是布尔逻辑运算符

40.JDK使用的版本?JDK8的新特效?[文思海辉] JDK 7

新特性:接口的默认方法(接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法) Lambda 表达式( ->) 函数式接口 方法与构造函数引用 Lambda 作用域 访问局部变量 访问对象字段与静态变量 访问接口的默认方法 Date API(包java.time下包含了一组全新的时间日期API) Annotation 注解(支持多重注解)

☆41.静态变量和实例变量的区别? [文思海辉 平安科技] 静态变量:类名来引用

实例变量:创建对象才能引用

43.四位数的随机数?[中国电信理想]

(数据类型)(最小值+Math.random()*(最大值-最小值+1))

44.当前时间?3年前的时间

**********结构算法*********

8种排序算法:

直接插入 插入 希尔

内部排序 选择 简单选择

(只使用内存)交换 冒泡排序(快速)

归并 基数

外部排序

(内存和外层相结合)

[美教]:二分算法(不只需要会框架的人,那样还不如招个应届生) import java.util.Comparator; public class MyUtil { public static > int binarySearch(T[] x, T key) { return binarySearch(x, 0, x.length- 1, key); } // 使用循环实现的二分查找 public static int binarySearch(T[] x, T key, Comparator comp) { int low = 0; int high = x.length - 1; while (low <= high) { int mid = (low + high) >>> 1; int cmp = comp.compare(x[mid], key); if (cmp < 0) { low= mid + 1; } else if (cmp > 0) { high= mid - 1; } else { return mid; } } return -1; } // 使用递归实现的二分查找 private static> int binarySearch(T[] x, int low, int high, T key) { if(low <= high) { int mid = low + ((high -low) >> 1); if(key.compareTo(x[mid])== 0) { return mid; } else if(key.compareTo(x[mid])< 0) { return binarySearch(x,low, mid - 1, key); } else { return binarySearch(x,mid + 1, high, key); } } return -1; } }

冒泡排序: N个数字来排队,两两相比小靠前,外层循环n-1,内存循环n-i-1

For(int i=0;i

If(arr[j]>arr[j+1]){ Int remp; Temp=arr[j];

}else{ Arr[j]=arr[j+1]; Arr[j+1]=temp; } } }

*********框架-hibernate*********************

☆1.Hibernate的理解 工作原理及为什么要用?

理解:hibernate是一个开源的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装, 使得Java程序员可以随心所欲的使用对象编程思想来操纵数据库 原理:

1.读取并解析配置文件

2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion

4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session

8.关闭SesstionFactory

优点: 1.简化了数据访问层的代码 2.程序更加面向对象

3.提高了开发效率 4.方便移植

2.请描述下hibernate对象的三种状态是什么,有什么不同? 瞬时状态transient: 对象只存在于内存中,缓存和数据库中都没有id 持久化状态persistent: 内存中有id,缓存中有id,数据库也有id 游离状态detached: 内存中有id,缓存中没有id,数据库有id

3.谈谈你对Hibernate和MyBatis的理解及相对JDBC有什么优缺点? 相同点:都是通过sessionFactorybulider由xml配置文件生成sessionfactory,然后由sessionfactory生成session,然后开启执行事务和sql, 三者生命周期都是差不多的 mybatis的优势:可以进行更加细致的sql优化,减少查询的字段 hibernate优势:dao层比mybatis简单,数据库移植性比mybatis强,二级缓存机制比mybatis好,对象的缓存和维护比mybatis好 相对于jdbc开发效率高,运行速度快,但内存消耗大

Hibernate和JDBC的区别? 同:

hibernate是对JDBC的轻量级的封装 java的数据库操作中间体 线程不安全,都需要及时关闭 显示的事务处理 异:SQL语言 SQL HQL

操作对象 数据 持久化对象 数据状态 瞬时 可持久化 开发效率 低 高

☆4.请描述下什么是hibernate 1+N问题及如何解决? 查询多的一方默认会把一的一方查询出来(Eager),而且是发N条sql的方式查询 1、将多的一方设FetchType.LAZY,用到一的一方的时候才发sql语句,只是延迟而已 2、使用hql的迫切左外联接查询(left join fetch),只发一条|xml可以设置fetch=\ 3、使用Criteria查询,即使用hql的左外联接查询,只发一条 4、@BatchSize(size=?) 取一的一方的时候发1+N/?条sql | xml中的class标签中设置batch-size=\只有fetch=\有用

5.请写出常见的几种主键生成策略,并解释其用途? 1:assigned

----表示在新增数据时由应用程序指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。 2:increment

----表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.

适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。

3:identity

----主要适用于sqlserver数据库的自动增长列的表。 4:native

----表示根据不同的数据库采用不同的主键生成策略。

6.请指出session的get和load方法、save和saveOrUpdate方法、clear和flush方法的区别? get():先检查缓存(session),没有该对象立马发sql,如果对象不存在返回null,使用的时候则NullPointerException

load():返回代理对象($$,stu.getClass()),需要用到的时候先检查缓存,没有才发sql,如果对象不存在直接异常(LazyInitializationException),session关闭后再用到也将异常 no session

get()较常用,load()不常用

save():不管怎样都保存,即使有和数据库相同的id

saveOrUpdate():对象存在id则update,如果数据库有id则成功update没有对应的id则异常,对象没有id则save

clear():强制清空缓存,让对象变成瞬时状态或者游离状态

flush():默认强制缓存和数据库同步一下,对象变为持久状态,但没有提交还可以回滚session没有关闭

☆6、hiberante中的对象关联关系有哪几种?MyBatis怎么配置关联关系? 1、单向一对一关联映射

2、单向多对一关联映射(many-to-one) 3、单向一对多关联映射(one-to-many) 4、单向多对多映射(many-to-many) 5、双向一对一关联映射 6、双向一对多关联映射 7、双向多对多关联映射

mybatis:可以使用嵌入式,引入式,继承式

一对多的时候在一的一方设置collection,多的一方设置association 多对一的时候在多的一方设置association,一的一方设置collection 多对多的时候,使用中间表实体映射,拆成一对多和多对一

7、hibernate联接查询有哪几种,迫切和非迫切有什么区别? 1.默认查询的情况: 2.迫切左外连接 3.左外连接 4.迫切内连接

5.内连接(包含隐式内连接) 6.右外连接

迫切联接和非迫切联接返回类型不同,但都是持久化状态,无论是否懒加载都会加载关联对象!

8、请描述下list()方法和iterate()方法有什么区别?

iterate:先取所有需要的id,根据id查询对应的记录,第二次iterate先看缓存有木有,木有才发sql

list:直接取所有记录,即使同一事务中第二次list还会发sql去数据库取,没有利用一级缓存

☆9、请描述下hibernate的缓存机制及事务隔离机制?[文思海辉电话面试 中信] 缓存机制:分类:

1.一级缓存:session缓存,事务范围的缓存

☆2.二级缓存:sessionFactory的缓存,事务隔离级别的缓存(经常被访问、改动不大、数量有限、不是很重要,允许出现偶尔并发的数据)

3.查询缓存(应用程序运行时经常使用的查询语句,很少对查询的数据进行增、删、改操作)

缓存算法:LRU最近很少使用 LFU最少被使用 FIFO先进先出

作用:降低应用程序对数据库的访问频率,提高应用程序的运行效率

事务隔离机制:当事务并发访问有可能造成:脏读、不可重复读、幻读,会严重影响数据库和用户体验,通过设置事务隔离级别,

或者利用Hibernate提供的两种锁机制,悲观锁和乐观锁来解决

10、谈谈你对xml配置文件中的fetch和inverse的理解? fetch是抓取策略:

select是在查询的时候先查询出一个实体,然后在根据一个查询出多个实体,产生1+N现象

join是在查询的时候使用外连接进行查询

subselect发送一条select语句抓取在前面查询到的所有实体对象的关联集合 实现懒加载设置lazy=\后,一定得设置fetch属性等于select

inverse:标记由哪一方来维护关联关系,双向关联中,默认值为false,如果设置为true,则表示由对方维护两者之间的关联关系

11、Hibernate是如何延迟加载[华榭科技有限公司]

***************Mybatis********

☆1.Mybatis理解[逑美科技有限公司]

mybatis是一个可以自定义SQL 存储过程 和高级映射的轻量级的持久层框架,将面向接口编程的思想贯穿整个系统应用

2.mybatis框架原理 1.加载配置并初始化 2.接受调用请求 3.处理操作要求 4.返回处理结果

优缺点:

优点:简单 实用 缺点:不成熟

☆3.性能优化:解决1+N问题:用到哪个对象才发对应的sql 1、使用懒加载

配置:

只要用到对象,不管是否用到关联对象都发1+N,只有什么对象都不用才发一条sql 2、使用联接查询 left join ...

☆4.缓存:

一级缓存是默认开启不能关闭

mybatis中还默认开启了全局缓存(二级缓存)

缓存开启后session没有关闭执行同样的sql语句会使用缓存,如果参数改变,缓存就会失效。

实现方式:1.内置 -cache 机制

2.第三方-ehcache, oscache

☆5.对比-Mybatis和hibernate的区别和应用场景? hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。

对sql语句进行优化、修改比较困难的。 应用场景: 适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。

mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,

mybatis 也可以实现映射(输入映射、输出映射)。 应用场景: 适用与需求变化较多的项目,比如:互联网项目

☆☆Hibernate和Mybatis的区别

同: Hibernate与MyBatis都可以通过SessionFactoryBuilder由xml配置文件生成SessionFactory,然后由SessionFactory生成Session, 最后由Session来开启事务和SQL语句 都支持JDBC和事务处理

异:hibernate是全自动 Mybatis是半自动 hibernate数据库移植性大于Mybatis Mybatis更注重于SQL

hibernate拥有完整的日志系统,Mybatis则欠缺些

☆6.Mybatis中#跟$的区别?

#把传入的数据当作字符串 $传入的数据直接生成在sql里 #方式能够很大程度防止sql注入 $无法防止sql注入

7.ibatis:

开源的 轻量级的 基于java持久层的 半自动式开发框架 优点:

1、sql可以写在XML中 结构清晰 配置灵活 2、增强了后期维护性

3、执行sql后 返回的结果集自动封装 缺点:

1、只使用于小项目

2、sql写在XML中 调试不方面 3、开源的东西少 文档资料少

8.ibatis 跟mybatis的区别:

1、mybatis实现了接口绑定,使用更加方便 2、mybatis改进了对象关系映射,效率更高

3、MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。 4.mybatis 增加的注解版

Ibatis跟Hibernate比较:

如果系统二次开发 Ibatis比Hibernate灵活性高 Ibatis简单易学 Hibernate相对复杂 在不同的数据库移植中 hibernate比较好

Ibatis可以进行细粒度优化 而Hibernate根据映射关系全部优化

Ibatis跟jdbc 比较:

jdbc它是一个执行Sql语句的JAVA API 是一套访问数据库标准 提供了一组接口 Ibatis也是一套数据库框架 但是把sql语句抽离了出来 底层也是JDBC

9.MyBatis使用的版本?[上海普元] MyBatis 3.3

☆10.MyBatis的标签?[德邦] 1>.insert select update delete 2>.关联关系:resultMap id result association

.映射配置:cache property 4>.

5>.调用存储过程:parameterMap

****************JPA**************************

Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系. 是 JCP 组织发布的 Java EE 标准之一.,任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问 API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行 优点:标准化 对容器级特性的支持 简单易用,集成方便 查询能力 高级特性(支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系)

与Hibernate相比,JPA是不是更好 JPA是规范,而Hibernate是实现

****************SpringData**************************

为了简化构建于Spring框架的应用的数据访问计数,包括非关系数据库 Map-Reduce框架 云数据服务等等,另外包括对关系数据库的访问支持

******框架-Struts2********

MVC的理解?[上海卫城企业征信有限公司]

1.Struts2的.理解

Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点

Struts 2拥有更加广阔的前景,自身功能强大,还对其他框架下开发的程序提供很好的兼容性

☆☆struts2的优缺点(上海优驻) 优点:组件模块化、灵活、可重用,简化了基于MVC的web应用程序的开发 可对象导航

支持国际化和本地化

☆1、谈谈你对Spring的理解?[上海极点信息科技有限公司] spring是一个设计层面,轻量级的控制反转(IOC)和切面(AOP)非侵入式的开源框架, 他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用 ☆2、请谈谈你对Spring的IOC和DI的理解?[极点科技] 控制反转IOC(Inversion of control):对象创建的权利反转到Spring容器(ApplicationContext.xml)而程序本身不在维护了 依赖注入DI(Dependency injection) :实际上DI和IOC是同一个概念,对象的创建由spring容器注入

3、Spring提供了几种注入方式?bean的生命周期主要有哪几种,用于什么情况? ①注入方式:

set : 针对性强 构造器 : 赋值方便

接口 : 降低类之间的耦合性,提高代码可读性,与操作性 注解 : 使用方便,想赋值就赋值。控制性强 ②bean的生存范围: scope 属性 (文档) 默认singleton(默认单例,action不能为单例):bean对象只会实例化一次 prototype(原型 多例):多个对象实例 request:一次HTTP请求,对应一个实例,仅在基于web的SpringApplicationContext情形下有效 session:session中对应一个实例.web 下有效 global session : 在一个全局的HttpSession中,一个bean定义对应一个实例

☆4、请解释下Spring的AOP是什么,有什么作用? AOP(Aspect Oriented Programming)面向切面编程 前置型通知 : 指定方法执行之前先执行通知方法。 后置型通知 : 指定方法执行之后再执行通知方法。

环绕行通知 : 执行方法执行之前执行一次,当指定方法执行之后,再返回坏绕行通知方法。

最终型 : 不管是否抛出异常都会执行通知。

异常型通知 : 只有当目标方法抛出异常之后才会执行通知

5、Spring中使用了哪些经典设计模式,举例说明? 1)工厂方法(Factory Method):Spring中的FactoryBean,让子类决定实例化哪一个类 2)单例(Singleton):提供了全局的访问点BeanFactory 3)适配器(Adapter):将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 举例:实现接口,web.servlet.mvc.SimpleControllerHandlerAdapter 4)代理(Proxy):为其他对象提供一种代理以控制对这个对象的访问 举例:aop 5)模板方法Template Method:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步

骤 举例:JdbcTemplate和DaoSupport

☆6、请描述下Spring是如何管理事务的? 声明式 : 在ApplicationContext.xml文件中配置事务 配置简单,使用方便,可控性强,细粒度高。由于它是将事务放在 xml文件里的,所以需要解析 编程式事务 : 在ApplicationContext.xml文件中配置事务 侵入性强,可控性差,一经编译不可被改变。但由于它是将事务代码写在DAO层代码里的,性能方面更高 注解 : 在持久层配置注解 配置简单,使用方便。缺点是一编译不可被改变。

7、请描述下Spring整合struts2的基本步骤? 导包 配置struts.objectFactory属性值:

8、请描述下Spring如何解决懒加载的方式? lazy-init(也分局部和全局):懒加载 true:延迟初始化,用到对象时,才初始化对象

9、请描述下Springmvc有哪些核心组件? 核心控制器:DispatcherServlet 控制器: Controller 请求分发器:Handler Mapping 视图解析器:ViewResolver & View 拦截器: Interceptors 本地化解析器 LocalResolver 验证器 Validate

☆10.Spring的安全(线程安全?)问题? 线程不安全的

struts1的action是单例的,所以存在线程安全问题(strusts2是多例的,所以也存在线程安全问题)

springmvc默认的注入是单例,所以也存在线程安全问题 原因:单例 解决办法:

struts1如果被spring管理,设置成scope为protype 禁用可变动的成员变量,使用局部变量

☆11.请描述下Springmvc的工作流程?

比较:☆struts和springmvc工作流程 1.DispatcherServlet接收请求

2.DispatcherServlet查询对应的处理器映射项(HandlerMapping),,找到处理请求的

Controller,负责对请求进行真正的处理工作。

3.DispatcherServlet请求提交到目标Controller 4..Controller进行业务逻辑处理后,会返回一个ModelAndView 5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象 6.视图对象负责渲染返回给客户端。

1) 客户端发送请求(*.action) 2) FilterDispatcher拦截请求

3) 调用ActionMapper,查找有没有对应的action

4) 找到对应的action,创建Action的代理类ActionProxy,负责action的执行

5) ActionProxy通过ConfigurationManager对象获得当前访问的action的相关配置信息. 6) ActionProxy根据获得的action的配置信息,创建ActionInvocation对象. 7) ActionInvocation对象负责执行invoke()方法,调用action的方法

8) 处理完action后,返回Result对象,拦截器根据处理结果分发到对应的视图页面显示

☆12.Struts与SpringMVC的区别

区别 struts SpringMVC 核心控制器 过滤器 Dispather Servler

Scope 基于类开发,传递参数是 基于方法开发,传递参数是通

通过类的属性,只能设计为多例 过方法形参,可以设计为单例

返回 String Model and View 设计思想 oop 在servlet上扩展 性能 spring会稍微比struts快

**********框架整合*****

★★★★★SSH[上海宜采软件科技有限公司] 一、Struts + Spring + Hibernate Struts:表现层 1、Struts2采用Filter 进行配置 2、配置提交方式、通配符 3、

Spring:业务层 1、AOP 2、CORE 3、applicationContext.xml常用配置(dataSource数据源配置,sessionFactory工厂,TrasactionManager事务配置)

Hibernate:持久层 1、SQL和JDBC API 2、基于POJO,便于测试 二、Struts整合Spring 1、使用Spring 的 ActionSupport 类整合 Struts 2、使用Spring 的 DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor 3、将Struts Action 管理委托给 Spring 框架 三、Spring 整合 Hibernate 1、在 Spring 框架中,像 JDBC DataSource 或 Hibernate SessoionFactory 这样的资源,在应用程序上下文中可以用 bean 实现; 1、配置数据源,有三种方式的数据源 方式一:Spring内置实DriverManagerDataSource 方式二:DBCP提供的BasicDataSource 方式三:JNDI数据源(mysql5,tomcat6为例) 2、配置sessionFactory 3、配置事务 四、准备

1. 开发环境:MyEclipse 8.0 GA(Eclipse3.5.1,JRE1.6.0.10和MyEclipse Enterprise WorkBench8.0) 2. 运行环境:JDK 6 Update 20(JRE1.6.0.13) 3. 开发框架:Struts 2.1.8.1,Spring 2.5,Hibernate 3.2 4. 应用服务器:tomcat 6.0.26 5. 数据库服务器:SQL Server 五、理论 五、理论 简单来说就是使用Spring的IoC在Spring的容器中初始化好注入 bean、 sessionFactory、action、manager、dao等对象,这样对象就可以直接使用。 Hibernate负责数据库的持久化操作。 Struts负责表现层数据的传递,页面的跳转等。

SSH整合[重点--上海科江电子 上海触特信息科技] pojo:@Entity

@Id @GeneratedValue @Column dao:

BaseDao:@Repository @Resource

private SessionFactory sessionFactory; public Session getSession(){ return this.sessionFactory.getCurrentSession(); }

Spring的配置文件[百联]:

扫描包(排除控制层对象) 引入jDBC的属性文件 配置DataSource 配置SessionFactory

声明式事务管理(通知 切面) SpringMVC的配置文件: 扫描包 注解

放过静态资源 视图解析器 拦截器设置

Spring配置文件如何写? Session工厂 SSM与SSH区别优缺点[中科软科技有限公司] ****数据库**********

☆1.Sql优化问题?[重点--德邦 平安科技] 根据主键查询

大数据表删除,用truncate table代替delete 合理使用索引

查询时,使用列名(select *) 尽量少嵌套子查询

避免在 where 条件中进行函数计算 减少对表的查询:

尽量多使用 COMMIT:

使用 DECODE 函数来减少处理时间 删除重复记录 sql 语句用大写的 用 IN 来替换 OR 事务

使用外键;

MySQL优化 查询缓存优化查询 设置主键 避免 SELECT * 不要 ORDER BY RAND() 为搜索字段建索引 越小的列会越快 选择正确的存储引擎(MyISAM 和 InnoDB)

☆2.分页[上海触特信息科技] MySQL:select * 表名 limit pageIndex,(pageIndex-1)*pageSize Oracle: SELECT * FROM

(SELECT ROWNUM rn,t.* FROM

(SELECT ename,sal FROM emp ORDER BY sal) t WHERE ROWNUM<= pageIndex*pageSize) WHERE rn>(pageIndex-1)*pageSize Sqlserver:

--排序查询所有结果--限制查询的上限 --限制查询的下限 select top pageSize(pageIndex-1) id from test order by id

取前10条

☆3.说出数据连接池的工作机制是什么? 连接池的实现是以空间换时间

优点:效率高,安全性稳定性好,节约资源

工作机制:

创建:J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。 调用:客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。 如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。

释放:当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

实现方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正关连接,而是把它代理的Connection对象还回到连接池中。

4.外连接与内连接的区别?[平安科技]

内连接(自然连接):只有两个表相匹配的行才能在结果集中出现 外连接

左外(以左边的表为主) 右外(以右边的表为主)

全外连接(左右两边都不受限制)

5.外连接中的左外连接、右外连接和全外连接有什么特点? 左外连接:A left [outer] join B on 等值条件 右外连接:A right [outer] join B on 等值条件 完全外连接:A full [outer] join B on 等值条件

6.表级锁,行级锁和页面锁各有什么特点?

表级锁 , 开销小,加琐快。不会出现死锁;锁粒度大,发出琐冲突的概率最高,并发度最低。

行级锁 , 开锁大,加琐慢;会出现死琐;琐力度最小,发生琐冲突概率最低,并发度也最高。

页面锁 , 锁力度界于表锁和行锁之间,并发度一般。

7.如何操作一个游标读取一个表? 写出代码? ☆☆☆游标

用过游标吗?在存储过程中用过游标吗? //创建存储过程 create or replace procedure showstudent(v_cname in varchar) as s_tmp number; s_total number; //声明游标 cursor cur_grade is select * from sc where c# in (select c# from c where cname = v_cname); begin //for循环游标(自动打开,自动提取,自动关闭) for cur_rec in cur_grade loop s_tmp := cur_rec.grade; s_total := nvl(s_total, 0) + nvl(s_tmp, 0); end loop; dbms_output.put_line(v_cname || '的总分是: ' || s_total); end; 8.什么是存储函数? 如何声明存储函数?存储函数有什么限制?

☆9. 什么是存储过程? 如何创建存储过程?[平安科技] 概念

a.类似于C#/Java中的方法,是对代码的封装,方便用户调用 b.过程可以无参,也可以接收1个或多个参数 c.过程可以通过return返回1个int类型数据 优点

a模块化,按功能进行封装 b.重用性好,易于维护

c.执行效率高,编译好之后存储在数据库中 d.减少网络流量的使用 e.安全性高 创建

CREATE OR REPLACE PROCEDURE 过程名 AS

声明部分 BEGIN

逻辑处理部分 END; 调用 BEGIN

过程名 END;

10.存储过程和函数的区别

存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程

函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表

☆☆☆☆11.事务是什么?[重点]

1、概念:同生共死

1)事务是最小的逻辑单元

2)该单元包含1个或者1组数据库操作

3)这些数据库操作要么同时成功,要么同时失败

2、分类: 1)隐式事务

2)自动提交事务:针对单个数据库操作

SQLServer将单个的insert/delete/update操作当作1个独立的事务,自动提交 3)显式事务:针对多个数据库操作 a- 开始事务 begin transaction b- 提交事务 commit transaction c- 回滚事务 rollback transaction

注意:使用@@error累加每个操作的错误号,作为判断提交或回滚依据

3、特点:ACID

A- 原子性,事务是最小的、不可分割的逻辑单元 C- 一致性,事务前后的数据应保持一致 I- 隔离性,事务之间是相互独立的

D- 永久性,事务提交后对数据库的影响是永久的,一旦提交则无法回滚

事务的作用:保证了数据的完整性

12.Oracle

①Oracle是甲骨文公司的一款关系数据库管理系统。 ②Oracle主要特点:

1.)完整的数据管理功能: 1.数据的大量性, 2.数据保存的持久性, 3.数据的共享性, 4.数据的可靠性。 2.)分布式处理功能。

3.)用ORACLE能轻松的实现数据仓库的操作。

③Oracle的优点:可用性强,可扩展性强,数据安全性强,稳定性强。 13.MySQL

1.MySql是一个开放源码的小型关联式数据库管理系统。 2.MySql的系统特性:

1.为多种编程语言提供了API。

2.支持多线程,充分利用CPU资源。 3.提供多语言的支持。

4.优化的SQL查询算法,提高查询的速度。

5.提供TCP/IP、ODBC和JDBC等多种数据库连接途径

14.表和视图的区别?[平安]

本文来源:https://www.bwwdw.com/article/0u06.html

Top