I understand there are factors at play here other than what JDK I used in my previous jobs, but a lot has gone on since JDK 1.4, and I haven't used any of the new 1.5 or 1.6 features in a production environment. Can that hurt me significantly? Almost every tutorial I see uses generics, enums, var args, and the like, and I wonder if I'm really behind the curve.
You'll be viable if you take the time to teach yourself those topics. In an interview they'll be able to see for themselves whether you know about enums, and it might just make the difference.
In terms of the JDK itself, I doubt this would be a problem. Making the transition to the use of generics takes less time than you spend in a day casting your collections because generics are not supported [crying over all the wasted time in the early 2000s]. All the other feature differences are fairly fluff, IMHO, you'll pick them up while running, though preferably before the interview.
The bigger problem is that much of the marketplace is now focused on the use of J2EE APIs. Have you used any of those? They are not that difficult to learn, coming across a chance to practice is more important. There is also a lot of focus on things like Spring that are not part of the JDK.
I would focus on reading the tutorials for J2EE, if I were you. After figuring out generics.
Well, you already listed the main new features of JDK1.5, so just go and learn them. The basics of generics, enums and var args are not hard to master, you should be able to use them after a day or two.
At any rate, what makes you valuable is not whether you know a few language features more or less (though some employers apparently like to tick of technologies in resumes), but your experiences working with customers and solving problems.
That experience should also help you to pick up new stuff quickly...
It depends on what your other skill-sets are and what market you're in. It's not uncommon for some industries like Defense and Homeland Security tend to be a version or two behind the mainstream.
A few J2EE shops I knew-of were still hanging back on 1.4 up until recently... if you have other up-to-date skills or experience with popular technologies, your lack of familiarity with the newer JDK won't hurt as much... Things like Hibernate, Oracle, Oracle App Server, J2EE, GIS, JAAS, etc will all help out. Or if you're a senior-level guy with significant OO and design experience (you've kept up on ideas such as DI, composition, design-by-contract, etc) I don't really care what JDK you're up-to-date on.
The specifics of a particular JDK aren't as important as understanding the reasons and application of those features. Even if you haven't used Generics or Enums or Attributes or Concurrency in production, you'd better be able to tell me in an interview why those things are significant.
That all said, when you start, you'd better be prepared to start using those new, trendy features.
I believe I learned on Java 1.1, and then was thrown into using Java 1.5.
Although you will have things to learn, I would say you would still be fine. It is really the whole idea of object oriented programming that is important. Once you have that concept down you should be good to go.
You will want to learn those new topics before you jump into things. Generics will prove to be one of the most important things in terms of Java programming. Enums follow close behind.
Here is a little bit to give an idea about generics: Generics allow you to specify during the creation of the object a type or types that are stored in it. The easiest examples are with already defined classes such as a list.
Old way:
List myList = new List();
New way:
List<String> myList = new List<String>();
Now when you pull things off of the list, they are going to be strings and you don't have to worry about any type casting or anything else in your code. It really adds to readability.
You will of course want to go into them in more detail to really see how they work.
Find a tutorial. Convert some old code of yours to compile with no warnings in Java 6. Get used to generics, the new for syntax, and other stuff. You'll be familiar in no time.
But besides that: If a job interviewer thinks you're going to be seriously debilitated by not being exposed to the last two versions of Java, you don't want to work there. It's not that big a leap. You could very easily show your OO programming skills without any Java 5 or 6 knowledge, and then pick it up in the first week of your new job.
Keep in mind that some of the features you mentioned --var args, enums-- are very easy to learn and use. Generics require a little bit of studying, but most experienced programmers will not take much time to understand it. In fact, currently, many consolidated java projects I've seen do not use generics yet -- and most of the ones which do it do not implement it the right way. So, yes, I think you are still good for the market.
I still have code that would run unmodified since JDK 1.0 Alpha 2, so overall things haven't changes that much.
Take a look at what the new things are, they fall into the following categories (this is not exhaustive, look here and here for a more complete list):
Language changes
- generics, syntactic sugar that removes casting,
- enums, syntactic sugar that essentially simplifies the code show below,
- var args, syntactic sugar for passing arrays
- enhanced for-loop, syntactic sugar to remove boilerplate code
- annotations, big topic
Library changes
- more collections changes (generics added)
- threading changes (java.util.concurrent)
- Scanner, simpler parsing
VM change
- a number of C api changes, you shouldn't care about
- a number of low level API changes, you shouldn't care about
- a number of internal changes, you shouldn't care about
For the languages changes, read up on them and practise them. You should be able to get used to them within a week.
For the library changes, depending on what you need/want to know, same thing, write some code with them. Might take a couple of weeks to get the hang of them.
You are not that far "behind", and it won't take long to catch up.
(sample enum code)
public class FooEnum
{
public static final FooEnum A = new FooEnum();
public static final FooEnum B = new FooEnum();
}
public enum Foo
{
A,
B,
}
Grab a copy of "Effective Java". It will teach you a lot of things which will make you much better fitted to answer your question yourself :)
It depends. How does your code look? Is it clean? Well documented? Are you writing good useful unit tests? Do you know what PMD is? Do you know why it matters? Which FindBugs reports do you see most often? Which ones do you feel are absolute fix right now issues and which are okay, we could be doing this better? How do you work as a team? What if the schedule gets tight? Are you capable of planning your work and working the plan?
... and so forth ...
In short, the quality of your work product and the way you produce it is far more valuable to quite a lot of employers that you would actually want to work with. Getting up to speed on the latest dialects, features and "yeah, that looks cool but don't ever try to use it" aspects of the language is much easier than learning how to do your job well in the first place.
Don't kill yourself. Learn what you can learn so you can have a sensible conversation about things that you haven't been paid to use but want to show that you're game to jump into.
Just remember: never ever lie about your experience.
A lot of applications still use Java 1.4 and you may find that Java 5/6 isn't that different. The most obvious difference is generics.