I'm not the only one that thinks this?! My god, has someone checked the temperature in hell? I think Satan might need a jacket.
Part of the lag, I'm sure, is up to a very...broad design, meant to target as many machines as possible, something which Java is, admittedly, not too bad at. However, that incurs overhead, and the more general you get, the more overhead you incur; its a balancing act that you've got to be very careful with, lest you release a graphically simple game that runs all its graphics on the CPU. Like its the 90s. Besides that, what extra is earned by targeting, say, Linux machines? 1-2% of the market? Even if half the Linux users on the planet bought and played Minecraft, that's still going to be a very minute percentage (again, likely 1-2%) of your overall user base. They tried to reach as many computers as humanly possible, and in doing so, sacrificed performance and, by extension, gameplay to a degree.
The other part is Java itself, or rather, its virtual machine. Time and again, I've found that Java programs take longer to start and consume more resources than something similar made in, say, .Net. I'll give you an example, on my laptop (which is good enough to run Guild Wars 2 on minimum graphics with reasonable FPS), the standalone IC2 Nuclear Reactor Planner (v3) takes anywhere from 3-5 seconds to start up, and according to Task Manager, consumes around 60 meg in memory. Too fucking long, and too fucking much, in other words. Yeah, that program might have some pretty complex math behind it, I'm not saying that it doesn't, but...something like that should really have at most -half- that much memory usage, and start almost instantly. Its bulky, its cumbersome, and worst of all, its inefficient. That inefficiency means greater resource demand, and that means lag.
I honestly wonder -why- Mojang even made Minecraft in Java in the first place. Damn near every game nowadays is made with C++, and extended by scripts in something like Lua, Python, or some homebrew language. Why? Because C++ compiles directly into machine code, no interpretation layer necessary, it. Just. Runs. Want to target multiple platforms? C++ can do that. Yeah, it'd take a little extra work, but if you ask me, that work is worth it if it spells a better experience for your end users. If they'd -insist- on going with an interpreted language...why not go with one of the .Net languages? All you need for cross-platform capabilities there is Mono, and in my experience, .Net programs run a fair deal faster than what I've experienced with Java.
I'm almost tempted to make a clone of the IC2 Reactor Planner in C# just to prove my point.