【问题标题】:Understanding basic Java-specific interverview questions了解基本的 Java 特定面试问题
【发布时间】:2011-07-09 11:43:30
【问题描述】:

昨天我接受了一次面试,他们问了我一些 java 问题,其中有些问题我不知道答案。我很想知道这个问题的答案。面试官没有告诉我答案。我在这里问这些问题:

  • Java 是否提供任何构造来找出对象的大小?
  • 提供一种最简单的方法来找出方法执行所需的时间而不使用任何分析工具?
  • 什么是检查异常和运行时异常?
  • 如果我在 try 块的末尾写 return,finally 块还会执行吗?
  • 如果我写 System.exit (0);在 try 块结束时,finally 块还会执行吗?

想知道以上问题的答案,以便下次帮助我。

对于规范的解释、注释和/或相关链接,如果只是简单的答案,我们将不胜感激——学习这些东西的好方法是什么?

【问题讨论】:

  • -1 伙计...在这里我期待有趣的问题...我认为这不是一个好问题(例如,信息很容易研究和测试并且可能令人难以置信的重复)-但是,希望能得到一些好的详细回复。
  • 鉴于您现在可以访问编译器/运行时和 Google,认为答案是什么?

标签: java


【解决方案1】:

我认为所有这些都可以通过搜索现有的 Stack Overflow 问题来回答。我认为值得通过与先前答案的链接来回答这个问题的原因是,您已经询问了很多不同的问题,每个问题本身都很有趣。当您一起询问这些问题时,您不太可能对这些问题进行深入讨论,但是在前面问题的答案和 cmets 中,您会发现很多细节和讨论,其中 (a) 可能很有趣并且(b) 可能有助于进一步的面谈。 (可能有更好的选择——这些只是我找到的第一个合理的 SO 答案。)

Java 是否提供任何构造来找出对象的大小?

提供一种最简单的方法来找出方法执行所需的时间而不使用任何分析工具?

什么是检查异常和运行时异常?

如果我在 try 块的末尾写 return,finally 块还会执行吗?

如果我写 System.exit (0);在 try 块结束时,finally 块还会执行吗?

【讨论】:

  • 有时答案很小,但要获得该内容需要大量研究和努力。这是需要花费大量时间搜索的答案类型,您已成功完成。谢谢很好的答案@Mark Longair
【解决方案2】:

Java 是否提供任何构造来找出对象的大小?

AFAIK 编号

提供一种最简单的方法来找出方法执行所需的时间而不使用任何分析工具?

System.currentTimeMillis()System.nanoTime()测量时间。

什么是检查异常和运行时异常?

详细解释请查看this thread

如果我在try块的末尾写return,finally块还会执行吗?

是的。

如果我写 System.exit (0);在 try 块结束时,finally 块还会执行吗?

没有。

