Protocol-wise they're pretty similar except I2P uses a variant of onion routing called "garlic routing" which allows for message bundling (I don't know if this is currently used beyond bundling for delivery status messages and lease sets). I2P also has unidirectional circuits as opposed to Tor's bidirectional ones which means unlike Tor hidden services where you build a bridged circuit using a rendezvous point, in I2p each side has a pair of unidirectional tunnels for send/receive. I2P is also packet switched as opposed to circuit-switched, which can possibly make it more resilient to traffic-analysis attacks and lead to better load balancing of resources.
Otherwise the main differences seem to be design-wise, where in Tor you rely on a centralized bootstrap to get the list of relays whereas I2P does this via decentralized NetDb.
Roughly it's like Tor (though I think the transport is not necessarily like Tor), except it's closed. You can only communicate with others on the I2P network. Some I2P users may choose to operate an "outproxy" and provide Internet access but it's not built into the network or software. What is (or was, it's been awhile) built in is a torrent client.
It's also written in Java and the router web UI was pretty snazzy from what I remember.
The design is also more decentralized than Tor. It's also been a while, but I think the client runs a router node by default. This provides extra anonymity, because your own traffic is hidden in the other traffic you're routing. As I recall, the security/performance tweaks in the Web UI allowed you to set how much traffic you allowed through your node.
> There are some cases where it doesn't seem to help: if an attacker can watch all of your incoming and outgoing traffic, then it's easy for them to learn which connections were relayed and which started at you. (In this case they still don't know your destinations unless they are watching them too, but you're no better off than if you were an ordinary client.)
(I'm not mentioning this to criticize I2P's design, just to point out that the benefit you get from this decision depends a lot on your threat model!)
There was also Kovri (a fork of i2pd made by the Monero project) that sadly appears to be dead now.[1] It could have greatly increased the number of nodes on I2P.
Otherwise the main differences seem to be design-wise, where in Tor you rely on a centralized bootstrap to get the list of relays whereas I2P does this via decentralized NetDb.