java常见面试题整理

xiao_lucky 贡献于2018-09-17

作者 tarena  创建于2014-10-29 12:08:00   修改者tarena  修改于2017-07-14 07:06:35字数17374

文档摘要:所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。
关键词:

面向对象的特征有哪些方面? 封装,继承,多态 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 继承是指子类获得父类的属性和方法。如狗是动物的一种,也可以说够继承了动物的特性,或者说狗是动物的子类。 多态是指一个方法只能有一个名称,但可以有许多形态,也就是程序中可以定义多个同名的方法,用"一个接口,多个方法"来描述.可以通过方法的参数和类型引用 五大原则:单一职责原则SRP 开放封闭原则OCP 替换原则LSP 依赖原则DIP 接口分离原则ISP 成员变量和局部变量的区别 * A:在类中的位置不同 * 成员变量:在类中方法外 * 局部变量:在方法定义中或者方法声明上 * B:在内存中的位置不同 * 成员变量:在堆内存(成员变量属于对象,对象进堆内存) * 局部变量:在栈内存(局部变量属于方法,方法进栈内存) * C:生命周期不同 * 成员变量:随着对象的创建而存在,随着对象的消失而消失 * 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 * D:初始化值不同 * 成员变量:有默认初始化值 * 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。 静态变量和成员变量的区别 * 静态变量也叫类变量 成员变量也叫对象变量 * A:所属不同 * 静态变量属于类,所以也称为为类变量 * 成员变量属于对象,所以也称为实例变量(对象变量) * B:内存中位置不同 * 静态变量存储于方法区的静态区 * 成员变量存储于堆内存 * C:内存出现时间不同 * 静态变量随着类的加载而加载,随着类的消失而消失 * 成员变量随着对象的创建而存在,随着对象的消失而消失 * D:调用不同 * 静态变量可以通过类名调用,也可以通过对象调用 * 成员变量只能通过对象名调用 this和super的区别和应用 * A:this和super都代表什么 * this:代表当前对象的引用,谁来调用我,我就代表谁 * super:代表当前对象父类的引用 * B:this和super的使用区别 * a:调用成员变量 * this.成员变量 调用本类的成员变量,也可以调用父类的成员变量 * super.成员变量 调用父类的成员变量 * b:调用构造方法 * this(...) 调用本类的构造方法 * super(...) 调用父类的构造方法 * c:调用成员方法 * this.成员方法 调用本类的成员方法,也可以调用父类的方法 * super.成员方法 调用父类的成员方法 排序都有哪几种方法?请列举 排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序) 快速排序的伪代码。 String, StringBuffer StringBuilder的区别。 String的长度是不可变的; StringBuffer的长度是可变的,如果你对字符串中的内容经常进行操作,特 别是内容要修改时,那么使用StringBuffer, 如果最后需要String,那么使用 StringBuffer的toString()方法;线程安全; StringBuilder是从 JDK 5 开始,为StringBuffer该类补充了一个单个线程 使用的等价类;通常应该优先使用 StringBuilder 类,因为它支持所有相同的 操作,但由于它不执行同步,所以速度更快。 Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值的类 型? 答:方法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同表现。重 写 Overriding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个 类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参 数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用 子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定 义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方 法的重载(Overloading)。Overloaded 的方法是可以改变返回值的类型。 final, finally的区别? 答:final:修饰符(关键字);如果一个类被声明为 final,意味着它不能再 派生出新的子类,不能作为父类被继承,因此一个类不能既被声明为 abstract 的,又被声明为 final 的;将变量或方法声明为 final,可以保证它们在使用中 不被改变;被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只 能读取,不可修改;被声明为 final 的方法也同样只能使用,不能重载。 finally:再异常处理时提供 finally 块来执行任何清除操作;如果抛出一 个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如 果有的话)。 常见的几个运行异常。 java.lang.nullpointerexception(空指针异常) java.lang.classnotfoundexception(指定的类不存在) java.lang.arithmeticexception(数学运算异常) java.lang.arrayindexoutofboundsexception(数组下标越界异常) IOException(输入输出异常) 数组操作的两个常见小问题越界和空指针 * A:案例演示 * a:ArrayIndexOutOfBoundsException:数组索引越界异常 * 原因:你访问了不存在的索引。 * b:NullPointerException:空指针异常 * 原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。 * int[] arr = {1,2,3}; * arr = null; * System.out.println(arr[0]); JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗? 答:Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。 用try来指定一块预防所有"异常"的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的"异常"的类型。 throw语句用来明确地抛出一个"异常"。 throws用来标明一个成员函数可能抛出的各种"异常"。 Finally为确保一段代码不管发生什么"异常"都被执行一段代码。 可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,"异常"的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种"异常"进行处理,堆栈就会展开,直到遇到有处理这种"异常"的try语句。 服务器收到用户提交的表单数据,到底是调用Servlet的doGet()还是doPost()方法? 答:HTML的
元素有一个method属性,用来指定提交表单的方式,其值可以是get或post。我们自定义的Servlet一般情况下会重写doGet()或doPost()两个方法之一或全部,如果是GET请求就调用doGet()方法,如果是POST请求就调用doPost()方法,那为什么为什么这样呢?我们自定义的Servlet通常继承自HttpServlet,HttpServlet继承自GenericServlet并重写了其中的service()方法,这个方法是Servlet接口中定义的。HttpServlet重写的service()方法会先获取用户请求的方法,然后根据请求方法调用doGet()、doPost()、doPut()、doDelete()等方法,如果在自定义Servlet中重写了这些方法,那么显然会调用重写过的(自定义的)方法,这显然是对模板方法模式的应用(如果不理解,请参考阎宏博士的《Java与模式》一书的第37章)。当然,自定义Servlet中也可以直接重写service()方法,那么不管是哪种方式的请求,都可以通过自己的代码进行处理,这对于不区分请求方法的场景比较合适。 抽象类和接口的区别? 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。 接口可以多继承,抽象类不行 接口定义方法,不能实现,而抽象类可以实现部分方法。 接口中基本数据类型为static 而抽类象不是的。 内存泄露和内存溢出? 内存泄露:是指应用程序在申请内存后,无法释放已经申请的内存空间,一次内存泄露危害可以忽略,但如果任其发展会导致内存溢出。 如:读取文件后,流要进行及时关闭以及对数据库连接的释放。 内存溢出:是指应用程序在申请内存时,没有最后的内存空间,供其使用。 如:我们在项目中对于大批量数据导入,采用分段批量提交的方式。 什么是线程同步? 1、线程同步的目的是为了保护多个线程反问一个资源时对资源的破坏。 2、线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对象的线程就无法再访问该对象的其他非同步方法。 3、对于静态同步方法,锁是针对这个类的,锁对象是该类的Class对象。静态和非静态方法的锁互不干预。一个线程获得锁,当在一个同步方法中访问另外对象上的同步方法时,会获取这两个对象锁。 4、对于同步,要时刻清醒在哪个对象上同步,这是关键。 5、编写线程安全的类,需要时刻注意对多个线程竞争访问资源的逻辑和安全做出正确的判断,对“原子”操作做出分析,并保证原子操作期间别的线程无法访问竞争资源。 6、当多个线程等待一个对象锁时,没有获取到锁的线程将发生阻塞。 7、死锁是线程间相互等待锁锁造成的,在实际中发生的概率非常的小。真让你写个死锁程序,不一定好使,呵呵。但是,一旦程序发生死锁,程序将死掉。 对多线程的理解? 同一件事,不同的人在做就是多线程。 食堂打饭,一个人一个人打就是单线程,开N个窗口N个人同时打就是多线程 线程的基本概念、线程的基本状态以及状态之间的关系: 线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。Java中的线程有四种状态分别是:运行、就绪、挂起、结束。 有那些集合? List特点:元素有放入顺序,元素可重复 Map特点:元素按键值对存储,无放入顺序 Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的) List接口有三个实现类:LinkedList,ArrayList,Vector LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存1668bC0m,香港马会开奖结果的同时还存储下一个元素的1668bC0m,香港马会开奖结果。链表增删快,查找慢 ArrayList和Vector的区别:ArrayList是非线程安全的,效率高;Vector是基于线程安全的,效率低 Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet SortedSet接口有一个实现类:TreeSet(底层由平衡二叉树实现) Query接口有一个实现类:LinkList Map接口有三个实现类:HashMap,HashTable,LinkeHashMap HashMap非线程安全,高效,支持null;HashTable线程安全,低效,不支持null SortedMap有一个实现类:TreeMap 其实最主要的是,list是用来处理序列的,而set是用来处理集的。Map是存储的是键值对 文件读写的基本类: File Reader 类和FileWriter类分别继承自Reader类和Writer类。FileReader类用于读取文件,File Writer类用于将数据写入文件,这两各类在使用前,都必须要调用其构造方法创建相应的对象,然后调用相应的read()或 write()方法。 触发器: 触发器是在对表进行插入、更新或删除操作时自动执行的存储过程•触发器通常用于强制业务规则•触发器可以确保数据的完整性和一致性 事务: 是用户定义的一个操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位(构成单一逻辑工作单元的操作集合)如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。 如果事务遇到错误且必须取消或回滚,则所有数据更改均被清除 •锁 : 是在多用户环境中对数据访问的限制封锁就是事务 T 在对某个数据对象(如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务 T 就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。(锁蕴含的基本概念是用户需要对表的排它访问)•从程序员的角度看:分为乐观锁和悲观锁。乐观锁:完全依靠数据库来管理锁的工作。悲观锁:程序员自己管理数据或对象上的锁处理。 子查询: 一个 SELECT 语句嵌套在另一个 SELECT 语句中。 索引: 是一个数据库对象,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单,然后根据指定的排序次序排列这些指针 —优点提高查询执行的速度。 强制实施数据的唯一性。 提高表之间联接的速度。 缺点 存储索引要占用磁盘空间。数据修改需要更长的时间,因为索引也要更新。 •视图•: 是一种虚拟表,通常是作为来自一个或多个表 的行或列的子集创建的。•视图本质上讲,就是保存在数据库中的select查询•视图并不是数据库中存储的数据值的集合。•对最终用户的好处– 结果更容易理解– 获得数据更容易 •对开发人员的好处– 限制数据检索更容易– 维护应用程序更方便 存储过程: 使用一个名称存储的预编译T-SQL语句和流程控制语句的集合•由数据库开发人员或数据库管理员编写 •用来执行管理任务或应用复杂的业务规则 优点•执行速度更快•首次运行时,进行优化和编译得到执行计划并将该计划存储在系统表中,以后直接运行。•实现多个程序共享应用程序逻辑•组件式编程•能够屏蔽数据库的结构,实现更高的安全性 •减少网络流通量 子查询 select ename,deptno,sal from emp where deptno=(select deptno from dept where loc='NEW YORK'); 右连接 SELECT ename , dname FROM Emp RIGHT JOIN Dept ON Emp.Deptno = Dept.Deptno 三表关联查询 SELECT 表1.ID, 表2.STUDENTNAME,表3.CLASSNAME FROM 表1 LEFT JOIN 表2 ON 表1.STUDENTID = 表2.STUDENTID LEFT JOIN 表3 ON 表1.CLASSID= 表3.CLASSID Where “相同条件” 内链接查询如何使用 内链接(inner join on) 结果集是返回两个表中符合条件的数据,而舍弃不符合条件的语句 select * from table1 inner join table2 on table1_id=table2_id 后面可以跟条件 说出数据连接池的工作机制是什么? 答:J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的 池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其 表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连 接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表 记为空闲,其他调用就可以使用这个连接。 Servlet生命周期。 servlet通过调用init () 方法进行初始化。servlet调用service()方法来处理客户端的请求。该servlet通过调用destroy()方法终止(结束)。最后,servlet是由垃圾收集器的JVM的垃圾收集。 描述一下JVM加载class文件的原理机制? JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。 GC是什么? 为什么要有GC?  GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。 jsp 有哪些内置对象?作用分别是什么? 答:JSP 共有以下 9 种基本内置组件(可与 ASP 的 6 种内部组件相对应): request:用户端请求,此请求会包含来自 GET/POST 请求的参数; response:网页传回用户端的回应; pageContext:网页的属性是在这里管理; session:与请求有关的会话期; application:servlet 正在执行的内容; out:用来传送回应的输出; config:servlet 的构架部件; page:JSP 网页本身; exception:针对错误网页,未捕捉的例外。 JSP的内置对象及方法: request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法,response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等). out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。 pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。 session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息 applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息 config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。 page表示从该页面产生的一个servlet实例。 Cookie和session的作用? Cookie是保存在浏览器客户端的信息,也就是保存在访客的机器里的变量,一般随着HTTP头发送到客户端。在cookie生效之后及失效之前,客户每次发出页面请求的时候,都会把cookie一块儿发送到服务器,只要我们针对它进行处理,就可以改变它的值。 Session中文名字叫做“会话”,其本来的含义是指有始有终的一系列动作/消息,比如用户在浏览某个网站时从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。 Cookie和Session的区别以及作用范围 ØCookie数据存储在浏览器上,session数据放在服务器上。 ØCookie不是很安全,别人可以分析存放在本地的cookie进行cookie欺骗,考虑到安全应用,应当使用session ØSession会在一定时间内保存在服务器上。当访问增多,会比较占用服务器资源,考虑到提高服务器性能,应当使用cookie Ø单个cookie保存的数据不能超过4k,很多浏览器cookie有数量限制。 Ø将登陆信息等重要信息存放为session;其他信息如果需要保留,可以放在cookie中。 xml有哪些解析技术?区别是什么: 答:有DOM,SAX,STAX等 DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 你在项目中用到了xml技术的哪些方面?如何实现的: 答:用到了数据存贮,信息配置两方面。在做数据交换平台时,将不能数据源的数据组装成XML文件,然后将XML文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同XML文件中还原相关信息进行处理。在做软件配置时,利用XML可以很方便的进行,软件的各种配置参数都存贮在XML文件中。 Spring中的IOC和AOP是什么含义,它们在项目中起到什么作用,并举例说明? IOC:控制反转,是一种设计模式。 一层含义是控制权的转移,由传统的在程序中控制依赖转移到由容器来控制; 第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的关系。他们的关系只在使用的时候才建立。 AOP:面向切面,是一种编程思想,OOP的延续,将系统中非核心的任务提取出来,进行单独处理。 Spring的AOP和IOC在项目中都是为了解决系统代码耦合度过高的问题。使代码重用度高、易于维护。比如事物、日志、安全等。 对MVC的理解。 MVC设计模式(应用观察者模式的框架模式) M: Model,模型,操作数据的业务处理层,并独立于表现层。 V: View,视图,通过客户端数据类型显示数据,并回显模型层的执行结果。 C: Controller,控制器,也就是视图层和模型层桥梁,控制数据的流向,接受视图层发出的事件,并重绘视图 优点: 1)视图控制模型分离, 提高代码重用性。 2)提高开发效率。 3)便于后期维护, 降低维护成本。 4)方便多开发人员间的分工。 缺点: 1)清晰的构架以代码的复杂性为代价, 对小项目优可能反而降低开发效率。 2)运行效率相对较低 Struts1的工作流程: 在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象当ActionServlet接收到一个客户请求时,将执行如下流程. -(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息; -(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中; -(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法; -(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象,就表示表单验证成功; -(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法; -(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件; -(7)ActionForward对象指向JSP组件生成动态网页,返回给客户; struts2的工作流程: 1、客户端浏览器发出HTTP请求。2、根据web.xml配置,该请求被FilterDispatcher接收。3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。6、返回HTTP响应到客户端浏览器。 Hibernate工作原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 为什么要使用Hibernate 为什么要用:1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系 答:Hibernate是对象关系映射的原理,使用Hibernate就不需要写连接数据库繁琐的操作,只需要写配置文件进行映射就行了。 Hibernate是如何延迟加载的? 1、Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) 2、Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 Spring是什么,谈谈你的见解? 目的:解决企业应用开发的复杂性 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 范围:任何Java应用 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。 控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。 面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务()管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。 容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。 框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。 所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。 SSH整合过程? struts、spring、hibernate的整合步骤: 1.导入struts、spring、hibernate所必须的包 2.在web.xml中配置 contextConfigLocation /WEB-INF/applicationContext.xml org.springframework.web.context.ContextLoaderListener< stener-class> < stener> 3.在struts-config.xml中配置 关于云笔记: 用户通过点击登录按钮,绑定的onlick事件,通过ID选择器获取输入的内容,在客户端检测是否为空,为空则提示相应的错误信息到页面,通过发送Ajax请求找到相应的URL利用despterServlet和HandMapping根据SpringMVC的组件扫描功能找到相应的Controller,Controller通过SpringMVC的IOC依赖注入,注入一个Service进行封装业务逻辑,Controller调用该Service,客户端发送的Ajax请求利用date传参,传到Controller调用Service,传入的账号信息利用Dao接口(MyBaties技术)去向数据库中查询用户账号,不能查到的话说明账号信息错误,可以查到的话说明是正确的,然后对比密码,因为数据库中存入的密码是利用MD5格式进行加密处理过的,而页面输入的密码没用加密处理过,所以需要先要加密处理再利用equles进行比较,若一致则成功跳转笔记本首页,跳转前绑定session,目的是防止重复验证和直接访问笔记首页时需要进行验证是否登录,若没用则需重新登录。 oracle中过程和函数的区别? 从参数的返回情况来看: 如果返回多个参数值最好使用存储过程,如果只有一个返回值的话可以使用函数; 从调用情况来看: 如果在SQL语句(DML或SELECT)中调用的话一定是存储函数或存储的封装函数不可以是存储过程,但调用存储函数的时候还有好多限制以及函数的纯度等级的问题 如果是在过程化语句中调用的话,就要看你要实现什么样的功能。函数一般情况下是用来计算并返回一个计算结果而存储过程一般是用来完成特定的数据操作(比如修改、插入数据库表或执行某些DDL语句等等),所以虽然他们的语法上很相似但用户在使用他们的时候所需要完成的功能大部分情况下是不同的。 简述什么是递归?什么情况使用?并使用java实现一个简单的递归程序 1、递归作为一种算法在程序设计语言中广泛应用,是指函数/过程/子程序在运行过程中,直接或间接调用自身而产生的重入现象。 2、递归算法一般用于解决三类问题: 1)数据的定义是按递归定义的(菲波那切数列) 2)问题解法按递归算法实现。 3)数据的结构使按递归定义的(树的遍历,图的搜索) 3、下面使用递归算法实现计算某个整数在二进制中的个数,代码如下 package cn.tedu; /** * 计算二进制中1的个数 * N为奇数,二进制中1的个数等于N/2的个数 * 例子: * num=13 *getBinary(13/2+6)+1 *getBinary(6/2=3)+1 *getBinary(1)+1+1;getBinary(1)返回1,与后边两个1相加得结果3 */ public class Binary { public static int getBinary(int num){ if(num==1) return 1; if(0==num%2){ return getBinary(num/2); }else{ return getBinary(num/2+1); } } } linux常见命令 1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息等等 2.cd命令 (changeDirectory),命令语法:cd [目录名]。说明:切换当前目录至dirName 3.pwd命令 查看当前工作目录路径 4.mkdir命令 创建文件夹 5.rm命令 删除一个目录中的一个或多个文件或目录,如果没有使用- r选项,则rm不会删除目录。如果使用rm 来删除文件,通常仍可以将该文件恢复原状 6.mv命令 移动文件或修改文件名,根据第二参数类型(如目录,则移动文件;如为文件则重命名该文件)。当第二个参数为目录时,可刚多个文件以空格分隔作为第一参数,移动多个文件到参数2指定的目录中 如何将excel表解析出来存到数据库中 1.利用文件上传的技术,将需要导入的Excel表上传至服务器上。 2.利用POI技术读取刚上传的文件,将数据封装至List集合。 3.将List集合转为实体类,进行持久化操作 数据库三范式 1NF:字段不可分;          原子性 字段不可再分,否则就不是关系数据库;  2NF:有主键,非主键字段依赖主键;  唯一性 一个表只说明一个事物;  3NF:非主键字段不能相互依赖;  每列都与主键有直接关系,不存在传递依赖;  数据库数据模型三要素。 数据模型:模型是对现实世界的抽象。在数据库技术中,表示实体类型及实习类型间联系的模型成为“数据模型”。数据模型是数据库管理的教学形式框架,是用来描述一组数据的概念和定义的 常见的几种数据模型: 1. 概念数据模型(Conceptual Model) 2. 逻辑数据模型(Logical Data Model) 3. 物理数据模型(Physical Data Model) 数据模型的三要素: 1. 数据结构  数据结构是所研究的对象类型的集合。这些对象是数据库的组成部分,数据结构指对象和对象间联系的表达和实现,是系统静态特征的描述,包括两个方面:  (1)数据本身:类型、内容、性质。例如关系模型中的域、属性、关系等。 (2)数据之间的联系:数据之间是如何相互联系的,例如关系模型中的主码、外码等联系。   2. 数据操作  对数据库中对象的实例允许执行的操作集合,主要指检索和更新(插入、删除、修改)两类操作。数据模型必须定义这些操作的确切含义、操作符号、操作规则(如优先级)以及实现操作的语言。数据操作是对系统动态特征的描述。   3. 完整性约束条件  数据完整性约束是一组完整性规则的集合,规定数据库状态及状态变化所应满足的条件,以保证数据的正确性、有效性和相容性。 Mysql和oracle的区别和联系 1.组函数用法规则 mysql中组函数在select语句中可以随意使用,但在oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的,或者是group by子句中的列否则报错 select name,count(money) from user;这个放在mysql中没有问题在oracle中就有问题了。 2.自动增长的数据类型处理 MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。 CREATE SEQUENCE序列号的名称(最好是表名+序列号标记)INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE; 其中最大的值按字段的长度来定,如果定义的自动增长的序列号NUMBER(6),最大值为999999 INSERT语句插入这个字段值为:序列号的名称.NEXTVAL 3.单引号的处理 MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。 4.分页的SQL语句的处理 MYSQL处理分页的SQL语句比较简单,用LIMIT开始位置,记录个数;PHP里还可以用SEEK定位到结果集的位置。ORACLE处理分页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置,并且只能用ROWNUM<100,不能用ROWNUM>80。 以下是经过分析后较好的两种ORACLE分页SQL语句(ID是唯一关键字的字段名): 语句一: SELECT * FROM  ( SELECT A.*, ROWNUM RN  FROM (SELECT * FROM TABLE_NAME) A  WHERE ROWNUM <= 40 ) WHERE RN >= 21 语句二: SELECT * FROM  ( SELECT A.*, ROWNUM RN  FROM (SELECT * FROM TABLE_NAME) A  ) WHERE RN BETWEEN 21 AND 40 5.日期字段的处理 MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE,精确到秒,或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)年-月-日24小时:分钟:秒的格式YYYY-MM-DD HH24:MI:SS TO_DATE()还有很多种日期格式,可以参看ORACLE DOC.日期型字段转换成字符串函数TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’) 日期字段的数学运算公式有很大的不同。MYSQL找到离当前时间7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7; MYSQL中插入当前时间的几个函数是:NOW()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中。CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE字段中。CURTIME()以’HH:MM:SS’的格式返回当前的时间,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now()) 而oracle中当前时间是sysdate 6.空字符的处理 MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构,导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。 7.字符串的模糊比较 MYSQL里用字段名like%‘字符串%’,ORACLE里也可以用字段名like%‘字符串%’但这种方法不能使用索引,速度不快,用字符串比较函数instr(字段名,‘字符串’)>0会得到更精确的查找结果。 8.程序和函数里,操作数据库的工作完成后请注意结果集和指针的释放。 java中字符串拼接 String 和 StringBuilder(StringBuffer)的使用 1、String sb=”hello”+”sb”; 2、StringBuilder sb = new StringBuilder(); sb.append("hello"); sb.append("sb"); 字符串拼接是个常用的功能,经常性使用String做字符串拼接,当拼接次数多的时候,使用String方法会消耗大量的性能和时间,因为每次String拼接时都会建立一个新的对象,随着拼接次数的增多,性能消耗、时间消耗会大量增加,这个时候应该使用StringBuilder方法 java中设计模式。(常用的5种) 1.单例模式(饿汉单例,懒汉单例) 单例模式的特点: •单例类只能有一个实例。 •单例类必须自己创建自己的唯一实例。 •单例类必须给所有其他对象提供这一实例。 2.工厂模式 工厂模式,这种模式的核心思想就是管理接口的实例对象,把接口和实例对象之间的关系封装起来处理,外部需要用到某个接口的实例时,由工厂进行分配,而不需要关注具体是哪个实例 (简单工厂,工厂方法,抽象工厂) 3.适配器模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 适配器模式的用途 4.策略模式 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。 5.观察者模式 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 Javascript获取select下拉框选中的的值 现在有一id=test的下拉框,怎么拿到选中的那个值呢? 分别使用javascript原生的方法和jquery方法 一:javascript原生的方法 1:拿到select对象: var myselect=document.getElementById("test"); 2:拿到选中项的索引:var index=myselect.selectedIndex ; // selectedIndex代表的是你所选中项的index 3:拿到选中项options的value: myselect.options[index].value; 4:拿到选中项options的text: myselect.options[index].text; 二:jquery方法(前提是已经加载了jquery库) 1:var options=$("#test option:selected"); //获取选中的项 2:alert(options.val()); //拿到选中项的值 3:alert(options.text()); //拿到选中项的文本

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 4 人已下载

下载文档