【讨论】:

    【解决方案3】:

    Java 是否提供任何构造来找出对象的大小?

    没有。

    提供一个简单的方法来找出方法执行所需的时间而不使用任何分析工具?

    long t0 = System.nanoTime();
    // code to profile
    long timeTaken = System.nanoTime() - t0;
    

    什么是检查异常和运行时异常?

    已检查异常是任何不从java.lang.Errorjava.lang.RuntimeException 扩展的Throwable。如果您不处理或显式传播已检查的异常,java 编译器会给您一个错误。

    如果我在try块的末尾写return,finally块还会执行吗?

    是的

    如果我写 System.exit (0);在 try 块结束时,finally 块还会执行吗?

    也许吧。如果存在SecurityManager,那么它可以抛出SecurityException 而不是退出,这将触发finally 块。

    如果您的堆栈太大,调用System.exit 可能会导致堆栈溢出异常,从而触发finally 块。

    【讨论】:

      【解决方案4】:

      Java 是否提供任何构造来找出对象的大小?

      据我所知,没有跨平台/跨 VM 的方式。

      提供一种最简单的方法来找出方法执行所需的时间而不使用任何分析工具?

      通过在执行前后创建 new Date()。

      什么是检查异常和运行时异常?

      您应该将检查的异常包装到 try/catch 块中

      如果我在try块的末尾写return,finally块还会执行吗?

      是的

      如果我写 System.exit (0);在 try 块结束时,finally 块还会执行吗?

      没有。

      【讨论】:

        【解决方案5】:

        Java 是否提供任何构造来找出对象的大小?

        不是真的。您可以创建一个对象并记下内存差异,或者阅读规范以查看对象是由什么组成的。

        提供一种最简单的方法来找出方法执行所需的时间而不使用任何分析工具?

        像这样:

        long start = System.currentTimeMillis();
        // do something
        System.out.println("Time: " + (System.currentTimeMillis() - start));
        

        什么是检查异常和运行时异常?

        已检查异常是在例程的throws 部分中声明的异常。类似地,未检查的 exctions 是那些未声明的,例如,RuntimeException 的子类。

        如果我在try块的末尾写return,finally块还会执行吗?

        是的,至少在 sun/oracle jvm 上。虽然不漂亮..

        如果我写 System.exit (0);在 try 块结束时,finally 块还会执行吗?

        没有

        【讨论】:

        • @Andrey,这是一个不错的方法,但根据 javadoc,它提供了一个估计值,而不是大小。
        • @Alex Nikolaenkov 至少值得一提
        • @Andrey, @Alex:至少我们可以使用 getObjectSize(); 来说明对象的大小;
        【解决方案6】:

        Java 是否提供任何构造 找出物体的大小?

        不,它没有。

        给出一个最简单的方法来找出 方法执行所需的时间 不使用任何分析工具?

        long begTime = System.currentTimeInMillis();
        x.method();
        long endTime = System.currentTimeInMillis();
        System.out.println("method running time: " + (endTime-begTime));
        

        什么是检查异常和 运行时异常?

        必须捕获已检查的异常,否则编译器会标记;运行时异常不需要 catch 块。

        如果我在末尾写return try 阻塞,finally 阻塞 还执行吗?

        是的。

        如果我写 System.exit (0);在末尾 try 块的,finally 会不会 块仍然执行?

        没有。 http://download.oracle.com/javase/tutorial/essential/exceptions/finally.html

        【讨论】:

        • System.exit 不能保证运行。它可以被安全管理器取消,更一般地说,如果堆栈在溢出的一帧内,任何涉及方法调用的事情都可能失败。
        • 不是普通的情况,但你肯定是正确的。谢谢你的教育,迈克。
        【解决方案7】:

        1.

        不,一般不适用于对象。 .length 用于数组和字符串...

        2.

        final long startTime = System.nanoTime();
        final long endTime;
        try {
          methodToTime();
        } finally {
          endTime = System.nanoTime();
        }
        final long duration = endTime - startTime;
        

        来自How do I time a method's execution in Java?

        3.

        未经检查的异常是错误,请参阅 http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html

        检查的异常是例如无效的用户输入、可以处理的异常。

        4.

        finally 块仍然会执行

        5.

        finally 块不会执行

        【讨论】:

        • 如何使用.length 测量对象的大小。 java.lang.Object中没有这个字段。
        • 我认为 OP 追求比数组 .length 更通用的东西。
        • endTime 赋值放在finally 块中没有任何好处,因为除非methodToTime 正常完成,否则您不会使用它。
        【解决方案8】:

        (可序列化)对象的大小可以相对容易地找到。

        import javax.swing.*;
        import java.io.*;
        
        class HowLongIsAPieceOfString {
        
            public static int getObjectSize(Object object) throws IOException {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(baos);
                oos.writeObject(object);
                return baos.toByteArray().length;
            }
        
            public static void main(String[] args) throws IOException {
                Object object = "string";
                System.out.println( "String size: \t" + getObjectSize(object) );
        
                object = new JButton("Click Me!");
                System.out.println( "Button size: \t" + getObjectSize(object) );
        
                object = new JTree();
                System.out.println( "Tree size: \t" + getObjectSize(object) );
        
                object = new Object();
                System.out.println( "Object size: \t" + getObjectSize(object) );
            }
        }
        

        输出:

        String size:    13
        Button size:    4347
        Tree size:      5628
        Exception in thread "main" java.io.NotSerializableException: java.lang.Object
                at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
                ...
        

        【讨论】:

        • 这不是对象的大小,而是序列化形式的对象的大小。我认为这些值或多或少只对 DTO 和其他传输对象有效,而不是复杂的。它没有太多关于内存对象使用多少。
        猜你喜欢
        • 1970-01-01
        • 2022-12-15
        • 2015-03-07
        • 2018-05-15
        • 1970-01-01
        • 2013-10-08
        • 2015-08-18
        • 1970-01-01
        相关资源
        最近更新 更多