Although there is nothing in the original post that specifically says you need to implement a hash table yourself, I'd be willing to bet that you still do. At least, that's the way I read it. Partly because it doesn't sound like you need to override the hashCode() method, which is exaclty what you would need to use HashTable in the first place. However, It might help to use HashTable as an outline for the methods (and the arguments they take) that you might want to use in your Storage class.
With that said, I'd like to back up to your Student class. I see that the calculateHash() takes a
String argument for the name. However, the Student class also has a name member field. This seems like a bad idea to me because when another method calls calculateHash() it is possible to pass a different name than the Student object has. This is a possible source of a very big headache. Instead, the calculateHash() should take NO parameters and use the member field called name to calculate the hash value.
You should check to see if you need to implement the hash table code yourself, rather than using HashSet. Either way, there is a slight problem with the addStudent() method in your Storage class. As the name of this method implies, it should add a Student object to the internal storage, correct? How does it know which Student to add? At the moment this method only takes an int as an argument. Would it make more sense to take a Student object as an argument instead? Notice that if it does, then you can call Student.calculateHash() to get the hash code for the object passed in.
Also, I see that the Storage class contains several fields like studentName, course, and hashValue that are applicable to a SINGLE student. However, from what I understand, the Storage class is supposed to store MANY students. At the moment, that is what the HashSet is for, right? I think you can just get rid of studentName, course, and hashValue since those fields don't have anything to do with the Storage class.
Next, I see a problem with the Storage constructor:
The problem here is that "this.size=size;" doesn't accomplish anything. Both "this.size" and "size" refer to the same member variable. This line of code just assigns a value to itself. From the comment, it looks like you need to accept the size of the array as a parameter. If you make this change, then it will probably do what you are thinking of.
However, the comment also indicates that you need an array. I think this is the crux of the problem. You should use an array to implement your own hash table instead of the built-in HashSet class. In doing so, you will use the value returned from Student.calculateHash() in order to figure out which index in the array to use. Then you also have to deal with collisions and other complications. However, we should probably wait a little before we get into those details. Take a look at my other suggestions above before moving on with this.
Keep Coding!
Layne