In Java (the language upon which Apex is based) there is a difference in terms of where that String gets stored in the String literal pool. Apex simply disallows the use of the constructor so that all strings are stored in a pool. This has a variety of implications in terms of memory storage and security, which is why (I suspect) Apex only allows the latter and not the former.
Answer from Jeff Bennett on Stack ExchangeVideos
**Create an Apex class with a method that returns an array (or list) of strings.**Create an Apex class with a method that returns an array (or list) of formatted strings ('Test 0', 'Test 1', ...). The length of the array is determined by an integer parameter.
The Apex class must be called StringArrayTest and be in the public scope
The Apex class must have a public static method called generateStringArray
The generateStringArray method must return an array (or list) of strings
The method must accept an incoming Integer as a parameter, which will be used to determine the number of returned strings
The method must return a string value in the format Test n where n is the index of the current string in the array