I hope that you don't mind engaging in a dialog about this. I am trying to create a programmer's perspective on this, albeit I am mainly a user/admin when it comes to Minecraft. Let me theorize based on your response and you can correct me where I am in error.
There are 20 game loops per second which represent a game tick. (when the CPU is handling the load)
There is a 1 second interrupt being generated for servicing all those objects that registered for this servicing.
The hopper class gets serviced during this interval. Each hopper that is active in the game is serviced, one at a time.
The hopper object servicing, consists of first, fetching any items () in the block above it by creating stacks of each type item (up to 5 stacks, 1 to 64 items per stack) and adding them to available space in the 5 stack hopper buffer. Then when the hopper is not empty, a stack of 3 items are created, removing these items from the stacks already in the hopper buffer and then move that stack of three to the hopper that this hopper is pointing to. This is repeated until all active hoppers have been serviced.