Java

雇佣 排名前3% of 自由Java开发人员

PT视讯是顶级Java开发人员的市场, 工程师, 程序员, 程序员, 架构师, 和顾问. 顶级公司和初创企业选择PT视讯的Java自由职业者来完成关键任务的软件项目.

无风险试验,满意才付款.

客户的速度 PT视讯 Java开发人员4.4 / 5.0截至2021年12月16日,平均有888条评论

被领先品牌和初创公司所信赖

雇佣自由Java开发人员和工程师

Radek奥斯托夫斯基

自由Java开发人员

澳大利亚2014年7月25日起在PT视讯担任自由Java开发人员

Radek是PT视讯区块链认证工程师,对以太坊和智能合约特别感兴趣. 在菲亚特领域,他在大数据和机器学习项目方面经验丰富. 他在两个不同的国际IBM Apache火花竞赛中获得了三次冠军, PlayStation 4后台的共同创造者, 一个成功的黑客马拉松选手, 并在澳大利亚的会议上发言, 波兰, 和塞尔维亚.

显示更多

Rizwan Rizvi

自由Java开发人员

美国2018年5月21日起成为PT视讯的自由Java开发人员

Rizwan以通过清晰的思维克服复杂的挑战而闻名, 创新的方法, 加强组织不同部门之间的沟通. 在他的整个职业生涯, 他优化了多样化和分散的IT专业团队的工作,并始终如一地在具有挑战性的环境中交付有利可图的项目.

显示更多

詹姆斯Sorce

自由Java开发人员

美国2018年8月8日起成为PT视讯的自由Java开发人员

詹姆斯有着长期的职业生涯,为解决具有挑战性的问题提供技术解决方案. 软件工程是他的手艺, 并不断学习,不断提高工作质量. 他过去的雇主和同事都很看重James,因为他能够快速理解问题领域, 感谢他清晰而开放的沟通, 以及及时生产, 组织良好的技术解决方案.

显示更多

克劳迪奥·阿尔达纳

自由Java开发人员

美国2018年6月15日起在PT视讯担任自由Java开发人员

克劳迪奥是一位经验丰富的IT专家,专注于业务成果, 还有扎实的工程背景. 他运用数据科学来优化客户满意度, 产品个性化, 和客户流失. 克劳迪奥还是一名经过认证的分享Point专家,曾与微软的知名客户合作, 帮助他们最大化安全, 性能, 和可用性.

显示更多

丹·科兹洛夫斯基

自由Java开发人员

美国2019年7月8日起成为PT视讯的自由Java开发人员

Dan已经是技术领域的专家25年,并与几家大公司合作, 甲骨文公司等, 埃森哲咨询公司, 和初创公司. 他也有机会发展自己的事业. 他最近的技术重点是电子商务、全栈web开发和DevOps. 在他的职业生涯中,Dan有很多机会为客户设计并提供大规模的解决方案,同时始终与技术保持接触.

显示更多

基思·埃文

自由Java开发人员

美国自2019年2月16日起成为PT视讯的自由Java开发人员

Keith在IT行业拥有近40年的经验,其中有20多年的经验, 使用Oracle数据库和Oracle eBusiness Suite进行设计和开发. 他还在Oracle Open World和Oracle应用程序用户组会议上发表过演讲. Keith做出了个人贡献,以及管理多达10种资源的岸上/离岸团队. Keith非常注重细节,总是提供高质量的产品.

显示更多

Viacheslav Zhenylenko

自由Java开发人员

美国自2019年4月29日起成为PT视讯的自由Java开发人员

Viacheslav在数据科学和软件工程方面有7年的经验. 他对从原始数据中获得的见解充满激情,并喜欢将其转化为非凡的业务价值. 他的主要专业知识是Python,有Java和c++的生产经验. 他应用了计算机视觉等先进的机器学习技术, NLP, 产品推荐系统, 网络数据, 和经典的数据科学,以解决数据繁重的项目.

显示更多

亚历克斯·冈萨雷斯

自由Java开发人员

美国自2019年2月25日起成为PT视讯的自由Java开发人员

Alex拥有超过十年的软件开发经验,尤其是web和移动应用程序. 他曾为包括AT在内的公司领导互动项目的开发&T, EMC, 传奇影业, 惠普, Foundation Capital, 加州大学洛杉矶分校, 阿纳海姆鸭子, 和LA18电视. 他开发的应用程序曾出现在TechCrunch和iPod广告中. Alex毕业于加州大学伯克利分校,获得应用数学学位.

显示更多

乔治Linut

