Most colleges don't really teach computer science anymore, they just churn out Java programmers. I personally hate Java, and though I really like C# and the .NET framework in general I completely agree with Joel Spolsky when he writes that modern CS students don't really learn more than what's needed to generate monkey-level software and basic websites.
Instead what I'd like to claim is that Java is not, generally, a hard enough programming language that it can be used to discriminate between great programmers and mediocre programmers. It may be a fine language to work in, but that's not today's topic. I would even go so far as to say that the fact that Java is not hard enough is a feature, not a bug, but it does have this one problem.
If I may be so brash, it has been my humble experience that there are two things traditionally taught in universities as a part of a computer science curriculum which many people just never really fully comprehend: pointers and recursion.
You used to start out in college with a course in data structures, with linked lists and hash tables and whatnot, with extensive use of pointers. Those courses were often used as weedout courses: they were so hard that anyone that couldn't handle the mental challenge of a CS degree would give up, which was a good thing, because if you thought pointers are hard, wait until you try to prove things about fixed point theory.
All the kids who did great in high school writing pong games in BASIC for their Apple II would get to college, take CompSci 101, a data structures course, and when they hit the pointers business their brains would just totally explode, and the next thing you knew, they were majoring in Political Science because law school seemed like a better idea. I've seen all kinds of figures for drop-out rates in CS and they're usually between 40% and 70%. The universities tend to see this as a waste; I think it's just a necessary culling of the people who aren't going to be happy or successful in programming careers.
Yeah, it's too bad that most CS programs these days aren't hard enough to create good computer scientists... but then, real computer science is so hard that there just aren't many people who can do it (if I may be so humble). The fact of the matter is that the world needs code-monkeys, and Java (and the like) were created so that people closer to the mean would be able to contribute to the information age. There will always be a need for real computer scientists who can do the theorizing and architecting, but most programming jobs don't require that level of expertise.