You would have to post the chapter (please don't, by the way) to fully give the context, but I can distinguish the two concepts further for you.
final is a keyword in java that applies, in your case, to a reference variable. That means that once the object is instantiated, that variable cannot be assigned to a different object, i.e., if you do:
final String[] stringArray = new String[8];
you can never do anything again like this:
stringArray = new String[2];//stringArray is final and cannot be reassigned
This doesn't indicate however that if the contents of stringArray are not able to be changed. You can do:
stringArray[3] = "Hey!";
And it will compile just fine. This shows you that just the reference cannot be reassigned to anything else; we're only talking the reference here.
When they say String is immutable, they are talking about the String constant pool. In the string constant pool there is a collection of strings that have been created in memory that are stored for reuse. If you say, for example:
String tempString1 = "yo";
String tempString2 = "yo";
You only created 1 string object in the string constant pool (a special part of memory where strings go) and assigned it to two different reference variables. If you do:
tempString2 = "hey";
String tempString3 = "yo";
you have only created 1 new object again, "hey", in the string constant pool. tempString1 only changed what it was pointing to, and tempString3 is reusing "yo" that has already been created.
If you do this because you're nuts about Java:
tempString1 = tempString2 + tempString3;
String tempString4 = tempString2 + tempString3;
String tempString5 = tempString2 + tempString3;
You have only created 1 more string "heyyo". "yo" "hey" and "heyyo" are the only strings in the String constant pool.
Any operation you do will not change "hey" and "yo" in the string constant pool, even though you may change output to appear like those strings have changed.