The term hashing refers to the conversion of a key (i.e. a String) to an index into an array. The letters of the String are used to compute a number. Every String produces a different number which is then used as an index into an array. By this mechanism it is possible to put each String into its proper place in the array without comparing it to any of the other Strings. As a result, the insertion of the new String into the array is done in O(1) constant time!
Java has a HashSet class that uses a hashing function that takes a String and returns an index into the underlying array. Each new element added is assigned its unique slot in the array in O(1) time. Since removal and search are done in the same way these operations also run in O(1) time. This results in a big O runtime of O(1) for the fundamental operations of the HashSet:
boolean add() runs in O(1) returns T/F if the add succeeds/fails (How could it fail? You tried to add a duplicate element) boolean remove() runs in O(1) returns T/F if the remove succeeds/fails (How could it fail? You tried to remove a non-existent element) boolean contains() runs in O(1) returns T/F if the search succeeds/fails (How could it fail? You searched for a non-existent element)
Notice the strings come out in no particular order. Not alphabetical - and not in original order added.