`man bash`, search for section _Special Parameters_. For `_` you'll find:

> expands to the last argument to the
> previous command, _after expansion_. 

Emphasis is mine because the key difference in a command line context is _expansion_. For example if I have a variable `FOO` set to 'bar' and I execute `echo $FOO` then `$_` on the next line will display `bar` while `!$` will just display `$FOO`


Note that `$_` has different meanings in other contexts:

>  Also set to the full pathname used
> to invoke each command executed and placed in the environment exported
> to that command.  


> When  checking mail, this parameter holds the name
> of the mail file currently being checked.