在回答这个问题前,我们先明确几个概念:
1、 java中数据类型:基本数据类型和引用数据类型;
2、 java中虽然没有说明程序在运行的时候,内存是如何分配的,不过通常java开发人员或学习者,会将内存分为三个区域:栈空间、堆空间、方法区;
堆区:
a.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
b.jvm只有一个堆区被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
a.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
b.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
c.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
a.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
b.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。字符串常量在方法区分配 ,数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小。
上面明白之后,接下来我们来分析 String str=new String("abc");
String str 是定义了一个String类型的变量,此时只定义了而没有创建对象,而new Sring(“abc”)到底做了什么?我们可以查看String的源码,发现如下:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
/** The value is used for character storage. */
private final char value[];
……
发现她有一个Value的属性,类型是char[],而此数组又做了什么事情?如果读源码会发现他保存了String对象的值,此时也说明String就是char[]来组织的。
当执行String a="abc";时,JAVA虚拟机会在栈中创建三个char型的值'a'、'b'和'c',然后在堆中创建一个String对象,它的值(value)是刚才在栈中创建的三个char型值组成的数组{'a','b','c'}对象,而这个新创建的String对象会被添加到字符串池中。
此时就存在了两个对象:一个在堆中;一个在字符串池中。
java中String str=new String("abc");创建几个对象一 转载
没有更多推荐了 [去首页]