java基础知识(二)

五、字符串与数组

5.一、字符串建立于存储的机制是什么

字符串的声明和初始化主要有如下两种状况:java

      1:对于String s1 = new String("abc")语句与String s2 = new String("abc")语句,存在两个引用对象s1,s2,两个内容相同的字符串对象“abc”,它们在内存中的地址是不同的。只要用到new总会生成新的对象。web

      2:对于String s1 = "abc"与String s2 = "abc"语句,在JVM中存在着一个字符串池,其中保存着不少String对象,而且能够被共享使用,s1,s2引用的是同一个常量池的对象。因为String的实现采用了Flyweight的设计模式,当建立一个字符串常量时,例如String s = "abc",会首先在字符串常量池中差最后啊是否已有相同的字符串被定义,其判断依据是String类equals(Object obj)方法的返回值。若已经定义,则直接获取对其的引用,此时不须要建立新的对象;若没有定义,则首先建立这个对象,而后把它加入到字符串池中,再将它的引用返回。因为String是不可变类,一旦建立好了就不能被修改,所以String对象能够被共享并且不会致使程序的混乱。算法

5.二、“==”、equals和HashCode有什么区别

      1:“==”运算符用来比较两个变量的值是否相等。该运算符用于比较变量对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能使用“==”运算符。sql

      2:equals是Object类提供的方法之一。每个java类都继承自Object类,因此每个对象都具备equals这个方法。Object类中定义的equals(Object)方法是直接使用“==”运算符比较的两个对象,因此在没有覆盖equals(Object)方法的状况下,equals(Object)与“==”运算符同样,比较的是引用。数据库

      相比“==”运算符,equals(Object)方法的特殊之处就在于它能够被覆盖,因此能够经过覆盖的方法让他不是比较引用而是比较数据内容,例如String类的equals方法是用于比较两个独立对象的内容是否相同,即堆中的内容是否相同。编程

      3:HashCode()方法是从Object类中继承过来的。它返回对象在内存中地址转换成的一个int值,因此若是没有重写hashcode()方法,任何对象的hashCode()方法都是不相等的。设计模式

      hashCode方法与equals方法的关系以下:若是x.equals(y)返回true,那么调用这两个对象中任一个对象的hashCode方法都必须产生一样的整数结果。若是返回false,那么x和y的hashCode方法的返回值可能相等也可能不相等。反之,hashCode方法的返回值不相等必定能够退出equals方法的返回值也不相等,而hashCode方法返回值相等,equals方法返回值有可能相等也可能不一样。数组

5.三、String、StringBuffer、StringBuilder和StringTokenizer有什么区别

      java语言有四个类能够对字符或字符串进行操做,它们分别是Character、String、StringBuffer和StringTokenizer,其中character用于对单个字符的操做,string用于字符串操做,属于不可变类,StringBuffer也是用于字符串操做,不一样之处是stringbuffer属于可变类。缓存

      string是不可变类,也就是说string对象一旦被建立,其值将不能被改变,而StringBuffer是可变类,当对象被建立后仍然能够对其值进行修改。StringBuffer只能使用构造函数(StringBuffer s = new StringBuffer(“Hello”))的方式来初始化。安全

      StringBuilder也是能够被修改的字符串,它与StringBuffer相似,都是字符串缓冲区,但StringBuilder不是线程安全的。若是只是在单线程中使用字符串缓冲区,那么StringBuilder的效率会高些。所以在只有单线程访问时可使用StringBuilder,当有多个线程访问时,最好使用StringBuffer。由于StringBuffer必要时能够对这些方法进行同步,因此任意特定实例上的全部操做就好像是以串行顺序发生的,该顺序与所涉及的每一个线程进行的方法调用顺序一致。StringTokenizer是用来分割字符串的工具类。

六、异常处理

6.一、finally块中的代码是何时被执行

      在java语言的异常处理中,finally块的做用是为了保证不管出现什么状况,finally块里的代码必定会被执行。因为程序执行return就意味着结束对当前函数的调用并跳出这个函数体,所以任何语句要执行都只能在return以前执行(除非碰到exit函数),所以finally块里的代码也是在return前执行的。此外,try-finally或者catch-finally中都有return,那么finally块中的return语句将会覆盖别处的return语句,最终返回到调用者那里的是finally中return的值。

