So someone asked Is the ++ operator more efficient than a=a+1? a little while ago.  I thought that I analyzed this before and initially said that there was no difference between a = a + 1 and the incremental operator ++.  As it turns out, a++, ++a and a += 1 all compile to the same bytecode, but a = a + 1 does not, as can be seen below:
public class SO_Test
{
    public static void main(String[] args)
    {
        int a = 1;
        a++;
        a += 1;
        ++a;    
    }
}
Output:

Example:
public class SO_Test
{
    public static void main(String[] args)
    {
        int a = 1;
        a = a + 1;
        a++;
        a += 1;
        ++a;    
    }
}
Output:

In short, a = a + 1 issues iload_1, iconst_1, iadd and istore_1, whereas the others only use iinc.
I've tried to rationalize this, but I am unable to.  Is the compiler not smart enough to optimize the bytecode in this case? Is there a good reason that these are different?  Is this handled by JIT? Unless I'm interpreting this incorrectly, it seems like I should never use a = a + 1, which I thought for sure was just a stylistic choice.  
 
     
     
    