CSDN博客

img somat

你是否了解这些常被问起的问题

发表于2004/10/20 16:36:00  1611人阅读

你是否了解这些常被问起的问题

    最近在网上看到一些类似“Java陷阱一箩筐”、“面试题集及解答”的帖子,看了后,感觉有很多东西的确是我们容易忽略的,而且在一定程度上可以看出对Java的了解程度。但这些帖子都比较乱,而且有些问题的解答我个人认为是不够精确或完全是错误的。为此,我大致整理了一些与Java有关的问题,也增加了一些问题,汇总一起并给出相应的说明。如有不对的地方,请指正。

1、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?

    会执行,在return前执行。

2、Error、Exception和RuntimeException的区别?

    Error和Exception都继承自Throwable类,RuntimeException继承自Exception类(这可能有点不合理)。
    Error表示非常严重的、不可预期的异常情况,通常应用程序无需捕获并处理。
    Exception通常是一种设计或实现的异常,它是编译器可以“感知”的异常,所以程序被要求必须捕获并处理这些异常。
    RuntimeException与Error一样,也是无需捕获的,且就算在方法上throws了RuntimeException,调用该方法的语句也无需catch这些异常。

3、&和&&的区别?

    &是位运算符(位与)。&&是布尔逻辑运算符(相当于并且的意思)。

4、HashMap和Hashtable的区别?

    相同的地方:都实现了Map接口,Hashtable继承自Dectionary类(自JDK 1.0开始),HashMap则继承自AbstractMap类(自JDK 1.2开始)。
    主要的不同:HashMap是非同步而Hashtable是同步的,HashMap允许null键和null值而Hashtable不允许。
    还有一个实现SortedMap(Map的子接口)接口的类,叫TreeMap。而TreeMap和HashMap的最大不同是:TreeMap对Key进行排序,而HashMap不排序。
    至于“因为HashMap没有同步,所以HashMap比Hashtable快”的说法,我觉得是不够严密的。HashMap和Hashtable的快慢并不仅仅取决于同步还是非同步,不同操作的实现方法也是影响因素。Java Performance Portal网站上对HashMap、Hashtable和TreeMap做过测试,相关的结果如下:

   
 
HashMap Hashtable TreeMap
fill 3 ms 2 ms 9 ms
iterate 111 ms 154 ms 594 ms
remove 5 ms 6 ms 13 ms
         (详细情况参见http://www.java-performance-portal.org/modules.php?name=News&file=article&sid=18)

    可以看出,在fill操作上,HashMap是要比Hashtable慢的。只有在interate和remove时,HashMap才比较快。
    原则上,应该优先考虑使用HashMap,其同步要求,可以通过:Map m = Collections.synchronizedMap(new HashMap(...))来增加。

5、Collection和Collections的区别?

    Collections是java.util下的工具类,提供各种有关集合操作的静态方法,功能很强大。
    Collection是java.util下的接口,是各种集合结构(List, Set)的父接口。

6、String s = new String("Hello")与String s = "Hello"有何不同?
    用new的话就明确的告诉了JVM这个串对象需要新创建,也不是到串池里取。而s="Hello"会先到串池里取,没有才新创建并放到池里。比如:
    String s1 = new String("Hello");
    String s2 = "Hello";
    String s3 = "Hello";
    则会创建两个String对象(值都为"Hello"):s1指向一个,s2和s3共同指向一个,且s2和s3指向的对象放在串池里。
    建议:尽量使用String s = "Hello"的形式,这样提高效率。
 
7、equals()方法与==有何不同?
    一般,equals比较变量的值是否相等,而==是比较变量的内存地址是否相等(即同一对象)。比如上面定义的String中:
    s1.equals(s2)、s1.equals(s3)、s2.equals(s3)以及s2==s3都为true,而s1==s2、s1==s3都为false。
    建议:尽量使用equals()方法,因为基本上我们比较的是变量值。

8、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

    short s1 = 1; s1 = s1 + 1; 有错,s1是short型,s1+1是int型,需要显式转化为short型,即修改为s1 = (short)(s1 + 1)。
    short s1 = 1; s1 += 1; 是正确的。

9、数组有没有length()这个方法? String有没有length()这个方法?

    数组没有length()方法,但有length属性可以直接使用。String有length()方法。

10、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

    override,覆写,指子类完完全全对父类方法的覆写。
    overload,重载,指子类或本类新写同样命名的方法(返回值、参数可能不同)。
    Overloaded的方法可以改变返回值的类型,但不能仅仅只是改变返回值的类型,还需要改变参数的类型或者个数。

11、构造器Constructor是否可被override?
    构造器Constructor不能被继承,因此不能覆写(Overriding),但可以被重载(Overloading)。

12、是否可以继承String类?

    String类是final类故不可以继承。

13、启动一个线程是用run()还是start()? 

    用start()方法启动一个线程。不要用run(),因为run()只是Runnable的接口方法而已,除此之外跟一般的方法没什么不同(在当前线程中运行)。而start()则不一样,它会启动一个新的线程,然后让run()方法在新的线程上执行。

14、sleep()和wait()有什么区别?
    主要的区别是:
    1)sleep()是Thread的方法,而wait()是Object的方法;
    2)wait()需要在同步方法或块里使用,调用时它会释放锁。所以wait()会挂起线程,而sleep()不会(会继续占用CPU时间)。
    建议:尽量不使用sleep()。

15、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 

    如果其它方法也是synchronized的,则不能访问,否则可以访问。

16、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

    不对。JDK里已经明确说明,如果两个对象通过equals方法判断相等,则调用hashCode时它们必须产生相同的整数结果。

17、swtich是否能作用在byte、long或String上?

    switch(expr1)中,expr1是一个整数表达式。因此传递给switch和case语句的参数应该是int、 short、 char或者byte。long和String都不能作用于swtich。

18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
 
    是值传递。首先明确一个重要概念:Java不像C++支持两种参数传递方式(传值、传址),Java只支持参数传值的方式。当一个对象实例作为一个参数被传递到调用的方法中时,方法的参数实际上是对该对象的引用的值的副本。对象的内容可以借这个引用副本在被调用的方法中被改变,但这个引用副本本身的改变是不会影响到方法外的,更不可能更改对象(因为引用副本改变了就不再指向该对象)。所以这里说的“并可返回变化后的结果”并不准确,变化是因为被调用方法里使用获得的对象引用地址直接更改了对象,而不是“返回”。所以像C/C++里著名的swap(int, int)方法,Java是没有办法像那样实现的,但这并不影响Java的使用。
阅读全文
0 0

相关文章推荐

img
取 消
img