自由Java开发人员

罗马尼亚2018年10月2日起成为PT视讯的自由Java开发人员

George是一名软件工程师,他将按时并在预算范围内构建您想要的产品. 他参与了多个行业的项目, 从大众汽车集团基于云的汽车经销商管理系统到微软的CosmosDB浏览器. George也是一位经验丰富的面试官,参加过近100场面试,在数据结构和算法方面有很强的背景.

显示更多

肯•霍夫曼

自由Java开发人员

美国2018年7月20日起成为PT视讯的自由Java开发人员

Ken拥有超过20年的独立承包商经验,为客户提供应用程序开发服务. 在过去的12年里,他开发了应用程序 .网络平台. Ken提供增值解决方案和完成项目的动机为他赢得了客户的尊重, 导致长期的关系.

显示更多

约瑟夫·麦克纳尔蒂

自由Java开发人员

美国2017年12月20日起成为PT视讯的自由Java开发人员

Joseph具有很强的领导能力,在软件工程方面有着丰富的经验——专攻航空航天领域的关键任务系统, 国防, 和电信领域. 他拥有超过20年的使用各种技术设计和开发复杂的企业web应用程序的经验, 最近使用ASP.净 MVC.

显示更多

现在就注册看看更多的资料.

开始招聘

招聘指南

雇佣优秀Java开发人员指南

掌握Java是一个不小的壮举. 它广泛的类库包含大量的功能和细微差别, 大多数开发者都忽略了这一点. 那些掌握了该语言的人可以对您的团队的生产力和系统的性能产生显著的积极影响. 以下是一些有针对性的问题,可以帮助你找到真正精通这门语言的人.

阅读招聘指南

Java招聘资源

Trustpilot
媒体报道

... 允许公司快速组建具有特定项目所需技能的团队.

尽管对编码员的需求不断增长,PT视讯却以其几乎达到常春藤盟校(Ivy league)水平的审核而自豪.

我们的客户
创建一个跨平台应用,供全世界使用
蒂埃里Jakicevic
创建一个跨平台应用,供全世界使用
奖状

如果没有PT视讯, Tripcents就不会存在. PT视讯 Projects让我们的基金会在产品经理的帮助下快速发展, 带领开发人员, 和高级设计师. 在60多天的时间里,我们从概念到Alpha. 它的速度、知识、专业技能和灵活性是首屈一指的. PT视讯团队和其他内部团队成员一样,都是tripcents的一部分. 他们和其他人一样为开发做出了贡献并获得了所有权. 我们将继续使用PT视讯. 作为一个创业公司,它们是我们的秘密武器.

首席执行官Brantley步伐 & 联合创始人

Tripcents

我对PT视讯的经验非常满意. 和我一起工作的专业人士在几个小时内就和我通了电话. 在和他讨论了我的项目后,我知道他是我想要的候选人. 我立刻雇佣了他,他也立刻参与了我的项目, 甚至通过添加一些很棒的设计元素来增强我们的整体外观.

导演保罗•Fenley

K邓恩 & 的同事

与我搭档的开发人员都非常出色——聪明、有动力、反应灵敏. 过去很难找到高质量的工程师和顾问. 现在不是.

瑞安·洛克菲勒,首席执行官

Radeeus

PT视讯立即理解了我们的项目需要. 我们请来了一位来自阿根廷的优秀自由职业者, 从第一天起, 投身于我们的行业, 与我们的团队完美融合, 理解我们的愿景, 并产生了一流的结果. PT视讯使得与高级开发人员和程序员的联系非常容易.

Jason Kulik创始人之一

ProHatch

作为一家资源有限的小公司,我们不能犯代价高昂的错误. PT视讯为我们提供了一个经验丰富的程序员,他能够立即投入工作并开始贡献. 这是一个伟大的经历,我们会在心跳中再次重复.

斯图尔特·柏克尼校长

站点专用软件解决方案

我们通过PT视讯聘请了一位拥有丰富亚马逊网络服务经验的开发人员. 我们面试了四位候选人,其中一位非常符合我们的要求. 这一过程迅速而有效.

Abner Guzmán Rivera,首席技术官和首席科学家

照片Kharma

Sergio是一个非常棒的开发者. 一流,反应灵敏,工作效率高.

Dennis Baldwin,首席技术专家和联合创始人

PriceBlink

和Marcin一起工作是一种乐趣. 他是主管, 专业, 灵活的, 并且非常快地理解需要什么以及如何实现它.

Andre Fischer首席技术官

POSTIFY

