Toptal是面向顶级Java开发人员的市场, engineers, programmers, coders, architects, and consultants. Top companies and startups choose Toptal Java freelancers for their mission-critical software projects.
ThailandToptal的自由Java开发人员 Since September 24, 2014
Radek is a certified Toptal blockchain engineer particularly interested in Ethereum and smart contracts. 在法币领域,他在大数据和机器学习项目方面经验丰富. 他是两次不同的国际IBM Apache Spark竞赛的三连冠得主, PlayStation 4后端的共同创造者, 一个成功的黑客马拉松选手, 并在澳大利亚的会议上发表演讲, Poland, and Serbia.
United StatesToptal的自由Java开发人员 Since September 12, 2018
Claudio是一位专注于业务成果的经验丰富的IT专家, 还有扎实的工程背景. 他运用数据科学来优化客户满意度, 产品个性化, and customer churn. Claudio is also a certified SharePoint expert and has worked with prominent Microsoft customers, 帮助他们最大限度地提高安全性, performance, and usability.
United StatesToptal的自由Java开发人员 Since June 18, 2020
Dan has been an expert in the technology field for 25 years and has collaborated with several large firms, 比如甲骨文和埃森哲, including startups. 他也有机会发展自己的事业. His latest technology focus has been on eCommerce, full-stack web development, and Elasticsearch. Dan有很多机会为客户构建和交付大规模解决方案,同时在他的职业生涯中一直与技术保持联系.
United StatesToptal的自由Java开发人员 Since June 18, 2020
Keith在IT行业有近40年的经验,过去20多年, 使用Oracle数据库和Oracle eBusiness Suite进行设计和开发. He's also delivered presentations at Oracle Open World and Oracle Application User Group conferences. Keith has made individual contributions as well as managing on-shore/off-shore teams of up to ten resources. Keith非常注重细节,总是能提供高质量的产品.
United StatesToptal的自由Java开发人员 Since June 13, 2019
Viacheslav在数据科学和软件工程方面有7年的经验. He is passionate about the insights gained from raw data and enjoys converting them to create exceptional business value. Viacheslav的主要专长是Python,并具有Java和c++的生产经验. 解决数据量大的项目, 他应用了先进的机器学习技术, 比如计算机视觉, NLP, 产品推荐系统, networking data, 经典数据科学.
United StatesToptal的自由Java开发人员 Since April 15, 2019
Alex有超过十年的软件开发经验,尤其是网络和移动应用程序. 他领导了包括AT在内的公司的互动项目开发&T, EMC, Legendary Pictures, Hewlett Packard, Foundation Capital, UCLA, Anaheim Ducks, and LA18 Television. 他开发的应用程序曾被TechCrunch和iPod广告推荐. Alex graduated with a degree in Applied Mathematics from the University of California, Berkeley.
我对Toptal印象深刻. 我们的开发人员每天都和我交流,他是一个非常强大的程序员. 他是一个真正的专业人士,他的工作非常出色. 5 stars for Toptal.
Pietro Casoar, CEO
Ronin Play Pty Ltd
与Toptal合作是一次很棒的经历. Prior to using them, 我花了相当多的时间面试其他自由职业者,但没有找到我需要的. 在与Toptal合作后,他们在几天内就为我找到了合适的开发者. 与我一起工作的开发人员不仅提供高质量的代码, 但他也提出了一些我没有想到的建议. 我很清楚,阿莫里知道自己在做什么. Highly recommended!
George Cheng, CEO
Bulavard, Inc.
作为一名Toptal合格的前端开发人员,我还经营着自己的咨询业务. 当客户来找我帮忙填补他们团队中的关键角色时, Toptal是我唯一愿意推荐的地方. Toptal的所有候选人都是精英中的精英. Toptal is the best value for money I've found in nearly half a decade of professional online work.
Ethan Brooks, CTO
Langlotz Patent & 商标工程公司.
在希格尔的早期, 我们需要一流的开发者, at affordable rates, in a timely fashion. Toptal delivered!
Lara Aldag, CEO
Higgle
Toptal makes finding a candidate extremely easy and gives you peace-of-mind that they have the skills to deliver. 我肯定会向任何寻找高技能开发人员的人推荐他们的服务.
At Toptal, we thoroughly screen our Java developers to ensure we only match you with talent of the highest caliber. 在200多个中,每年有5000人申请加入Toptal网络, 只有不到3%的人能达标. You’ll work with engineering experts (never generalized recruiters or HR reps) to understand your goals, technical needs, and team dynamics. The end result: expert vetted talent from our network, custom matched to fit your business needs.
我可以在48小时内通过Toptal雇佣Java开发人员吗?
取决于可用性和进度, 您可以在注册后48小时内开始与Java开发人员合作.
Toptal Java开发人员的无风险试用期是什么?
We make sure that each engagement between you and your Java developer begins with a trial period of up to two weeks. 这意味着你有时间确认订婚是否成功. 如果你对结果完全满意, 我们会给你开时间单的,你愿意多久我们就多久. 如果您不完全满意,我们不会向您收费. From there, 我们要么分道扬镳, or we can provide you with another expert who may be a better fit and with whom we will begin a second, no-risk trial.
Java mastery, 就像生活中的许多技能一样, 要充分利用它的力量需要时间和健康的好奇心. 因此,如我们的帖子所述 寻找少数精英, an effective recruiting process needs to evaluate many dimensions of a candidate beyond just technical knowledge; attributes such as drive, integrity, 创造力同样是一个软件开发大师的基本属性. 评估候选人的这些方面,然后可以用问题(例如本文中提出的问题)来扩充,以帮助确定哪些人是真正的高质量Java专家.
Abstract classes may not be instantiated directly; only their concrete subclasses are instantiable.
一个类可以被声明为抽象的,即使它没有抽象方法. 这将阻止该类被实例化. This can be useful, for example, if a base class in a class hierarchy has no abstract methods but is not itself meant to be instantiated.
问:比较和对比已检查和未检查的异常. Provide examples.
未经检查的异常 例外是 not 被认为是可恢复的. Java不会因为它们表示异常而强制您捕获或处理它们, 代码中的意外问题,例如 NullPointerException, ArithmeticException and IndexOutOfBoundsException. 也就是说,这些都是你需要修复或预防的问题. 未检查异常都派生自 RuntimeException.
Checked exceptions are exceptions that are 被认为是可恢复的. Checked exceptions must explicitly be specified as part of a method’s API; that is, 可能抛出一个或多个受控异常的方法必须将这些潜在异常列为其方法声明的一部分(Java编译器实际上会强制执行这一点)。.
当调用引发异常的方法时,调用者必须处理(i.e.(捕获)这些异常,或者必须自己抛出它们. For example, 如果方法抛出检查异常, 调用者可能决定忽略错误并继续(吞下它), 向用户显示一个对话框, 或者重新抛出异常,让调用链更上层的方法处理它(在这种情况下,它还必须声明它抛出检查异常)。.
因此,有 raging debate for years on whether to use checked or unchecked exceptions when writing libaries, for example. 很多这样的辩论都是如此, 事实上,没有放之四海而皆准的方法, 全部正确答案. 检查异常和未检查异常各有优缺点, 因此,决定使用哪一种主要取决于情况和背景.
There may be times, though, when you want to restrict the kinds of types that are allowed to be passed to a generic type parameter. For example, a method that operates on numbers might only want to accept instances of Number or its subclasses. 这是在一般情况下使用 有界型参数,其中列出了类型参数的名称,后面跟着 extends keyword. For example:
//确定三个可比对象中最大的
public static > T maximum(T x, T y, T z) {
T max = x; // assume x is initially the largest
if ( y.compareTo( max ) > 0 ) {
max = y; // y is the largest so far
}
if ( z.compareTo( max ) > 0 ) {
max = z; // z is the largest now
}
return max; // returns the largest object
}
与泛型方法一样,类的类型参数部分 generic class 可以使用逗号分隔一个或多个类型参数吗. For example:
public class Cell {
private T val;
public void set(T val){这个.val = val; }
public T get() { return val; }
public static void main(String[] args) {
Cell integerCell = new Box();
Cell stringCell = new Box();
integerCell.(新添加整数(10));
stringCell.add(new String("Hello World"));
System.out.printf("整数值:%d\n\n", integerCell.get());
System.out.printf("字符串值:%s\n", stringCell.get());
}
}
反对多重继承的主要理由是复杂性, 潜在的模糊性, 它可以引入. 最典型的例子就是人们常说的“钻石问题”。, B类和C类继承于A类, 类D同时继承类B和类C. 如果a中的方法被B和C都重写了,就会产生歧义. If D does not override it, then which version of the method does it inherit; that of B, or that of C?
但是如果我们想要模拟助教的角色会发生什么呢?? Typically, a TA is both a grad student and a faculty member. This yields the classic diamond problem of 多重继承 and the resulting ambiguity regarding the TA’s getRole() method:
(Incidentally, 注意上面继承图的菱形, 这就是为什么这被称为“钻石问题”.)
Which getRole() 实现应该继承TA? 教员或研究生的证言? 简单的答案可能是让TA类覆盖 getRole() 方法并返回名为“TA”的新定义角色。. 但这个答案也是不完美的,因为它会掩盖一个事实,即助教是, in fact, 既是教员也是研究生. There are multiple design approaches and patterns for addressing this type of situation without 多重继承, 这就是为什么一些语言(Java就是其中之一)决定简单地避开多重继承的原因.
Java 8, however, 通过允许在接口上指定默认方法(在Java 8之前),引入了对多重继承的准支持形式, 只有方法签名, 不是方法定义, 允许在接口上使用). Since Java does allow a single class to implement multiple interfaces (whereas a single class can only extend a single parent class), Java 8中允许在接口中定义方法,这首次在Java中引入了菱形问题的可能性.
For example, if A, B, 和C是接口, B和C可以各自为a的抽象方法提供不同的实现, 导致任何实现B和C的类D出现菱形问题. 类D必须重新实现该方法(其主体可以简单地将调用转发给其中一个超级实现), 否则歧义将作为编译错误而被拒绝.
Gourmet Java
Here we present some more advanced concepts and issues that master Java programmers can be expected to be familiar with.
问:如何使用外部条件变量可靠地退出线程?
有时,开发人员希望在外部条件为真时终止线程. 考虑下面的例子 bus 继续无限驱动的线程,直到 pleaseStop 变量变为真.
boolean pleaseStop = false; // The bus pull cord.
公共void pleaseStopTheBus() {
pleaseStop = true;
}
公共无效startTheBus() {
new Thread("bus") {
公共无效运行(){
//无限驱动总线.
while (!pleaseStop) {
//花点时间开车到下一站.
}
pleaseStop = false; // Reset pull cord.
}
}.start();
}
看起来简单. However, Java不保证线程边界之间隐式的变量同步, 所以这个线程不能保证可靠地退出, 这让缺乏经验的Java开发人员感到头疼.
要使上述代码正常工作,需要按以下方式同步线程:
volatile boolean pleaseStop = false; // The bus pull cord.
Object driver = new Object(); // We can synchronize on any Java object.
公共void pleaseStopTheBus() {
//在"线程1"中,同步驱动程序对象
Synchronized (driver) {
pleaseStop = true;
}
}
公共无效startTheBus() {
new Thread("bus") {
公共无效运行(){
//无限驱动总线.
while (true) {
//在这里的“线程2”,也同步驱动程序对象
Synchronized (driver) {
if (pleaseStop) {
pleaseStop = false; // Reset pull cord.
return; // Bus stopped.
}
}
//花点时间开车到下一站.
}
}
}.start();
}
Q: How can null 问题重重,怎样才能避免陷阱?
For one thing, null is often ambiguous. 它可以用来表示成功或失败. 或者它可以用来表示值的缺失. 或者在某些上下文中它可能是一个有效值.
即使一个人知道 null 在特定的环境中, it can still cause trouble if the hapless developer forgets to check for it before de-referencing it, 从而触发 NullPointerException.
In addition, as of JDK 8, Java已经引入了对 Optional 类(或者如果您使用的是较早版本的Java,则可以使用 Optional class in the Guava libraries. Optional 用一个值表示和包装缺席和存在. 而Optional则添加了更多内容 ceremony 到您的代码中,通过强制您展开 Optional to obtain the non-null 值,它避免了可能导致的 NullPointerException.
问:什么是“拳击”?要注意的问题有哪些?
Java的基本类型是 long, int, short, float, double, char, byte and boolean. Often it’s desirable to store primitive values as objects in various data structures that only accept objects such as ArrayList, HashMap, etc. So Java introduced the concept of “boxing” which boxes up primitives into object class equivalents, e.g., Integer for int, Float for float, and Boolean forboolean. Of course, as objects, 它们会导致对象分配的开销, 内存膨胀和方法调用, 但他们确实付出了一些代价来达到目的.
“Autoboxing” is the automatic conversion by the compiler of primitives to boxed objects and vice versa. 这只是为了方便,e.g.:
ArrayList ints = new ArrayList();
// Autoboxing. 编译器会自动将"35"转换成一个带框的整数.
ints.add(35);
//上面的表达式等价于:int.(新添加整数(35));
In Java, when you allocate a new object and assign its reference (simply a pointer) to a variable, a strong reference is created by default; e.g.:
String name = new String(); // Strong reference
There are, however, two additional reference strengths in Java that you can specify explicitly: SoftReference and WeakReference. (实际上在Java中还有一种额外的引用强度,称为 PhantomReference. 这是很少使用的, though, that even highly experienced and dedicated Java developers will most likely not be familiar with it, 所以我们从这里的讨论中省略了它.)
More specifically, the GC won’t free objects that are strongly reachable from a chain of strongly referenced objects. 这句话的意思就是, 如果GC仍然认为需要某个对象, it leaves it alone, 这通常是你想要的(i.e.(你不希望一个你需要的对象在GC启动时突然消失).
But sometimes strong references are too strong which is where soft and weak references can come in handy. Specifically:
WeakReference objects do not prevent their referents from being made finalizable, finalized, and then reclaimed. 弱引用最常用于实现规范化映射.
Wrap up
Java作为一种占主导地位的流行语言继续生存和发展. 但是在软件开发和应用程序开发中,任何语言都经历了如此多的迭代, 它有许多并非所有开发人员都熟悉的细微差别. Moreover, the ever-increasing breadth of Java’s capabilities requires a great deal of experience to fully appreciate. 因此,那些掌握了该语言的人可以对开发团队的生产力和系统的性能产生重大的积极影响, scalability, and stability.