6.二、异常处理的原理是什么

      异常是指程序运行时(非编译时)所发生的非正常状况或错误,当程序违反了语义规则时,JVM就会将出现的错误表示为一个异常并抛出。这个异常能够在catch程序块中进行补货,而后进行处理。而异常处理的目的则是为了提升程序的安全性和鲁棒性。

      java语言把异常做为对象来处理,并定义了一个基类做为全部异常的父类。在java API中,已经定义了许多异常类,这些异常类分为Error(错误)和Exception(异常)两大类。

      违反语义规则包括两种状况:一种是Java类库内置的语义检查例如当数组下标越界时会引起IndexOutOfBoundsException,当访问null对象时,会引起NullPointerException;另外一种状况是Java容许开发人员扩展这种语义检查,开发人员能够建立本身的异常类(全部异常都是Java.lang.Throwable的子类),并自由选择在什么时候用throw关键字抛出异常。

6.三、运行时异常和普通异常有什么区别

      java提供了两种错误的异常类,分别是错误和异常,且他们有共同的父类——Throwable。Error表示程序在运行期间出现了很是严重的错误,而且该错误是不可恢复的,因为这属于JVM层次的严重错误,所以这种错误是会致使程序终止执行的。Exception表示可恢复的异常,是编译器能够捕捉到的。它包含两种类型:检查异常和运行时异常。

      检查异常是在程序中最常碰到的异常。全部继承自Exception而且不是运行时异常的异常都是检查异常,好比最多见的IO异常和SQL异常。这种异常都发生在编译阶段,java编译器强调程序去捕获此类异常,即把可能会出现这些异常的代码放到try块中,把对异常处理的代码放到catch块中。这种异常一般在如下状况中使用:异常的发生并不会致使程序出错,进行处理后能够继续执行后续的操做,例如当链接数据库失败后能够从新链接后进行后续操做。程序依赖于不可靠的外部条件,例如系统IO。

      运行时异常不一样于检查异常,编译器没有强制对其进行补货并处理。若是不对这些异常进行处理,当出现这种异常时,会由JVM来处理,例如NullPointerException异常,他就是运行时异常。最多见的还有类型转换异常,数组越界异常,数组存储异常,缓冲区溢出异常,算术异常等。出现运行时异常后,系统会把异常一致往上层抛出,知道遇处处理代码为止,若没有处理块,则抛到最上层;若是是多线程则用Thread.run()方法抛出,若是是单线程就用main()方法抛出。抛出以后,若是是单线程那么这个线程也就退出了,若是是主程序抛出的异常,那么整个程序也就退出啦。因此若是不对运行时异常进行处理,后果是很是严重的,一旦发生,要么是线程终止,要么是主程序终止。

七、输入输出流

7.一、javaIO流实现机制是什么

      在JAVA语言中,输入和输出都被称为抽象的流,流能够被看作一组有序的字节集合,即数据在两设备之间的传输。流的本质是数据传输,根据处理数据类型的不一样,流能够分为两大类:字节流和字符流。字节流以8bit为单位,字符流以16bit为单位。字节流和字符流之间最主要的区别是:字节流在处理输入输出时不会用到缓存,而字符流用到了缓存。

7.二、java socket是什么

      网络上的两个程序经过一个双向的通讯链接来实现数据的交换,这个双向链路的一端称为一个socket。socket也称为套接字,能够用来实现不一样虚拟机或不一样计算机之间的通讯,在java语言中,socket能够分为两种类型:面向链接的socket通讯协议(TCP)和面向无链接的socket协议(UDP)。任何一个socket都是由IP地址和端口号惟一肯定的。

7.三、java NIO 是什么

      在非阻塞(Nonblocking)出现以前,java是经过传统的socket来实现基本的网络通讯功能的。

      NIO经过selector、channel和buffer来实现非阻塞的IO操做。NIO非阻塞的实现主要采用了Reactor(反应器)设计模式,这个设计模式与Observer(观察者)设计模式相似,只不过Observer设计模式只能处理一个事件源,而Reactor能够用来处理多个事件源。

   NIO在网络编程中有着很是重要的做用,与传统的socket方式相比,因为NIO采用了非阻塞的方式,在处理大量并发请求时,使用NIO要比使用传统socket效率高出不少。

