从String s=new String(“abc“)创建了几个对象说起

答案肯定是两个
java创建一个类的实例有两种:

  1. new
  2. 调用Class类的newInstance方法,利用反射机制创建对象。
    String str=new String(“abc”) new出来的有个对象,并将对象的引用(或者叫句柄)赋值给了str变量,被调用的构造器方法接受的参数也是个String对象,这个对象时"abc",所有又要引入领完一种创建String对象的方式——引号内包含文本。
    这种方式是String特又的与new方式有很大区别。
    jvm中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用。String类是final的,他的值一经创建就不可改变,因此不用担心String对象共享带来的程序混乱,字符串池维护,可以调用intern()方法来访问字符串池,
    String =“abc”,这行代码被执行的时候,jva虚拟机首先在字符串池中查找是否已经存在值为"abc"的这么一个对象,判断依据是equal方法的返回值,如果没有就先创建这个对象,把它加入到字符串池中,再将它的引用返回。

引号包含文本的方式来创建String对象以提高效率。实际上也常常采用。

栈(stack):主要保存基本数据类型(也叫内置类型)(byte short int long float double boolean char)和对象引用,数据可以共享,速度仅次于寄存器,快于堆。
堆(heap):用于存储对象

java内存对象,需要展开去说。

你可能感兴趣的:(java学习)