Как Java реализует хеш-таблицы?

Кто-нибудь знает, как Java реализует свои хеш-таблицы (HashSet или HashMap)? Учитывая различные типы объектов, которые можно захотеть поместить в хеш-таблицу, кажется, что очень сложно придумать хеш-функцию, которая бы хорошо работала во всех случаях.