一个类只有实现了serializable,它的对象才是可序列化的。因此,如果要序列化某些类的对象,就必须实现serializable接口。serializable接口是个空接口,只是标识一个类的对象可以被序列化。序列化就是一种来处理对象流的机制,所谓对象流就是将对象的内容进行流化。可以对流化的对象进行读写,也可以将流化的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

序列化的好处:内存不够用了,那么可以将内存中的一部分对象暂时保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间,就是虚拟内存。再比如,要将特定的某个对象保存到文件中,以后再拿出来用,这个时候就要实现serializable接口。


b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口;最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,所以可以在网络上传输。 c)如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。


什么时候需要序列化呢?


当你想把的内存中的对象保存到一个文件中或者数据库中时候; b)当你想用套接字在网络上传送对象的时候; c)当你想通过RMI传输对象的时候;


(1)如果某个类能够被序列化,其子类也可以被序列化。如果该类有父类,则分两种情况来考虑,如果该父类已经实现了可串行化接口。则其父类的相应字段及属性的处理和该类相同;如果该类的父类没有实现可序列化接口,则该类的父类所有的字段属性将不会序列化。

(2)声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据;

(3)相关的类和接口:在java.io包中提供的涉及对象的串行化的类与接口有ObjectOutput接口、ObjectOutputStream类、ObjectInput接口、ObjectInputStream类。

继承DataOutput接口并且支持对象的序列化,其内的writeObject()方法实现存储一个对象。ObjectInput接口:它继承DataInput接口并且支持对象的序列化,其内的readObject()方法实现读取一个对象。

继承OutputStream类并且实现ObjectOutput接口。利用该类来实现将对象存储(调用ObjectOutput接口中的writeObject()方法)。ObjectInputStream类:它继承InputStream类并且实现ObjectInput接口。利用该类来实现读取一个对象(调用ObjectInput接口中的readObject()方法)。

如果父类没有实现序列化接口,则其必须有默认的构造函数(即没有参数的构造函数)。否则编译的时候就会报错。在反串行化的时候,默认构造函数会被调用。但是若把父类标记为可以序列化,则在反串行化的时候,其默认构造函数不会被调用。这是为什么呢?这是因为Java 对串行化的对象进行反串行化的时候,直接从流里获取其对象数据来生成一个对象实例,而不是通过其构造函数来完成。




2.jdk和jre的区别

jdk是Java Development Kit 也就是开发人员的SDK,提供了java的开发环境和运行环境。

jre是Java Runtime Environment 是指java的运行环境,是面向java程序的使用者,而不是开发者。只有你的电脑安装了jre,你才能运行java程序。

3.equals和==的区别

对于“==”这个是比较的两个变量是否相等,比较的是两个变量在内存中的值是否一致,要比较两个基本数据类型或者是引用变量类型,只能用“==”来比较。而对于引用类型来说,情况就不一样了,对于引用类型,“==”比较的是两个引用类型的内存地址是否一致,意思就是这两个引用指代的是不是同一块内存的首地址,若是则返回true,否则是false。


对于“equals”来说,比较的就是两个对象的内容是否一致,当然比如 

String a=new String("foo");

String b=new String("foo");

对象a,b是两个不同的对象,在内存中的地址是不一致的,如果用“==”,返回的是false,但是用equals返回的是true,因为他们是的地址不一样但是内容是一致的。

4.Notify是什么

Notify是唤醒特定一个wait()的进程,NotifyAll是唤醒所有wait()的进程。

5.异常处理

分为两大类:Error和Exception

Exception分为:执行异常(RuntimeException)和检查异常(CheckedException)

RuntimeException在默认情况下会得到自动处理。所以通常用不着捕获RuntimeException,但在自己的封装里,也许仍然要选择抛出一部RuntimeException。

RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。它是unCheckedExcepiton。

Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.EnumConstantNotPresentException
Java.lang.IllegalArgumentException
Java.lang.IllegalThreadStateException
Java.lang.NumberFormatException
Java.lang.IllegalMonitorStateException
Java.lang.IllegalStateException
Java.lang.IndexOutOfBoundsException
Java.lang.ArrayIndexOutOfBoundsException
Java.lang.StringIndexOutOfBoundsException
Java.lang.NegativeArraySizeException’
Java.lang.NullPointerException
Java.lang.SecurityException
Java.lang.TypeNotPresentException
Java.lang.UnsupprotedOperationException



除了runtimeException以外的异常,都属于checkedException,它们都在java.lang库内部定义。Java编译器要求程序必须捕获或声明抛出这种异常。

一个方法必须通过throws语句在方法的声明部分说明它可能抛出但并未捕获的所有checkedException。

