String s=“123” 跟String S = new string("123") 区别

String s=“123” 和String S = new string("123") 区别
这个问题,看了很多资料,帖子也看了很多,但是各人有各人见解;而且,有的帖子实在是误导人.........
大家分析从以下几个王方面分析看看
1、创建对象的个数
2、对象的保存位置
3、创建对象的方式

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

String s="123" 创建一个对象“123” 放入常量池中
String s=new String("123") 创建两个对象,首先new String()的参数是String对象,创建“123”放入常量池,然后在new一个对象放入堆中


常量池里的数据不能称之为对象

常量池中包含多种类型,包括java基本数据类型、对象型(如:String)、等等。具体可搜索下常量类型表


常量池只是一种说法,在JVM规范里就是class的一部分,在实现上就是方法区里的一个内存块,何来的对象一说?对象是对堆里数据结构的一种抽象描述,方法区里没有这种描述
------解决方案--------------------
引用:
可是有面试官,在问过==,equals之后;就问了, String s="123" 和 String s=new String("123")  区别有什么区别?
然后答了一些看法,面试官说,你这基础比较差劲.........

莫非面试官想让你从JVM的角度去解释,什么方法区啊,常量池,堆栈这些角度去说,而不是单单的知道他们一个在堆,一个在栈。这里面都是JVM自己的实现,JVM里面的东西也常在改变,所以我觉得过分较真这个东西没有什么意义。java是个语言,我们主要是用它,能用起来就可以了。