比较String与new String()的区别
String str1="123";
String str2=new String("456");
String str3=new String("456");
这两种声明变量是有区别的
1.str1会创建一个对象或者不会创建一个对象,其中出现了一个字符串实例池的概念,实例池中存放许多字符串,当声明的字符串已经存在实例池中,该语句就不会创建对象而直接引用池中的字符串。当字符串并不存在实例池中就会创建对象,并放入实例池中。
总的来说:就是再栈区创建str1的引用,然后在字符串实例池中去查找是否存在字符串的内容,如果存在直接引用,不存在则创建并放入实例池中。
2.str2不管怎样都会创建新的对象而且是两个对象,首先在栈中创建str2的引用对象,然后在堆中创建一个包含字符串的对象,str2保存的值包含字符串的对象的内存地址。
而str2==str3;结果为false,因为引用对象的地址不一致。
简单描述==与equals的区别
简单说,==比较的是变量在栈内存中存放的内存地址,而equals比较的是变量在栈内存中存放的内存地址所指向的那个对象的值。
简单描述对象与对象和对象与字符串相加的区别
String a="abc"
String b="asdf";
String c=a+b;
String d=a+"adsfds";
1.a+b:表示先合并字符串,然后去字符串实例池中查找
2.a+“adsfds”:表示通过创建StringBuffer(或者StringBuilder),之后再转化为String类,实际上new了对象,并且在堆上进行。