str1 and str2 are references to String objects, not string objects. When you write:
str1=str1+str2;
str1 will reference a new string object that was created by calculating str1+str2.
In fact, you can try:
String str1 = new String("Hello");
String str2 = new String("World");
String str4 = new String("Hello");
// False: content ("Hello") is the same, but the object instance is different
System.out.println(str1 == str4);
String str3 = str1;
// True: refers to the same object
System.out.println(str1 == str3);
str1 = str1 + str2;
// False: a new object has been created and put in str1
System.out.println(str1 == str3);
The String str1 = new String("Hello")
notation is essentially the same as writing String str1 = "Hello"
, except that it bypasses some optimizations that could make this sample not work as intended (see comments).