assertions are claims that the asserted condition will be true, regardless of how the enclosing package is used by its clients. Unlike normal validity checks, assertions throw AssertionError if they fail. And unlike normal validity checks, they have no effect and essentially no cost unless you enable them, which you do by passing the -ea (or -enableassertions) flag to the java command.
I don't like assert; it communicates a sense of guarantee or safety that may not be present. That is, it might tell the developer "we know the input value is never negative" but new code might not adhere to that. It might tell the developer "don't worry if a negative value comes in, this code will catch it before it does any damage to state," but assertion checks can be turned off.
To add on to that last point, it introduces a real and likely possibility of behavior that's different between development and production.