If you check the source for Vector, you will see that a few methods are synchronized. It, basically, makes Vector "thread-safe". Meaning, if you have a multi-threaded code, no two threads can access those methods at the same time.
But, for most uses, you don't need that (all that checking creates additional overhead). That's why they made ArrayList. Those two are basically synchronized and unsynchronized versions of the same thing. By "unsynchronized" they mean, for instance, if you have two threads and both start adding elements to the list, there is no guarantee what will happen.
You can synchronize ArrayList if you want to (or any Collection, for that matter). Then you lock the whole list when needed.
Same goes for Hashtable vs HashMap.
I think they kept Vector and Hashtable because Java versions have to be backward compatible. ArrayList and HashMap are supposed to be more efficient. I will paraphrase Kawigi - people usually use Vectors because either they learned Java B.C.("before Collections") or they learned Java after learning C++ STL.
Of course, in UVa Java, all you have are Vector and Hashtable
![:)](./images/smilies/icon_smile.gif)