Final has no cost associated with it in terms of performance or memory use, but from a software-engineering perspective, it has some nice benefits. This is pretty obvious, but a final variable's value can't change. Therefore, reading code that involves final variables is easier; you know more about the data involved than you would know if the variables weren't final.
In theory, at least, "final" allows the JVM to do more runtime optimizations, too: if you know a value will never change, for instance, you can cache it in a register rather than refetching it from memory.
So there are many plusses, and really no minuses. Using final whenever you can -- i.e., whenever you have a variable whose value will never change -- is a good practice.