用于表明Java能力的问题

时间:2009-01-26 08:26:52

标签: java

作为Java的初学者,我想知道我在哪里学习(正确),我正在学习错误的东西,以及接下来要学习的东西。我发现我通过遇到无法立即解决的问题来学习最好,我需要做一些研究/学习来找出最佳解决方案,然后再研究下一个问题。然后我偶尔重复一遍陈旧的问题,直到他们进入我的长期记忆。

关于Stack Overflow的问题在这方面很有用,但是它们不是按照难度排序的,其中很多是关于某些特性的具体实现。

请回答此问题的问题(和合适的答案),这对任何试图提高他们的Java知识和经验的人都有用。我确信已发布的许多Stack Overflow问题都是合适的答案,在这种情况下,只需回复问题和原始问题的链接。还包括难度级别:低,中,高(也可能包括低中,高中)。

10 个答案:

答案 0 :(得分:6)

购买Effective Java的副本,并从封面到封面阅读。

定期阅读。

专注于诸如equals,hashcode,compareto methods之类的东西。

彻底了解馆藏api。

我意识到这并没有直接回答你的问题,但是(恕我直言)这是合理的建议!

答案 1 :(得分:4)

我不知道你是多少初学者以及你知道的其他语言,但在我看来,如果你真的不知道你遇到麻烦的java.util包。所以我的问题就是:

  1. LinkedList,ArrayList,Vector和数组之间的主要区别是什么?
  2. 您何时使用ArrayList以及何时使用Set?
  3. HashMap和TreeMap之间有什么区别?你何时会使用它们?
  4. 数目:

    1. 阵列不能增长,基本构建块也是如此。如果您正在编写自己的数据结构,并且确实需要恒定因子内存或CPU性能提升,那么它们可能很有用。除了Vector是同步的,ArrayList和Vector基本相同。使用ArrayList几乎总是会更好,如果你想让同步在更高的层次上考虑它。 ArrayList就像一个数组,除了它具有能够增长的好处,并且它可以被制作为通用的额外类型安全。 LinkedList是一种专门的数据结构,您不会经常使用它,但对队列等有用。
    2. 当您不想要重复元素但是排序不重要时,您将使用Set。当订购很重要并且您需要重复元素时,您将使用ArrayList。如果您关心订购和重复,那么LinkedHashSet是一个选项。
    3. TreeMap是Ordered,但是O(ln n)访问稍慢。 HashMap是无序的,但通常会稍微快一些。 TreeMap需要比较或元素是可比较的。 HashMap可能是您的默认选择。

答案 2 :(得分:3)

哦,我也喜欢:

想象一下,如果你把它放在一个类中:

public int hashCode() {
  return 1;
}

<强>问题:

  1. 这是合法的吗?
  2. 将这些对象放入地图会有什么影响?那张地图会起作用吗?
  3. 它会如何影响表现?
  4. <强>数目:

    1. 是的,它没有违反equals / hashCode合同,该合同规定如果两个对象相等,则它们必须返回相同的hashCode();
    2. 地图可以使用;
    3. 性能将为O(n),并且Map将像昂贵的List一样运行,因为所有内容都将存储在同一个存储桶中。

答案 3 :(得分:3)

看一下这个:JavaBlackBelt

答案 4 :(得分:2)

我喜欢:

这又是什么回报?

private int foo() {
  try {
    return 1;
  } catch (Exception e) {
    return 2;
  } finally {
    return 3;
  }
}

答案:3

答案 5 :(得分:2)

以下程序打印的内容是什么?

public class ReferencesArePassByValue
{
    public static void doSomething(Integer i)
    {
        i = new Integer(5);
    }

    public static void main(String[] args)
    {
        Integer value = new Integer(42);
        doSomething(value);
        System.out.println(value);      
    }
}

答案:42。

原因:在Java中,引用是按值传递的。

new Integer(42)中存储的value引用的副本将传递到doSomething方法。在doSomething方法中,i中存储的引用副本被丢弃,new Integer(5)的新对象引用被分配给i。请注意,此处仅抛出引用的副本。该方法仅接收到引用的副本,因此它不会影响main方法中的原始引用。

因此,对value方法中的main变量没有影响。 value变量保留对new Integer(42)的引用,因此程序的输出为42

这个话题似乎有很多误解。这是通过引用传递。事实上,Java中的所有内容,无论是基元还是引用,都是按方法传递给方法,而不是按引用传递。

相关问题和链接:

答案 6 :(得分:1)

Via:Ethan Nicholas的博客http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html

前段时间我正在面试高级Java工程师职位的候选人。在我提出的许多问题中,“你能告诉我哪些弱引用?”我没想到有关这个问题的详细技术论文。我可能会对“嗯......他们与垃圾收集有什么关系吗?”感到满意。我惊讶地发现,在二十多位工程师中,他们都拥有至少五年的Java经验和良好的资格,其中只有两人甚至知道存在弱的参考资料,而且这两个人中只有一人具有实际有用的知识关于他们。

答案 7 :(得分:0)

字符串的比较,取自javabeginner.com:

public class StringComparsion {

        public static void main(String[] args) {
            String name1 = "Bob";
            String name2 = new String("Bob");
            String name3 = "Bob";
            // 1st case
            if (name1 == name2) {
                System.out.println("The strings are equal.");
            } else {
                System.out.println("The strings are unequal.");
            }
            // 2nd case
            if (name1 == name3) {
                System.out.println("The strings are equal.");
            } else {
                System.out.println("The strings are unequal.");
            }
        }
    }

<强>答案: 首先比较不相等,第二个比较相等(只创建了一个静态字符串“Bob”,name1和name3都指向它)。

答案 8 :(得分:0)

您对Java中的已检查异常有何看法?有哪些优点和缺点?

我认为能够回答这样的问题表明你不仅仅是一个代码猴 - 你也有能力看到更大的情况。

答案 9 :(得分:0)

要正确学习编程语言,您需要编写代码。很多代码。

我建议你用Java中的Project Euler(http://projecteuler.net/index.php?section=problems)解决尽可能多的问题 - 每个困难都存在问题,只需要http://java.sun.com/docs/books/tutorial/提供的Java知识。

这使您对核心语言有了深入的了解。然后你可以开始挖掘你需要的其他东西 - 数据库访问(JDBC),GUI(Swing),web东西(servlets / jsp)或你有什么,加上所有“嘿这很奇怪”-stuff。

玩得开心 - 总有更多要学习:)