7.四、什么是java序列化

      java提供了两种对象持久化的方式,分别是序列化和外部序列化。

      一、序列化:在分布式环境下,当进行远程通讯时,不管是何种类型的数据,都会以二进制序列的方式在网络上传送。序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操做时所引起的问题。序列化能够将对象的状态写在流里进行网络传输,或者保存到文件、数据库等系统里,并在须要时把该流读取出来从新构造一个相同的对象。全部要实现序列化的类都必须实现Serializable接口,Serializable接口位于java.lang包中,它里面没有包含任何方法。使用一个输出流来构造一个ObjectOutputStream对象,紧接着,使用该对象的writeObject方法就能够将obj对象写出,要恢复时可使用其对应的输入流。

      因为序列化的使用会影响系统的性能,所以若是不是必需要使用序列化,应尽量不要使用序列化,在如下状况下使用:须要经过网络来发送对象,或对象的状态须要被持久化到数据库或文件中。序列化能实现深复制,便可以复制引用的对象。

      与序列化相对的是反序列化,它将流转换为对象。

      二、外部序列化

      外部序列化与序列化的主要区别在于序列化是内置的API,只须要实现Serializable接口,开发人员不须要编写任何代码就能够实现对象的序列化,而是用外部序列化时,Externalizable接口中的读写方法必须有开发人员来实现。所以与实现Serializable接口的方法相比,使用Externalizable编写程序的难读更大,可是因为把控制权交给了开发人员,在编程时有更多的灵活性,对须要持久化的那些属性能够进行控制,可能会提升性能。

八、java平台与内存管理

8.一、JVM加载class文件的原理机制是什么

      java语言是一种具备动态性的解释型语言,类只有被加载到JVM中后才能运行。当运行指定程序时,JVM会将编译生成的.class文件按照需求和必定的规则加载到内存中,并组织成一个完整的java应用程序。这个过程是由类加载器完成的,具体来讲就是由ClassLoader和它的子类来实现的。类加载器自己也是一个类,其实质是把类文件从硬盘读到内存中。

      类的加载方式分为隐式加载和显式加载两种。隐式加载指的是程序在使用new等方式建立对象时会隐式的调用类的加载器把对应的类加载到JVM中。显式加载指的是经过直接调用class.forName()方法来吧所需的类加载到JVM中。

8.二、垃圾回收

      垃圾回收在java语言中是一个很是重要的概念,它的主要做用是回收程序不在使用的内存。具体而言,垃圾回收期主要负责完成三项任务:分配内存、确保被引用对象的内存不被错误的回收以及回收不在被引用的对象的内存空间。

九、容器

9.一、java Collection框架是什么

      java Collection框架中包含了大量集合接口以及这些接口的实现类和操做它们的算法,具体而言,主要提供了List、queue、set、stack和map等数据结构。其中,List、queue、set、stack都继承自collection接口。

9.二、ArrayList、Vector、LinkedList有什么区别 

      ArrayList与Vector之间最大的区别是同步的使用,没有一个ArrayList的方法是同步的,而vector的绝大多数方法是直接或间接同步的,因此Vector方法是线程安全的,ArrayList不是线程安全的。正是因为Vector提供了线程安全的机制,其性能上也要略逊于ArrayList。

      LinkedList是采用双向列表实现的,对数据的索引须要从列表头开始遍历,所以用于随机访问则效率较低,可是插入元素时不须要对数据进行移动,所以插入效率较高。同时,LinkedList是非线程安全的容器。

9.三、HashMap、Hashtable、TreeMap和WeakHashMap有哪些区别

      HashMap是一个最经常使用的Map,他根据键的HashCode值存储数据,根据键能够直接获取它的值,具备很快的访问速度。因为HashMap和Hashtable都采用了hash方法进行索引,所以两者具备不少类似之处,它们的主要区别有:

      1:HashMap是Hashtable的轻量级实现(非线程安全的实现),它们都完成了map接口,主要区别在于HashMap容许空键值(最多只容许一条记录的键为空,不容许多条记录的键为空),而Hashtable不容许。

      2:HashMap把Hashtable的contains方法去掉了,改为了containsvalue和containsKey,由于contains方法容易让人产生误解。Hashtable继承自directory类,而HashMap是java1.2引进的Map interface的一个实现。

      3:Hashtable的方法是线程安全的,而HashMap不支持线程的同步,因此它不是线程安全的。在多个线程访问Hashtable时,不须要开发人员对它进行同步,而对于HashMap,开发人员必须提供额外的同步机制。因此就效率而言,HashMap可能高于Hashtable。

      4:Hashtable使用Enumeration,HashMap使用Iterator。

      5:Hashtable和HashMap采用的hash/rehash算法都几乎同样,因此性能不会有很大差别。

      6:在Hashtable中,hash数组默认大小是11,增长的方式是old*1+1,在HashMap中,hash数组的默认大小是16,并且必定是2的指数。

      7:hash值的使用不一样,Hashtable直接使用对象的hashcode。

      因为TreeMap实现了sortmap接口,可以把它保存的记录根据键排序,所以,取出来的是排序后的键值对,若是须要按天然排序或自定义顺序遍历键,那么treemap会更好LinkedHashMap是HashMap的一个子类,若是须要输出的顺序与输入的顺序相同,可使用它,他还能够根据读取顺序来排列。

      weakhashmap与HashMap相似,两者的不一样之处在于weakhashmap中key采用的是“弱引用”的方式,只要weakhashmap中的key再也不被外部引用,他就能够被垃圾回收器回收。而HashMap中的key采用的是强引用的方式,当HashMap中的key没有被外部引用时,只有在这个key从HashMap中删除后才能够被垃圾回收器回收。

