相信许多的人都会被问到String x="a"和new String ("a")有什么区别吧
如果想要弄清楚这两者之间的差别,首先就得了解不同的存储区。
1.了解存储区
堆:通过new出来的对象都是存储在这里。
栈:存储基本类型和应用类型的地址,比如int a=1。
常量池:它属于方法区,顾名思义就是存储一些常量的地方。
2.具体分析
1.String
String x="abc";
首先会在常量池中查看是否存在字符串"abc",如果存在则无需创建,如果常量池中不存在则对其进行创建。
String x="a"+"b";
String y="ab";
那么x==y是否成立呢?答案是true,因为x生成的"ab"字符串会存入到常量池,而y则是在常量池中获取的"ab",所以他们两个相等。
2.new String
String x=new String("a");
首先判断这里生成了几个对象,有可能是1个,也有可能是2个。
2个是因为,只要出现了new则会在堆中生成一个对象。而后如果在常量池中不存在"a",则需要在常量池中创建。1个则是常量池中存在字符串,无需创建。
3.总结
String x="a",String y=new String("a")
x==y返回的是false,这里就又衍生出了一个问题==和equals的区别?
通过上述的描述,相信大部分人对于文章开头的问题已经有了答案。
所以总结就是String x="a"和new String("a")是不相同的。