创建对象
拥有一个引用,并不一定需要有一个对象与他关联。因此,如果想要操作一个词或句子,则可以创建一个String引用:
String s;
一旦创建了一个引用,就希望它能与一个新的对象相关联。通常用new关键字。创建一个新的对象
String s= new String("asdf")
创建的对象存储在什么地方?
- 寄存器 这是最快的的存储区,因为它位于不同与其他存储区的地方 ---- 处理器内部 但是寄存器的数量极其有限,所以寄存器根据需求进行分配。不能直接操作
- 堆栈 位于通用RAM(随机访问存储器)中,但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放内存,这是一种快速有效的分配存储方法,仅此于寄存器,创建程序时,java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些java数据存储于堆栈中 ---- 特别是对象引用,但是java对象并不存储在这里
- 堆 一种通用的内存池(也位于RAM区),用于存放所有的Java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆的存活时长,因此在堆中分配存储有很大的灵活性;当然,这一灵活性必须付出相应的代价:用堆进行存储分配和清理可能比用堆栈需要更多时间
- 常量存储 常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分隔离开,所有这种情况可以将它存放在ROM(只读存储器)中【这种存储区的一个例子:字符串池。所有字面常量字符串和具有字符串值的常量表达式都自动是内存限定的,并且会置于特殊的静态存储区中】;
- 非RAM存储 其中两个基本的例子是 流对象 和 持久化对象 ,在流对象中,对象转化为字节流,通常被发送给另一台机器。在"持久化对象" 中,对象被存放在磁盘上,因此,即使程序终止,它们仍可以保持自己的状态。这种存储方式的技巧在于:把对象转化为可以存放在其他媒介上的事物,在需要时,可恢复成常规的、基于RAM的对象
例如:String的常见面试题
String str="i"与 String str=new String(“i”)一样吗? 不一样,因为内存的分配方式不一样。
- String str="i"的方式,java 虚拟机会将其分配到常量池中;
- 而 String str=new String(“i”) 则会被分到堆内存中;
String s = new String(“xyz”);创建了几个String Object? 分两种情况:
- 如果String常量池中,已经创建"xyz",则不会继续创建,此时只创建了一个对象new String(“xyz”),此时为一个Object对象;
- 如果String常量池中,没有创建"xyz",则会创建两个对象,一个对象的值是"xyz",一个对象new String(“xyz”),此时为二个Object对象
|