我们需要一位专业的工程师,他能立即开始我们的项目. Simanas的工作超出了我们的预期. 不需要面试和寻找专业的开发人员是一个非常好的时间节省,并使每个人对我们选择转换平台以使用更健壮的语言感到更舒服. PT视讯让这个过程变得简单和方便. PT视讯现在是我们寻求专家水平帮助的第一个地方.

Derek Minor,网络开发高级副总裁

Networld传媒集团

PT视讯的开发人员和架构师都非常专业,也很容易共事. 他们所提供的解决方案价格合理且质量上乘,从而缩短了我们的发行时间. 再次感谢,PT视讯.

首席执行官杰里米鞋号

Kognosi

PT视讯给我们带来了很棒的体验. 他们为我们的应用程序匹配了完美的开发人员,使这个过程非常容易. 它也很容易超出最初的时间框架, 我们能够在整个项目中保持同一个承包商. 我们强烈推荐PT视讯快速无缝地寻找高质量人才.

瑞安莫首席技术官

应用商业技术有限公司

PT视讯给我留下了深刻印象. 我们的开发人员每天都和我交流,他是一个非常强大的程序员. 他是一个真正的专业人士,他的作品非常出色. PT视讯 5星.

首席执行官皮特Casoar

Ronin Play Pty Ltd

与PT视讯合作是一次很棒的经历. 使用它们之前, 我花了很长时间采访其他的自由职业者,却没有找到我需要的. 在与PT视讯接触后,他们在几天内就为我找到了一个完美的开发者. 与我一起工作的开发人员不仅交付高质量的代码, 但他也会对一些我没有想到的事情提出建议. 我很清楚阿莫里知道他在做什么. 强烈推荐!

首席执行官乔治•程

Bulavard公司.

作为一名合格的PT视讯前端开发人员,我还经营着自己的咨询业务. 当客户来找我帮忙填补他们团队中的关键角色时, PT视讯是我唯一放心推荐的地方. 托普塔尔的所有候选人都是精英中的精英. PT视讯是我在近五年的专业在线工作中发现的最物有所值的.

伊桑•布鲁克斯首席技术官

Langlotz专利 & 商标工作的公司.

在讨价还价早期, 我们需要一流的开发人员, 以可承受的利率, 及时地. PT视讯交付!

首席执行官劳拉Aldag

讨价还价

PT视讯让你非常容易找到一个候选人,并让你放心,他们有能力提供. 我肯定会向任何寻找高技能开发人员的人推荐他们的服务.

Michael Gluckman,数据经理

Mxit公司——

PT视讯能够迅速将我们的项目与最优秀的开发人员匹配起来. 开发人员已经成为我们团队的一部分, 我对他们每个人所表现出的敬业程度感到惊讶. 对于那些希望与最好的工程师远程工作的人来说,PT视讯是最好的选择.

创始人Laurent爱丽丝

Livepress

PT视讯让找到合格的工程师变得轻而易举. 我们需要一个有经验的ASP.净 MVC架构师来指导我们的初创应用程序的开发, PT视讯在不到一周的时间里就有了三个很好的候选人. 在我们做出选择后,工程师立即上线并开始工作. 这比我们自己发现和审查候选人要快得多,也容易得多.

联合创始人杰夫•凯利

协同解决方案

我们需要一些短期的Scala开发工作,PT视讯在24小时内就为我们找到了一个优秀的开发人员. 这是任何其他平台都不可能实现的.

弗兰科斯巴达,创始人之一

WhatAdsWork.com

PT视讯为快速发展和规模化的企业提供了不妥协的解决方案. 我们通过PT视讯聘请的每一位工程师都迅速融入了我们的团队,在保持卓越开发速度的同时,他们的工作达到了最高的质量标准.

联合创始人格雷格•金博

nifti.com

如何通过PT视讯招聘Java开发人员

1

与我们的行业专家之一谈谈

PT视讯的工程总监将与您一起工作,以了解您的目标, 技术需求, 和团队动力.
2

与精心挑选的人才一起工作

几天之内,我们将为您的项目介绍合适的Java开发人员. 平均匹配时间在24小时以下.
3

合身,保证

与您的新Java开发人员一起工作一段试用期(只有满意才付款), 在订婚前确保他们是合适的人选.

