赞同这句话的我会继续问

解决方案 »

  1.   

    Mark~~
      

  2.   

    字符串和字符串对象是两个概念    你这种说法好像没什么依据吧 ,按照你说的,String  a = "ss",这句代码就有矛盾了,如果“”ss”不是字符串对象,那它怎么可以被String 类型引用。
      

  3.   

    String也是类,即他是一个对象,只不过他比较特殊而已。你可以不用了解它的特殊之处,只需要知道它就是个对象就行了。
      

  4.   

    字符串和字符串对象是两个概念    你这种说法好像没什么依据吧 ,按照你说的,String  a = "ss",这句代码就有矛盾了,如果“”ss”不是字符串对象,那它怎么可以被String 类型引用。这当然有依据咯,你之所以产生这种疑问是因为你理解视角混乱造成的,对于java内的字符串,你不能只从java语言的语法层面去理解,你要从实际的内存结构去理解,如果只是语法层面,你只要知道String是字符串对象即可,但是你要更深入理解它在内存中的形式你就要抛弃java语法层面,从实际内存来出发了。
    你学过C应该知道字符串实际上就是char类型数组以一个空结尾既是字符串,其实java是一样的,因为虚拟机就是C开发的,早在1.6版本,jvm还是开源的。
    具体的内存结构比较复杂,你可以看虚拟机规范,也可以查阅jvm相应书籍,在java中除了字符串还有Class类以及反射相关的一系列东西都和字符串类似,如果你认为java中的类是Class的对象,那你就大错特错了
      

  5.   

    new的都是在堆中
      

  6.   

    作为一个新手程序员,但是爱瞎研究的我:
    在jdk7以前常量池在方法区里面,
    在jdk7的时候放到了永久代中,而永久代在堆中
    在jdk8的时候取消了永久代,改成元空间区(元数据区),而元数据区已经不再jvm上了,之前的版本都还在jvm上,而是在本地内存上,这也是jdk8之后的一个大改变吧,从此元数据区只受内存大小的限制了还有一个对象逃逸问题,如果这个对象开销小并且还没有发生逃逸现象,他会被直接分配到栈上的,所以所有对象都在堆上是不对的