В дополнение к тому, что сказал Джон Скит, значение нельзя изменить, но содержимое можно изменить.
final Integer one = new Integer(1);
...
one = new Integer(2); // compile error
final List list = new ArrayList();
...
list = new ArrayList(); // compile error
list.add(1); // Changes list, but that's fine!
Также следует помнить, что final и static final не совпадают. final находится в области видимости экземпляра, в то время как static final одинаково для всех экземпляров класса (в других языках это можно назвать константой).
Лично я считаю, что преимущество final, даже если оно совершенно не требуется для работы вашего программного обеспечения, заключается в семантическом значении. Он предлагает вам сказать компилятору и следующему человеку, работающему над этим кодом , что эта переменная не предназначена для изменения, и что попытка изменить ее может привести к ошибке.