常见问题

  • PT视讯的Java开发者有何不同?

    在PT视讯, 我们彻底筛选我们的Java开发人员,以确保我们只匹配您的人才的最高水平. 超过100个,每年有1万多人申请加入PT视讯网络, 只有不到3%的人能成功. 你将与工程专家(而不是一般化的招聘人员或人力资源代表)一起工作来理解你的目标, 技术需求, 和团队动力. 最终的结果是:专家从我们的网络中审查人才,定制匹配,以满足您的业务需求. 现在就开始.

  • 我可以通过PT视讯在48小时内雇佣Java开发人员吗?

    这取决于可用性和进度的快慢, 你可以在注册48小时内开始与Java开发人员合作. 现在就开始.

  • PT视讯 Java开发人员的无风险试用期是什么时候?

    我们确保您和您的Java开发人员之间的每一次接触都始于长达两周的试用期. 这意味着您有时间确认订婚是否成功. 如果你对结果完全满意的话, 我们将按时间向你收费,你们的婚约想继续多久就继续多久. 如果你不完全满意,你不会被收费. 从那里, 我们有两种选择, 或者我们可以为您提供另一位可能更适合的专家,我们将与他开始第二个, 无风险试用. 现在就开始.

分享
Java

如何雇佣优秀的Java开发人员

所面临的挑战

今天,在它首次发布近20年后,Java被报道成为 最需要的语言技能,并且有很大的优势(是排名第二的PHP的两倍).

随着Java应用程序的使用越来越普遍, 简历上有Java的开发人员可不少. 但是和其他技术一样,我们需要了解Java,然后 真的 了解Java. 那么,如何才能确定谁是真正的Java开发专家呢?

Java掌握, 就像生活中的许多技能一样, 需要时间和健康的好奇心来充分利用它的力量. 因此,正如我们在文章中描述的那样 寻找少数精英, an effective recruiting process needs to evaluate many dimensions of a c和idate beyond just technical knowledge; attributes such as drive, 完整性, 创造力同样是优秀软件开发人员的基本特征. 然后可以用问题(如本文中所介绍的问题)来增强对候选人的评估,以帮助确定哪些人是真正的高质量Java专家.

评估的基础

我们从一些问题开始,这些问题可以帮助评估候选人对一些基本Java范例和概念的理解深度.

问:什么是匿名类? 什么时候,为什么,以及如何使用它们? 提供一个例子.

匿名类是内联表达式, 为了方便,通常是一次性使用类, 这有助于使您的代码更简洁. 下面的示例实例化一个new ActionListener 处理与按钮相关的事件:

button.addActionListener(新ActionListener () {
    public void actionPer为med(ActionEvent e) {
        /*响应按钮动作事件*/
    }
});

这是有意义的,因为类没有在其他地方使用,也不需要名称. 然而, 如果您将匿名类传递给注册方法, 例如, 您可能需要跟踪它的引用, 以便以后能够注销它. 让我们扩展上面的例子来证明这一点:

ActionListener listener = new ActionListener() {
    public void actionPer为med(ActionEvent e) {
        /*响应按钮动作事件*/
    };
button.addActionListener(听众);

/*一段时间后... */

button.removeActionListener(听众);

什么是抽象类? 什么时候,为什么,以及如何使用它们? 提供一个例子.

抽象类 对于定义具体子类必须实现的抽象模板方法有用吗. 因此,所有具体的子类都保证遵守由继承它们的抽象类中的抽象方法指定的API. 这在某种程度上类似于Java 接口 为所有实现它的类指定一个API.

常见的用例是一类具有共同行为的对象.g., 所有形状都有一个区域), 但是计算或执行这些函数的细节因对象的不同而不同. 例如:

 抽象类Shape {
     公共抽象双区域();
 }
 
 公共类圆扩展形状{
     私人双半径;
     
     公共圆(双半径){
         这.半径=半径;
     }
     public 双 是a() {return Math.π*数学.战俘(这.radius,2); }
 }
 
 公共类矩形扩展形状{
     私人双宽、高;
     
     公共矩形(双宽,双高){
         这.宽度=宽度;
         这.身高=身高;
     }
     Public 双 是a() {return 这.*这个宽度.height; }
 }

有几件事值得注意:

  • 抽象类 may 不 be instantiated directly; only 的ir concrete subclasses 是 instantiable.
  • 一个类可以被声明为抽象的,即使它没有抽象方法. 这将阻止该类被实例化. 这很有用, 例如, 如果类层次结构中的基类没有抽象方法,但本身并不意味着要实例化.

Q:比较并对比已检查的异常和未检查的异常. 提供的例子.

未经检查的异常 例外情况是 被认为是可恢复的. Java不会因为它们表示异常而强迫您捕获或处理它们, 代码中的意外问题,例如 NullPointerException, ArithmeticExceptionIndexOutOfBoundsException. 也就是说,这些都是需要解决或预防的问题. 所有派生的未经检查的异常 RuntimeException.