9.四、Collection和Collections有什么区别

      Collection是一个集合接口。他提供了对集合对象进行基本操做的通用接口方法。实现该接口的类主要有List和set,该接口的设计目标是为各类具体的集合提供最大化的统一的操做方式。

      Collections是针对集合类的一个包装类,它提供了一系列静态方法以实现对各类集合的搜索、排序、线程安全化等操做,其中大多数方法都是用来处理线性表。Collections类不能实例化,如同一个工具类,服务于Collection框架。若在使用Collections的方法时,对应的Collection的对象为null,则这些方法都会抛出NullPointerException。

十、多线程

10.一、多线程的便利之处

      一、使用多线程能够减小程序运行的时间;二、与进程相比,线程的建立和切换开销更小;三、多CPU或多核计算机自己就具备执行多线程的能力,若是使用单个线程,将没法重复利用计算机资源,形成资源的巨大浪费;四、使用多线程能简化程序的结构,使程序便于理解和维护。

10.2如何实现java多线程

      一、继承Thread类,重写run()方法

      二、实现Runnable()接口,并实现该接口的run()方法

      三、实现Callable接口,重写call()方法

10.三、多线程同步的实现方法有哪些

      一、synchronized关键字:在java语言中,每一个对象都有一个对象锁与之相关联,该锁代表对象在任什么时候候只容许被一个线程所拥有,当一个线程调用对象的一段synchronized代码时,须要先得到这个锁,而后去执行相应的代码,执行结束后释放锁。synchronized关键字主要有两种用法,synchronized方法和synchronized块,此处该关键字还能够做用于静态方法、类或某个实例,但这都对程序的效率有很大的影响。

      二、wait()方法和notify()方法:在synchronized代码被执行期间线程能够调用对象的wait()方法,释放对象锁,进入等待状态,而且能够调用notify()方法或notifyAll()方法通知正在等待的其余进程。notify()方法用来唤醒一个线程并容许它得到锁,notifyAll()方法唤醒全部等待这个对象的线程并容许它们去得到锁。

      三、Lock:

      lock():以阻塞的方式获取锁,也就是说若是获取到了锁,当即返回;若是别的线程持有锁,当前线程等待,直到获取锁后返回。

      trylock():以非阻塞的方式获取锁。只是尝试性的去获取一下锁,若是获取到了锁,当即返回true,不然当即返回false。

      tryLock(long timeout,TimeUnit unit):若是获取了锁当即返回true,不然会等待参数给定的时间单元,在等待的过程当中,若是获取了锁,就返回true,若是等待超时返回false。

      lockInterruptibly():若是获取了锁,当即返回;若是没有获取锁,当前线程处于休眠状态直到得到锁,或者当前线程被别的线程中断。

10.四、sleep与wait方法有什么区别

一、原理不一样:sleep方法是Thread类的静态方法,是线程用来控制自身流程的。而wait方法是Object类的方法,用于线程间的通讯,这个方法会使当前拥有该对象锁的进程等待,直到其余线程调用notify方法是才醒来,不过开发人员也能够给他指定一个时间自动醒来。

二、对锁的处理机制不一样:因为sleep方法的主要做用是让线程暂停执行一段时间,时间一到自动恢复,不涉及线程间的通讯,所以调用sleep方法不会释放锁。而wait方法不一样,调用它后,线程会释放掉它所占用的锁,从而使线程所在对象中的其余synchronized数据可被别的线程使用。

