By "==" you are checking and comparing "reference" values of the String. Using "equals" works to compare the "contents" of two given strings.
hashCode returns similar values for m1, args[0], and "2345" because as interned strings, these have similar reference values as shown in your SOPs. Using a code example, this is how it is initializing:
String someString = "string_info"
//Interning. Constant pool is checked for "string_info" and the reference is assigned to someString variable if "string_info" is found in constant pool.
However, when string is being passed as an argument, this is actually being created as a new string object. The new object is created in memory and hence your code m1 == "2345" returns false. Using example, this is how it is initializing:
String someString = new String("string_info") //a new String object is first created in memory and then assignment of "string_info" is referenced using constant pool look up.