只需足够的Java for Hadoop

Nik*_*hil 33 java hadoop

我大约10年来一直是C++开发人员.我需要为Hadoop选择Java.我怀疑我会在Java中做任何其他事情.所以,我想要一个我需要拿起的东西列表.当然,我需要学习核心语言,但还有什么?

我为此做了谷歌,这可能被视为"我想学习Java的可能副本.请告诉我怎么样?" 但事实并非如此.Java是一种庞大的编程语言,有很多库,我需要学习的内容在很大程度上取决于我使用的Hadoop.但是我想有可能说不喜欢学习这个.这也非常有用.

kit*_*yst 49

在我的日常工作中,我花了一些时间帮助C++人员通过JNI(Java Native Interface)获取足够的Java来使用一些Java库,然后将内存共享到他们主要的C++应用程序中.以下是我注意到的一些关键事项:

  1. 没有IDE,您无法管理除玩具项目之外的任何事情.你应该做的第一件事是下载一个流行的Java IDE(Eclipse是一个很好的选择,但也有其他选择,包括Netbeans和IntelliJ).不要试图用vi/emacs和javac/make来管理.你将住在一个山洞里而没有意识到这一点.一旦你掌握了基本的IDE功能,你就会比没有IDE的情况下提高几十倍.
  2. 了解如何布局简单的项目结构和包.将有关于如何在Eclipse站点或其他地方执行此操作的简单演练.切勿将任何内容放入默认包中.
  3. Java有一个类型系统,由于历史/性能原因,引用和基元类型相对独立.
  4. Java的泛型是一样的C++模板.阅读"类型擦除".
  5. 您可能希望了解Java的GC的工作原理.只需谷歌"标记和扫描" - 首先,您可以选择最天真的心理模型,然后了解现代生产GC如何在以后执行此操作的详细信息.
  6. 应该毫不拖延地学习Collections API的核心.Map/HashMap,List/ArrayList&LinkedList和Set应该足够了.
  7. 学习现代Java并发.与java.util.concurrent中的一些很酷的东西相比,Thread是一个汇编语言级原语.学习ConcurrentHashMap,Atomic*,Lock,Condition,CountDownLatch,BlockingQueue和来自Executors的线程池.这里的好书是Brian Goetz和Doug Lea的好书.
  8. 只要您想使用第三方库,您就需要了解类路径的工作原理.这不是火箭科学,但它有点冗长.

如果你是一个低级别的C++人,那么你也可能会发现一些有趣的东西:

  1. 默认情况下,Java具有虚拟分派.Java方法上的关键字static用于表示类方法.私有Java方法使用invokespecial dispatch,它是对正在使用的确切类型的调度.
  2. 至少在Oracle VM上,对象包含两个标题的机器字(标记字和类字).标记字是VM使用的一堆标志 - 特别是用于线程同步.您可以将类词视为指向VM的Class对象表示的指针(这是方法的vtable所在的位置).类字后面是对象实例的成员字段.
  3. Java .class文件是一种中间语言,与x86对象代码不太相似.特别是.class文件有很多有用的工具(包括JVM附带的javap反汇编程序)
  4. 符号表的Java等价物称为常量池.它是打字的,它有很多信息 - 可以说比x86对象代码更相当.
  5. Java虚方法调度包括查找要在常量池中调用的正确方法,然后将其转换为偏移到vtable中.然后向上遍历类层次结构,直到在该vtable偏移处找到非null值.
  6. Java开始解释然后编译(无论如何,对于Oracle和其他一些VM).切换到编译模式是根据需要逐个方法完成的.在进行基准测试和性能调整时,您需要确保在启动之前已经预热了系统,并且通常应该在方法级别进行概要分析.所做的优化可能非常积极/乐观(如果违反了假设,则会进行检查和回退) - 因此,性能调整有点艺术性.

希望有一些有用的东西可以继续 - 请评论/询问后续问题.

  • IDE的事情让我感到很惊讶 - 团队是高级人员 - 大多数情况下都是10年以上 - 我不得不多次解释它.我会回来,他们已经退回到习惯使用emacs或vi.这就是我在答案中对此如此强烈的原因.他们花了一些时间才能获得语法突出显示,基本重构和其他简单的IDE功能,因为它不是C++中正常的开发实践.谢谢你的奖金. (5认同)

Edw*_*uck 17

学习"足够"Java正在学习Java.你要么学习所有的核心原则和语言设计决策,要么就是容易犯错误.考虑到您已经知道如何编程,可以掠过许多信息(着眼于它与您熟悉的其他语言的不同之处).

所以你需要学习:

  1. 如何开始
  2. 语言本身
  3. 核心,必不可少的课程
  4. 主要收藏

如果您没有适当的构建框架,那么如何打包已编译的代码.

除此之外,您可能需要学习的几乎所有其他项目在很大程度上取决于您打算做什么.不要忽视Oracle/Sun的在线教程,它们非常好(与其他在线教程相比).

  • 我同意这一点.如果您打算将JAVA用于任何事情(只需要hadoop),您将需要掌握java ecossytem的所有核心概念.接下来的问题是,很快你就需要掌握很多其他的东西,即使只是因为你真正想要实现的东西而已.你可以回过头来讨论另一个问题,或者看看JEE和Spring(这是Java上最广泛使用的2个企业框架). (2认同)

war*_*ren 12

Hadoop可以在C++中使用C++:WordCount示例

  • 我知道.这不回答我的问题. (7认同)

Mic*_*rdt 7

如果不了解标准API中的这些包,就无法真正使用Java:

java.lang
java.util
java.io
Run Code Online (Sandbox Code Playgroud)

并且,在较小程度上:

java.text
java.math
java.net
java.lang.reflect
java.util.concurrent
Run Code Online (Sandbox Code Playgroud)

它们包含了许多你需要经常用于任何应用程序的类,并且最好仔细查看它们,直到你知道它们包含哪些类以及哪些类是有用的,以免你最终重新发明轮子.


Her*_*che 7

  • 放轻松,如果您已经了解C++,那么学习Java可能会愉快而快速

    买这两本书:

    1. JavaTM编程语言,(第4版)Ken Arnold,James Gosling,Davis Holmes
    2. 有效的Java(第2版),Joshua Bosh

你很快就会掌握Java,你不会后悔的.祝好运.