三、使用区域不一样:因为wait方法的特殊意义,它必须放在同步控制方法或者同步语句块中使用,而sleep方法能够在任何地方使用。

10.五、终止线程的方法有哪些

      在java语言中,可使用stop和suspend方法来终止线程的执行。当用Thead.stop()来终止线程时,他会释放已经锁定的全部监视资源。若是当前任何一个受这些监视资源保护的对象处于一个不一致的状态,其余线程将会看到这个不一致的状态,这可能会致使程序执行的不肯定性,而且这种问题很难被定位。调用suspend()方法很容易致使死锁。因为调用suspend()方法不会释放锁,这就会致使一个问题:若是用一个suspend挂起一个有锁的线程,那么在锁恢复以前将不会被释放。若是调用suspend方法,线程将试图取得相同的锁,程序就会发生死锁。

10.六、synchronized与lock有什么异同

      java提供了两种锁机制来实现对某个共享资源的同步:synchronized和lock方法。其中,synchronized使用object对象自己的wait、notify和notifyAll调度机制,而lock能够用condition进行线程之间的调度,完成synchronized实现的全部功能。

区别以下:

      一、用法不同:在须要同步的对象中加入synchronized控制,synchronized既能够加在方法上,也能够加在特定代码块中,括号中表示须要锁的对象。而lock须要显式的指定起始位置和终止位置。synchronized是托管给jvm执行的,而lock的锁定是经过代码实现的,它有比synchronized更精确的线程语义。

      二、性能不同:在JDK5中增长了一个Lock接口的实现类ReentrantLock。他不只拥有和synchronized相同的并发性和内存语义,还多了锁投票、定时锁、等候和中断锁等。它们的性能在不一样的状况下会有锁不一样:在资源竞争不是很激烈的状况下,synchronized的性能要优于ReentrantLock,可是在资源竞争很激烈的状况下,synchronized的性能降低的很是快,而ReentrantLock的性能基本保持不变。

      三、锁机制不同:synchronized得到锁和释放的方式都是在块结构中,当获取多个锁时,必须以相反的顺序释放,而且是自动解锁,不会由于出了异常而致使锁没有被释放从而引起死锁。而lock则须要开发人员手动去释放,而且必须在finally块中释放,不然会引发死锁问题的发生。此外,lock还提供了更强大的功能,它的tryLock方法能够采用非阻塞的方式去获取锁。

10.七、什么是守护线程

      java提供了两种线程:守护线程和用户线程。守护线程又被称为服务进程、精灵线程或后台线程,是指在程序运行时在后台提供一种通用服务的线程,这种线程并不属于程序中不可或缺的一部分。通俗的讲,任何一个守护线程都是整个JVM中全部非守护线程的保姆。

      用户线程和守护线程几乎同样,惟一的不一样之处就在于若是用户线程已经所有退出运行,只剩下守护线程存在了,JVM也就退出了。由于当全部非守护线程结束时,没有了被守护者,守护线程也就没工做可作了,也就没有继续运行程序的必要了,程序也就终止了,同时会杀死全部守护线程。

10.八、join方法的做用是什么

      在java语言中,join方法的做用是让调用该方法的线程在执行完run方法后再执行join方法后面的代码。简单来讲就是将两个线程合并,用于实现同步功能。

十一、java数据库操做

11.一、如何经过JDBC访问数据库

      java数据库链接(JDBC)用于在java程序中实现数据库操做功能,他提供了执行SQL语句、访问各类数据库的方法,并为各类不一样数据库提供统一的操做接口,java.sql包中包含了JDBC操做数据库的全部类。经过JDBC访问数据库通常有以下几个步骤:一、加载JDBC驱动器。将数据库的JDBC驱动加载到classpath中,在基于JavaEE的web应用开发过程当中,一般要把目标数据库产品的JDBC驱动复制到WEB_INF/lib下。二、加载JDBC驱动,并将其注册到DriverManager中。通常使用反射Class.forName(String driveName)。三、创建数据库链接,取得connection对象。通常经过DriverManager.getConnection(url,username,passwd)方法实现。四、创建Statement对象或是PreparedStatement对象。五、执行SQL语句。六、访问结果集ResultSet对象。七、依次将ResultSet、Statement、PreparedStatement、Connection对象关闭,释放掉所占用资源。

