IBM面试题 (java方面)

1.java的为什么使用序列化

<span style="font-family:'Microsoft YaHei';font-size:12px;color:#3333ff;">一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。</span>
<span style="font-size:12px;color:#3333ff;"><span style="font-family:'Microsoft YaHei';"><span style="color:#333333;LINE-HEIGHT: 26px">序列化就是一种用来</span><span style="color:red;TEXT-ALIGN: left; LINE-HEIGHT: 26px; TEXT-INDENT: 24px">处理对象流</span><span style="color:#333333;TEXT-ALIGN: left; LINE-HEIGHT: 26px; TEXT-INDENT: 24px">的机制,所谓对象流也就是</span><span style="color:red;TEXT-ALIGN: left; LINE-HEIGHT: 26px; TEXT-INDENT: 24px">将对象的内容进行流化</span><span style="color:#333333;TEXT-ALIGN: left; LINE-HEIGHT: 26px; TEXT-INDENT: 24px">。可以</span><span style="color:red;TEXT-ALIGN: left; LINE-HEIGHT: 26px; TEXT-INDENT: 24px">对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间</span><span style="color:#333333;TEXT-ALIGN: left; LINE-HEIGHT: 26px; TEXT-INDENT: 24px">。序列化是为了</span><span style="color:red;TEXT-ALIGN: left; LINE-HEIGHT: 26px; TEXT-INDENT: 24px">解决在对对象流进行读写操作时所引发的问题。</span>
</span></span>
<span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="color:#990000;">序列化的好处:</span></span>
<span style="font-family:'Microsoft YaHei';font-size:12px;color:#3333ff;">a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口;
b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口;最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,所以可以在网络上传输。
c)如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。</span>
<span style="font-family:'Microsoft YaHei';color:#990000;">什么时候需要序列化呢?</span>
<span style="font-family:'Microsoft YaHei';color:#3333ff;"></span><pre style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 24px; BACKGROUND-COLOR: rgb(253,255,248); MARGIN-TOP: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; ZOOM: 1; WORD-WRAP: break-word; WHITE-SPACE: pre-wrap; MARGIN-BOTTOM: 10px; FONT-SIZE: 14px; PADDING-TOP: 0px" id="content-718511617" class="reply-text mb10" name="code"><span style="font-family:'Microsoft YaHei';">a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;</span>
<span style="font-family:'Microsoft YaHei';font-size:14px;BACKGROUND-COLOR: rgb(255,252,246)">序列</span><span style="font-family:'Microsoft YaHei';font-size:12px;color:#333333;BACKGROUND-COLOR: rgb(255,252,246)">化的特点:</span>

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

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

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

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

    2)ObjectOutputStream类:它继承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和==的区别

这道题请看本博客:Java中equals和==

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的区别

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

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.数据库连接,内连接,左连接,右连接,外连接的区别。

很简单,你懂的额!

11.简单介绍下MVC。

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

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、可以使用多种排序标准,比如升序、降序等

posted @ 2014-09-07 21:59  Tom19971220  阅读(2)  评论(0编辑  收藏  举报  来源
个人网站