3、Google Guava类库中的Sets

  题目大意:
  这道题目不妥的地方在哪?
  a.不能编译
  b.没有问题
  c.可能造成内存溢出
  d.可能造成无限循环
  这个问题实际上并不特别需要关于Guava sets类库的专业知识,但却使绝大多数的开发者产生困惑。只有25%的参与者给出了正确的答案,和瞎选的正确率是一样的。
  那么我们能从这段代码中看出什么呢?我们有一个方法,它返回一个集合,这个集合包含了某个人的好友圈。方法中有一个循环,它检查一个person对象的bestfriend属性是否为null。如果不为null,则将bestfriend添加到results集合里。如果一个person对象确实有一个bestfriend,那么对这个person的bestfriend,重复执行上述过程,所以我们可以一直向bestfriend集合添加person对象,直到有一个person,它没有bestfriend,或者它的bestfriend已经在我们的result集合里了。后这部分有一点微妙,我们不能向这个Set集合添加重复的元素,即person对象,所以这个方法并不会导致无限循环。
  真正的问题在于,这段代码很有可能造成内存用尽的异常(out of memory exception)。这个循环实际上是没有边界的,所以我们可以不停地往set中添加person对象,直到内存用尽。
  顺便提一下,如果你想详细了解Google Guava,可以看看我们写的这篇博客: the lesser known yet useful features about it
  4、利用两个花括号进行初始化

  题目大意:这段代码错误的地方在哪?
  a.没有错误
  b.可能获得null值
  c.代码不能编译
  d.打印出不正确的结果
  这个问题是代码少的问题之一,但是足以迷惑绝大部分的开发者。这道题只有26%的答题者回答正确。
  很少有开发者知道这个初始化常量集合的简便语法,虽然这个语法会带来一些副作用。但事实上,这个语法鲜为人知未免不是一件好事。在感叹之后,你看到,我们往list里添加了一个元素,然后打印这个list。正常情况下,你期望看到打印的结果是[John],但是利用两个花括号进行初始化是有另一套初始化过程的。这里,我们用了一个匿名类来初始化一个List,当要打印NAMES时,实际上打印出来的是null,这是因为初始化程序尚未完成,此时的list是空的。
  关于使用两个花括号进行容器的初始化,可参考这里(right here)。
  5、对于运行时Map容器的离奇事件

  这是另一个社区贡献的问题,贡献者是来自以色列的Barak Yaish。只有27%的答题者能解答这个问题。
  题目大意:这段代码的输出是什么
  a.不能编译
  b.类型转换异常
  c.[] true
  d.[“bar”, “ber”]
  好吧,来看看代码。compute方法通过key在map中查找一个value。如果这个value是null,则插入(key, value),并返回value。因为开始时,这个list是空的,“foo”值并不存在,v是null。然后,我们向map中插入一个“foo”并且“foo”指向new ArrayList<Object>(),此时的ArrayList对象是空的,所以它打印出[]。
  下一行,“foo”键值存在于map容器中,所以我们计算右边的表达式。ArrayList对象成功转换为List类型,然后“ber”字符串被插入到List中。add方法返回true,因此true是第二行打印的内容。
  所以正确的答案是”[]true”。再次感谢Barak于我们分享这道题。
  鼓励一下:来看看简单的题吧

  题目大意:哪一种方法是初始化Java字符串简单的方式
  a.A
  b.没有一个
  c.C
  d.B和C不能编译
  现在,我们来看一下Peter Lawrey提供的问题。他工作于OpenHFT开源项目,同时也在Vanilla Java上撰写博客。Peter在StackOverflow上排名top 50,这一次他反过来向大家提问,76%的开发者能回答出这个问题。
  C答案比A简单,B和D是不能编译的。
  结论
  我们有时喜欢做这样的小测验来加深我们对Java知识的理解。但是,你是否发现自己的代码库中也有这样或那样类似小测验的问题使自己困惑,常常需要花许多时间来维护,这样的话可能并不好。特别是在半夜时,你接到一个电话,让你去解决一个严重的产品错误。对于这种情况,我们开发了Takipi这个Java工具。Takipi是一个Java代理,它能在生产环境下追踪未捕获的异常、捕获异常以及记录服务器上的错误日志。使用这个工具,你可以在堆栈中看到引发异常的变量值,然后在你的代码中修改它们。