Following are some of the Java's little surprising things (atleast to me),
1: final's operation by reference:
final which do not mean an object cannot be changed, actually objects reference cannot be changed.
final StringBuffer sb = new StringBuffer("arun");
sb.replace(0, 2, "ab"); // works !
sb = new StringBuffer("test"); //throws error: final can't be changed
final String s = new String("arun");
s.replace(0, 2, "ab"); // throws error
s = "test"; // throws error
//do not work since String is immutable (same reference can't be modified)Working things makes change on same reference, but others creates new reference which final can't allow.
This also means final != immutable
2 : Object lock of Synchronised methods on multiple threads
Synchronised method operates by establishing Object level Lock that calls the method.
3: ConcurrentModificationException
1) modification of an object while being iterated at other place
2) In certain violations, single thread can also cause the same issue
Github code on 2 & 3