I was recently asked this quesion. But was not able to explain concisely what exactly sets both these concepts apart.
For example
Final and Immutable:<
Immutable : String and wrapper classes are immutable. Because of the String constant pool they can't change their value inside an object, but they can change references of object holding different values.
String s1 = new String("cant't change");
Final : when we create a reference of String
Final String s2 = "cant't change";
The reference for s2 is pointing to object which has value " can't change" inside it.
The reference s will now always point to the object holding value "can't change". It's reference can't be changed.