The first reason is that Java final doesn't serve the same purpose as C++ const. It's fine for the purpose it does serve, which is to be a semantic restriction on a hierarchy of object-oriented classes, to promote proper design of such a hierarchy. Which doesn't have anything to do with not being able to change the value/state of a class.
The second reason is that there was nothing to prevent Java from having a "const" feature of some kind. But it was initially designed for a very limited use case (limited compared to its current varied use cases) which was for embedded computing on tiny devices with limited resources in a simple way. And with that use case in mind one of the main initial goals was simplicity of programming code, simplicity of programming a virtual machine, simplicity of programming a compiler, and so on. and "const"-ishness was a complexity they didn't need at that time.
Since then Java has evolved - a lot - but with heavy constraints related to backward compatibility and ease of teaching the language - and so the evolution of the language (and the VM it runs on, and its framework) has proceeded pretty deliberately. (And, thus, slowly.)
And there is a feeling (justifiable) that a lot of what you get with declaring "const"-ishness you can get with other object-oriented features that are in the language, for example, having getters for fields but not setters.
So there's no reason for there not being "const"-ishness in the language/VM/framework yet except that it hasn't been considered as important as other things to work out, and there are workarounds within the language.
But people have added "const"-ishness to Java - just external to the language standard. Look up various libraries and tools for creating "immutable objects" to see what can be done.
(And to answer your last question: It has nothing to do with GC.)