11.二、JDBC处理事务采用什么方法

      一个事务是由一条或多条对数据库操做的SQL语句所组成的一个不可分割的工做单元,只有当事务中的全部操做都正常执行完了,整个事务才会被提交给数据库。在JDBC中,通常是经过commit方法或rollback方法来结束事务的操做。其中commit方法表示完成对事务的提交,rollback表示完成事务回滚,多用于在处理事务的过程当中出现了异常的状况,这两种方法都位于java.sql.connection类中。通常而言,事务默认操做是自动提交,即操做成功后,系统将自动调用commit方法,不然将调用rollback方法。

       固然在JDBC中也能够经过调用setAutoCommit(false)方法来禁止自动提交,而后就能够把多个数据库操做的表达式做为一个事务,在操做完成后调用commit方法实现总体提交,若是其中一个表达式操做失败,就会抛出异常而不会调用commit方法。在这种状况下就能够在异常捕获的代码块中调用rollback实现回滚。经过此种方法能够保证对数据的屡次操做后,数据仍然保持一致性。

11.三、Class.forName做用是什么

      在java语言中,任何类只有在装载到JVM上才能运行。Class.forName方法的做用就是把类加载到JVM上,他会返回一个与大有给定字符串名的类或接口相关联的class对象,而且JVM会加载这个类,同时JVM会执行该类的静态代码段。

11.四、Statement、PreparedStatement和CallableStatement有什么区别

      statement用来执行不带参数的简单SQL语句,并返回它所生成结果的对象,每次执行SQL语句时,数据库都会编译该SQL语句。

      PreparedStatement表示预编译的SQL语句的对象,用于执行带参数的预编译SQL语句。

      CallableStatement则提供了用来调用数据库中存储过程的接口,若是有输出参数要注册,说明是输出参数。

11.五、getString与getObject方法有什么区别

      JDBC提供了getString、getInt和getData等方法从ResultSet中获取数据,当查询结果集中数据量较小时,不用考虑性能,使用这种方法彻底可以知足需求,可是当查询结果集中的数据量很是大时则会抛出异常:OracleException未处理:...。而一般状况下,使用getObject方法就能够解决这个问题。

      getString或getInt方法在被调用时,程序会一次性的把数据都放到内存中,而后经过调用ResultSet的next和getString等方法来获取数据。当数据量大到内存中放不下的时候会抛出异常,而使用getObject方法就不会出现这种问题,由于数据不会一次性被读取到内存中,每次调用时会直接从数据库中去获取数据,所以使用这种方法不会由于数据量过大而出错。

11.六、使用JDBC须要主要哪些问题

      在使用JDBC编程时,首先须要创建数据库的链接才能完成对数据库的访问,因为与数据库的链接是很是重要的资源。JDBC链接池提供了JDBC链接定义和数目有限的链接,若是链接数量不够,就须要长时间的等待。不正常关闭JDBC链接会致使等待回收无效的JDBC链接。只有正常的关闭和释放JDBC链接,JDBC资源才能够被快速的重用,从而使系统性能获得改善。所以在编程时,必定要保证释放不在使用的链接。

      通常来说,在使用JDBC访问数据库时,createStatement和PreparedStatement最好放在循环外面,并且使用了这些statement后,须要及时关闭。最好是执行了一次executeQuery、executeUpdate等以后,若是不须要使用结果集(ResultSet)的数据,就立刻将statement关闭。由于每次执行conn.createStatement()和conn.prepareStatement,实际上都至关于在数据库中打开一个cursor(游标),若是把对这两个方法的调用放在循环内,会一致不停的打开cursor。若是不能及时的关闭,会致使程序抛出异常。

11.七、什么是JDO

      java数据对象(java data object)是一个用于存取某种数据仓库中的对象的标准化API,它使开发人员可以间接的访问数据库。

      JDO是JDBC的一个补充,他提供了透明的对象存储,所以对于开发人员来讲,存储数据对象彻底不须要额外的代码(例如JDBC API的使用)。这些繁琐的工做已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,相较于JDBC,JDO更加灵活,更通用,它提供了到任何数据底层的存储功能。

11.八、JDBC与Hibernate有什么区别

      Hibernate是JDBC的封装,采用配置文件的形式将数据库的链接参数写到XML文件中,至于对数据库的访问仍是经过JDBC来完成的。

      Hibernate是一个持久层框架,它将表的信息映射到XML文件中,再从XML文件映射到相应的持久化类中,这样可使用Hibernate独特的查询语言了。

相关文章
相关标签/搜索