Well you can do that with enums as well, but I don’t want to talk you into this
Other than that, I don’t know if I get your problem.
I would say, just create a Player class with an Inventory property that can have a ArrayList in there. Make your subclasses of Item, fill in the desired functionality and resource properties. If you need to save the player state, either serialize it yourself or use 3rd party libs like xstream to make things easy.
To avoid serializing everything and the kitchen sink, make all fields transient that can be reconstructed dynamically after loading (like textures, sound clips etc.), so only serialize primitive types and simple datamodel like objects.
Then if you need to load the player state, reconstruct the transient fields again. To do that you’ll need to implement readResolve() or readObject(instream)
To render your inventory, create a render() method in your Inventory class that iterates over the ArrayList and render each Item at the desired position. You can either implement a render(x,y) method in your Item class, but I would probably just get an Image from the Item and put the render-code in the Inventory class.
To handle equiping your Player, you can create a special ArrayList named slots or something in your Inventory. Create another class like PlayerAttributes that hold armor, strength etc. properties. Every time the content of the slots change, reset the PlayerAttributes and iterate over all Items in the slots, calling a method like equip(PlayerAttributes attributes) and let the Items modify the given attributes object.
Just give it a shot, even if the post is not fully detailed. You’ll find out the bits and pieces on your way.
Btw. don’t think about something being slow when you are dealing with <10000 objects. Just make it so that you can easy manage the code und functionality. Think about performance, when you have performance problems (or you plan something with >10000 objects/items/entities)