In both cases the literal value "a" is a compile-time constant that will end up in the String contant pool.
At runtime the former will always refer to the String object in the constant pool, so you don't end up with lots of String objects that represent the same value.
The latter will always create a new String object with value "a", which is not as efficient and nearly always unneccesary.
Unless you have a good reason to worry about the efficiency of sharing the backing - potentially huge - char array with String's returned by invocations of the substring() method.
But that's a rare case.
Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.