Java.lang.ClassNotFoundException
Java.lang.CloneNotSupportedException
Java.lang.IllegalAccessException
Java.lang.InterruptedException
Java.lang.NoSuchFieldException
Java.lang.NoSuchMetodException



与异常不同的是Error及其子类的对象不应被抛出。

Error 是 Throwable 的子类,代表编译时间和系统错误,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然 ThreadDeath 错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。

在执行该方法期间,无需在其 throws 子句中声明可能抛出但是未能捕获的 Error 的任何子类,因为这些错误可能是再也不会发生的异常条件。

它是uncheckedExcepiton。

ArrayIndexOutOfBoundsException

6.unCheckedException和CheckedException的区别,适用范围

如上题

7.final,finally和finalize的区别


final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。 finally 在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。


8.数据库union和union all的区别

都是将两个结果集合并为一个。union会删除重复的记录,保留一条;union all会将所有记录都查询出来,不进行重复数据的筛选。

9.forward内部跳转 和redirect重定向跳转的区别

1).从地址栏显示来说  forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.  redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
2).从数据共享来说  forward:转发页面和转发到的页面可以共享request里面的数据.  redirect:不能共享数据.  
3).从运用地方来说  forward:一般用于用户登陆的时候,根据角色转发到相应的模块.  redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.  
4).从效率来说  forward:高.  redirect:低.

10.数据库连接,内连接,左连接,右连接,外连接的区别。

联接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定联接条件。WHERE和HAVING子句也可以包含搜索条件,以进一步筛选联接条件所选的行。    
联接可分为以下几类:    


1、内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符)。包括相等联接和自然联接。     
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。   
    
2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。     
在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     

1)LEFT  JOIN或LEFT OUTER JOIN     
左向外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。       

2)RIGHT  JOIN 或 RIGHT  OUTER  JOIN     
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。       
3)FULL  JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。   
    
3、交叉联接   
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。    

FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。     
    
例子:   

-------------------------------------------------
   a表     id   name     b表     id   job   parent_id   
               1   张3                   1     23     1   
               2   李四                 2     34     2   
               3   王武                 3     34     4       
   a.id同parent_id   存在关系    --------------------------------------------------


 1) 内连接   
 

select   a.*,b.*   from   a   inner   join   b     on   a.id=b.parent_id       
   结果是     
   1   张3                   1     23     1   
   2   李四                  2     34     2


    
  2)左连接   
 

select   a.*,b.*   from   a   left   join   b     on   a.id=b.parent_id       
   结果是     
   1   张3                   1     23     1   
   2   李四                  2     34     2   
   3   王武                  null

 

3) 右连接   

select   a.*,b.*   from   a   right   join   b     on   a.id=b.parent_id       
   结果是     
   1   张3                   1     23     1   
   2   李四                  2     34     2   
   null                       3     34     4


    
 4) 完全连接   

select   a.*,b.*   from   a   full   join   b     on   a.id=b.parent_id   
   结果是     
   1   张3                  1     23     1   
   2   李四                 2     34     2   
   null                   3     34     4   
   3   王武                 null

 



11.简单介绍下MVC。


MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

12.简单介绍下对关系型数据和网络数据库的理解!

网络数据库(Network Database)其含义有三个:①在网络上运行的数据库。②网络上包含其他用户地址的数据库。③信息管理中,数据记录可以以多种方式相互关联的一种数据库。网络数据库和分层数据库相似,因为其包含从一个记录到另一个记录的前进。与后者的区别在于其更不严格的结构:任何一个记录可指向多个记录,而多个记录也可以指向一个记录。实际上,网络数据库允许两个节点间的多个路径,而分层数据库只能有一个从父记录(高级记录)到子记录(低级目录)的路径。

因此,网络数据库是跨越电脑在网络上创建、运行的数据库。网络数据库中的数据之间的关系不是一一对应的,可能存在着一对多的关系,这种关系也不是只有一种路径的涵盖关系,而可能会有多种路径或从属的关系。

关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系模型是由埃德加·科德于1970年首先提出的,并配合“科德十二定律”。现如今虽然对此模型有一些批评意见,但它还是数据存储的传统标准。标准数据查询语言SQL就是一种基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。 关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。

13.Comparator和Comparable在排序中的应用

Comparable 的类层次是:java.util;
Comparator  的类层次是:java.lang,
comparable&   Comparator   都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,

所以,如想实现排序,就需要在集合外定义Comparator接口的方法带有两个参数compare(Object obj1,Object obj2)和方法equals(Object obj)

或在集合内实现Comparable接口的方法带有一个参数compareTo(Object obj)。 
Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String    Integer自己就可以完成比较大小操作) 而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
一个类实现了Comparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等