已检查的异常 是例外, 被认为是可恢复的. 已检查的异常 must explicitly be specified as part of a method’s API; that is, 可能抛出一个或多个受控异常的方法必须将这些潜在异常列出来作为其方法声明的一部分(Java编译器实际上会强制执行这一点).

当调用抛出异常的方法时,调用者必须处理(i.e., catch)那些异常,或者必须自己抛出它们. 例如, 如果方法抛出一个已检查异常, 调用者可能决定忽略错误并继续(吞下它), 向用户显示对话框, 或者重新抛出异常,让调用链中较高层的方法处理它(在这种情况下,它还必须声明它抛出了已检查的异常).

例如:

public void readFile(File File) throws IOException, MyReadFileException {
    尝试{
        FileInputStream fis = new FileInputStream(file);
    } catch(FileNotFoundException e) {
        //我们捕获FileNotFoundException并抛出一个IOException,
        //所以我们没有在上面的“throws”子句中包含FileNotFoundException. 
        把新IOException ();
    }
    
    如果(somethingBadHappened) {
        //我们在这里显式抛出MyReadFileException,
        //所以我们在上面的“throws”子句中包含了它.
        把新MyReadFileException ();
    }
}

被检查的异常清楚地传达和执行错误条件的处理. 然而,对于开发人员来说,不断地需要包含它也是一件痛苦的事情 try / catch 块来处理它们调用的方法中的所有已知异常. 尽管Java中肯定允许有许多受控异常, 事情可能会变得有点笨拙. 例如:

void sillyMethod()抛出DataFormatException, InterruptedException, 
	IOException, SQLException, Time出Exception, ParseException {
...
}

因此,已经有了 激烈的辩论 例如,在编写库时是使用检查异常还是未检查异常的问题上,我们已经研究了好几年. 正如许多这样的辩论一样, 事实是,真的没有放之四海而皆准的方法, 全面正确的答案. 检查异常和未检查异常各有其优点和缺点, 因此,使用哪种语言在很大程度上取决于情况和语境.

Q:描述Java中的泛型,并提供泛型方法和类的例子.

Java 泛型 允许程序员指定, 用一个方法或类声明, 可应用于多种不同数据类型的功能. 泛型还提供了编译时类型安全,允许Java编程专家在编译时捕获无效类型.

例如,这里是一个 泛型方法 使用 作为泛型类型的占位符:

public  void printArray( E[] inputArray ) {
    //显示数组元素              
    为 (E元素:inputArray) {        
        系统.出.Printf ("%s ",元素);
    }
    系统.出.println ();
}

的 above method could 的n be invoked with various types of arrays 和 would h和le 的m all appropriately; e.g.:

//使用Double数组调用printArray方法
Double[] 双Array = {1.1, 2.2, 3.3, 4.4 };
printArray (双Array);

