A final class cannot be extended.
A final method cannot be overridden.
If you made all the methods in a class final, you could still extend the class; an object of this subclass could then be used in places where the superclass could be used, but the subclass could still have additional methods that the superclass did not have. The subclass could not, however, modify the behavior of the superclass methods at all, not even in ways that would make sense in terms of the subclassing.
I don't know why String is overridden, particularly; I always expected that, because it is bound to be used so extensively in programs, perhaps performance was judged to be an issue there, either that or its special nature as one of the "almost primitives" in a JVM meant that allowing extension of it had security risks for
Java programs in general.
The use of final classes or methods may improve performance, but that would not be the primary reason for their use in general. I've been programming in Java since 1996, version 1.0, and I've never had occasion to use these features. I think of them as things that are useful in esoteric situations that I have not yet had to deal with; I know what they mean and that's enough. Lots of code to be written without worrying about it, certainly not for performance enhancement.
rc