Well, to be really OO about it, you'd probably want to use some
wrapper that will abstract you away from all the hairiness that's
inherent in your requirements. What you really need is a good ol'
relational database, but you can mock one up yourself in a pinch.
Start off with something like the StudentInfo class suggested above.
Then whip up a wrapper class with methods like addStudent,
removeStudent, and all the getStudentsBy<whatever> attributes you need
to search by. For each attribute, maintain a Map, where the keys are
the value you're searching for and the values are Sets of Students
that fit that query. You'd just have to maintain those Maps on
inserts by pulling the Set of Students that match the query if it
exists (and creating it if it doesn't) and adding the new Student to
it (and placing the new Set into the Map if you just created one).
Conversely, deletes would do gets on all the attributes, find the ones
that match all the criteria, and removing them from the Sets in the
Maps (and wiping out any Sets you may happen to empty along the way).
....and if you need to search by more than one attribute, then, well,
get a database.