//调用带有字符数组的printArray方法
字符[]字符Array ={‘H’,‘E’,‘L’,‘L’,”O '};
printArray (字符Array);

有时, 虽然, 当您希望限制允许传递给泛型类型参数的类型类型时. 例如, 对数字进行操作的方法可能只希望接受Number或其子类的实例. 这是在通用中使用 有界的类型参数,它列出类型参数的名称,后面跟着 扩展 关键字. 例如:

//确定三个可比对象中最大的一个
public static > T maximum(T x, T y, T z) {                      
  T max = x; // as总和e x is initially 的 largest       
  如果(y.comp是To( max ) > 0 ) {
     max = y; // y is 的 largest so far
  }
  如果(z.comp是To( max ) > 0 ) {
     max = z; // z is 的 largest now                 
  }
  return max; // returns 的 largest object   
}

与泛型方法一样,类的类型参数部分 泛型类 是否可以使用逗号分隔一个或多个类型参数. 例如:

public class Cell {
  私人T val;

  public void set(T val) {这.val = val; }

  public T get() { return val; }

  public static void main(字符串[] args) {
     Cell<整数> integerCell = new Box<整数>();
     Cell<字符串> stringCell = new Box<字符串>();
    
     integerCell.(新添加整数(10));
     stringCell.add(新的字符串(“Hello World”));

     系统.出.printf(“整型值:%d\n\n”,integerCell.get ());
     系统.出.printf("字符串 Value:%s\n", stringCell . str ("字符串 Value:%s\n").get ());
  }
}

问:什么是多重继承? 它有哪些潜在的问题?为什么Java传统上不支持它? 随着Java 8的发布,这种情况发生了什么变化?

多重继承 一个对象或类可以从多个父对象或父类继承特征和特性的面向对象计算机编程语言的特性. 它不同于单一继承, 一个对象或类只能继承一个特定的对象或类.

在Java 8之前,Java只支持单继承. 我们将很快讨论Java 8对多继承的准支持, 但首先让我们了解多重继承会导致什么问题,以及为什么在Java中如此避免多重继承.

反对多重继承的主要理由是复杂性, 和潜在的歧义, 它可以引入. 最典型的例子就是常被引用的“钻石问题”。, 类B和C继承自类A, 类D继承了类B和类C. 如果在a中有一个方法同时被B和C覆盖,就会出现歧义. If D 做 不 override it, 的n which version of 的 method 做 it inherit; that of B, or that of C?

让我们考虑一个简单的例子. 一所大学有附属于它的人. 一些是学生,一些是教师,一些是行政人员,等等. 所以一个简单的继承方案可能有不同类型的人在不同的角色, 它们都继承自一个共同的“Person”类. Person类可以定义一个抽象 getRole () 方法,然后被它的子类重写,以返回正确的角色类型I.e.:

但是现在如果我们想要塑造一个助教的角色会发生什么呢? 一般来说,助教就是 这两个 一个研究生 一名教员. 这就产生了多重继承的经典菱形问题,并导致了关于TA的歧义 getRole () 方法:

(顺便说一下, 注意上面的继承图的菱形, 这就是为什么这个问题被称为"钻石问题".)

哪一个 getRole () 实现应该由TA继承? 教员或研究生的学位? 简单的答案可能是让TA类重写 getRole () 方法并返回新定义的角色“TA”。. 但这个答案也是不完美的,因为它会掩盖一个事实,即TA是, 事实上, 既是教师又是研究生. 有多种设计方法和模式可以在没有多重继承的情况下解决这种类型的情况, 这就是为什么有些语言(Java就是其中之一)决定简单地避开多重继承.

Java 8, 然而, 通过允许在接口上指定默认方法(在Java 8之前),引入了对多继承的准支持形式, 只有方法签名, 没有方法定义, 接口允许). 因为Java 允许一个类实现多个接口(而一个类只能扩展一个父类), Java 8允许在接口中定义方法,这第一次在Java中引入了潜在的菱形问题.

例如, 如果一个, B, 和C是接口, B和C可以各自为a的抽象方法提供不同的实现, 导致任何实现B和C的类D出现菱形问题. 任何一个类D都必须重新实现方法(类的主体可以简单地将调用转发到其中一个超实现), 否则,歧义将作为编译错误被拒绝.

美食Java

在这里,我们将介绍一些更高级的概念和问题,这些概念和问题是主流Java程序员应该熟悉的.

Q:如何使用外部条件变量可靠地退出线程?

有时,开发人员希望在外部条件为真时终止线程. 考虑下面的例子 公共汽车 线程继续无限地驱动,直到 pleaseStop 变量变得真实.

布尔 pleaseStop = 假; // 的 公共汽车 pull cord.

public void pleaseStop的Bus() {
    pleaseStop = 真正的;
}

public void start的Bus() {
    新线程(“公共汽车”){
        Public void run() {
            //无限驱动公共汽车.
            而(!pleaseStop) {
                //花点时间开车到下一站.
            }
            pleaseStop = 假; // Reset pull cord.
        }
    }.开始();
}

看起来简单. 然而, Java不保证线程边界之间隐式的变量同步, 因此,不能保证这个线程可靠地退出, 这让经验不足的Java开发人员感到困惑.

要让上述代码正常工作,需要按照如下方式同步线程:

volatile 布尔 pleaseStop = 假; // 的 公共汽车 pull cord.
Object driver = new Object(); // We can synchronize on any Java object.

public void pleaseStop的Bus() {
	//在线程1中,同步驱动对象
    同步(司机){
        pleaseStop = 真正的;
    }
}

public void start的Bus() {
    新线程(“公共汽车”){
        Public void run() {
            //无限驱动公共汽车.
            而(真){
				//在“线程2”中,也同步驱动程序对象
                同步(司机){
                    如果(pleaseStop) {
                        pleaseStop = 假; // Reset pull cord.
                        return; // Bus stopped.
                    }
                }
                //花点时间开车到下一站.
            }
        }
    }.开始();
}

问:如何 有问题,如何避免它的陷阱?

首先, 往往是模糊的. 它可以用来表示成功或失败. 或者它可以用来表示没有值. 或者在某些情况下,它可能是一个有效的值.

