You're right in pointing out that the final keyword, when applied to method parameters in Java, can sometimes feel like it's not doing much, especially when dealing with reference types. Lets break it down:
What Does final on Method Parameters Do?
When you use final on a method argument, you're saying that the reference itself cannot be reassigned within the method. It does not make the object that the reference points to immutableonly the reference variable is protected from being reassigned.
This is important because, without final, you can change the reference to point to another object inside the method. With final, you cannot reassign the reference variable to a new object or null within the method, but you can still mutate the object that the reference points to (if it's mutable).