即使有人知道这是什么意思 在特定的上下文中, 如果不幸的开发人员在取消引用之前忘记检查它,它仍然会引起麻烦, 从而引发了 NullPointerException.

避免这些问题的最常见和有效的技术之一是 使用有意义的非空默认值. 换句话说,就是要避免使用 尽你所能. 避免将变量设置为 并避免返回 只要可能,从方法(e.g.,返回空列表而不是 ).

在…之外,如 JDK 8, Java已经引入了对 可选 类(或者如果您正在使用Java的早期版本,则可以使用 可选 类的 番石榴库. 可选 用一个值表示和包装缺席和存在. 而可选则增加了一些 仪式 ,通过强制您展开 可选 以获得非 值,它避免了否则可能导致的结果 NullPointerException.

问:什么是“拳击”,需要注意的问题是什么?

Java的基本类型是 , int, , 浮动, , 字符, 字节布尔. 通常,我们希望将原始值作为对象存储在各种数据结构中,这些数据结构只接受诸如此类的对象 ArrayList, HashMap等. 所以Java引入了“装箱”的概念,它将原语打包成对象类的等量, e.g., 整数int, 浮动浮动, 布尔的 布尔. 当然, 作为对象, 它们导致了对象分配的开销, 内存膨胀和方法调用, 但它们确实以一些代价达到了目的.

“自动装箱”是编译器将原语自动转换为装箱对象,反之亦然. 这只是个方便,e.g.:

ArrayList<整数> 整数 = new ArrayList<整数>();

/ /自动装箱.  编译器自动将“35”转换为一个框起来的整数.
整数.添加(35); 

//因此上面的语句等价于.(新添加整数(35));

尽管他们方便, 虽然, 盒装对象因引入粗糙的bug而臭名昭著, 特别是对于缺乏经验的Java开发人员.

首先,考虑一下:

系统.出.println(新的整数(5) == 新的整数(5));   // 假

在上面的代码行中,我们比较 身份 两个整数对象. 因为每一 新的整数(5) 创建一个新对象,1 新的整数(5) 不等于另一个 新的整数(5).

但更令人不安的是以下看似无法解释的区别:

系统.出.println(整数.返回对象的值(127)= =整数.返回对象的值(127));   // 真正的
系统.出.println(整数.返回对象的值(128)= =整数.valueOf(128));   // 假

哈? 怎么会这样呢 真正的 另一个是 ? 这好像说不通啊. 事实上,答案相当微妙.

正如一个容易被忽视的解释 请注意 在Javadoc中 整数 类, 返回对象的值() method method缓存整数对象,取值范围为-128 ~ 127, 包容, 也可以缓存此范围之外的其他值. 因此,一次调用返回的整数对象 整数.返回对象的值(127) 匹配由另一个调用返回的整数对象 整数.返回对象的值(127),因为它是缓存的. 但在-128到127的范围之外, 整数.返回对象的值() 调用, 即使价值相同, 不一定返回相同的整数对象(因为它们不一定被缓存).

还需要注意的是,使用装箱对象的计算时间大约是使用原语的6倍, 以下的基准测试代码证明了这一点:

空白总和 () {
	长 总和 = 0L; // Swap "长" 为 "长" 和 speed dramatically improves.
	为 (长 i = 0; i <= 整数.MAX_VALUE; i++) {
		+ =我总和;
	}
}

执行上面的代码 总和 声明为 用了6547ms而同样的代码 总和 声明为 (i.e.仅用了1138ms.

问:什么是类型擦除?

在语言中添加泛型并不是没有问题的. Java泛型的一个特别棘手的问题是 类型擦除.

例如,考虑下面的代码片段:

List<字符串> a = new ArrayList<字符串>();
List<整数> b = new ArrayList<整数>();
返回一个.getClass () = = b.getClass();  // returns 真正的??!!

这应该会返回 ab 是否有不同的类类型(i.e., ArrayList<字符串> vs. ArrayList<整数>),但它又回来了 真正的. 为什么?

这里的罪魁祸首是类型删除. 一旦上面的代码通过了所有Java编译器验证,编译器就 擦除字符串整数 类型,以保持与旧jdk的向后兼容性. 因此,上面的代码被Java编译器转换为以下代码:

List a = new ArrayList();
List b = new ArrayList();
返回一个.getClass () = = b.getClass();  // returns 真正的 (underst和ably)

因此,在编译后的代码中, ab 两者都是简单的无类型吗 ArrayList 对象,还有其中一个是 ArrayList<字符串> 另一个是 ArrayList<整数> 如有遗失. 尽管在实践中,类型擦除相关的问题很少会给开发人员带来问题, 这是一个需要注意的重要问题,在某些情况下可能会导致非常棘手的bug.

问:描述观察者模式以及如何在Java中使用它. 提供一个例子.

观察者模式 允许对象注册,以便在对象发生变化时接收来自观察对象的通知. Java对 可观测的 类和 观察者 接口.

下面是一个简单的实现可观察对象的例子:

公开课暴露狂{
	My可观测的 = new My可观测的();

	公共裸露癖(){}

	公共java.跑龙套.可见get可观测的 () {
		返回my可观测的;
	}

	private void trigger(字符串 condition) {
		my可观测的.无效();
		my可观测的.不ify观察者s(条件);
	}

	private类My可观测的扩展了java.跑龙套.可观测的{
		Private void invalidate() {
			setChanged ();
		}
	}
}

这是一个相应的观察者的例子:

公共类Voyeur实现观察者{

	公众偷窥狂(暴露狂){
		//注册我们对裸露者感兴趣.
		喜欢出风头的人.get可观测的 ().add观察者(这个);
	}
	
	@Override
	public void update(可观察对象){
		//当可观察对象通知其被观察对象时调用.
		系统.出.println(参数.to字符串 ());
	}
}

但是使用这个方法也有一些缺点:

  1. 被观察的类必须扩展 可观测的 从而阻止它扩展更理想的类(请参阅我们之前关于 多重继承)
  2. 观察类和观察者类是紧密耦合的,导致了潜在的 NullPointerException如果你不小心的话.

为了避免第一个问题,高级开发人员可以使用代理(委托) 可观测的 对象而不是扩展它. 要解决第二个问题,可以使用松散耦合的发布-订阅模式. 例如,您可以使用谷歌的Guava库 EventBus 对象连接到中间人的系统.

Q:描述Java中的强引用、软引用和弱引用. 什么时候,为什么,以及如何使用它们?

在Java中,当你分配一个新对象并将它的引用(简单的指针)赋给一个变量时,一个 强引用 is created by default; e.g.:

字符串 name = new 字符串(); // Strong reference

然而,在Java中有两个额外的引用强度,你可以显式地指定: SoftReferenceWeakReference引用. (实际上在Java中还有一个额外的引用强度,称为a PhantomReference. 这是很少使用的, 虽然, 即使是非常有经验和专注的Java开发人员也很可能不熟悉它, 所以我们在这里的讨论中省略它.)

为什么需要软引用和弱引用,它们什么时候有用?

Java的垃圾收集器(GC)是一个后台进程,它定期运行,从应用程序的内存堆中释放“死”对象(没有强引用的对象). 尽管GC有时给人的印象是一个神奇的黑盒, 其实也没那么神奇. 有时你必须帮助它防止内存被填满.

更具体地说, GC不会释放强引用对象链中的强可访问对象. 这仅仅意味着, 如果GC仍然认为需要一个对象, 它不去管它, 这通常是你想要的(i.e.,你不希望你需要的对象在GC启动时突然消失).

但有时强引用过于强,这时软引用和弱引用就派上用场了. 具体地说:

  • SoftReference 垃圾收集器根据内存需求自行清除对象. 软引用最常用于实现内存敏感的缓存.
  • WeakReference引用 对象并不会阻止它们的引用被设定为可终结的、终结的,然后被回收. 弱引用最常用于实现规范化映射.

总结

Java作为一种占主导地位的流行语言继续生存和繁荣. 但正如软件开发和应用程序开发中的任何语言所预期的那样,这些语言已经经历了多次迭代, 它有许多不是所有开发人员都熟悉的细微差别和微妙之处. 此外, Java能力的不断扩展需要大量的经验来充分理解. 因此,那些掌握了该语言的人可以对您的开发团队的生产力和系统的性能产生显著的积极影响, 可伸缩性, 和稳定性.

本文提出的问题和技巧可以帮助您识别真正的Java高手. 我们希望您在寻找高级Java开发人员中的精英时,能够发现它们是一个有用的基础,可以“区分优劣”. 然而,重要的是要记住,当您想要雇佣Java程序员时,这些只是作为一个工具,用于整合到您的整体招聘工具箱和战略的更大环境中.

(最后一点:如果你对Java感兴趣的是和roid移动应用程序, 我们建议您阅读我们的 安卓面试指南 也.)

精选的PT视讯 Java出版物

顶级Java开发人员需求量很大.

开始招聘