String s = "123"; 我的理解是java 会先检查常量池中是否存在相同的字符串,如果找到的话,将s 指向现有的字符串对象。
那如果没有找到的话, 是不是应该会创建一个新的常量对象。
那是否可以说, String s = "123"; 在常量池中不存在 “123” 的时候, 会创建2个对象,一个 s 一个是 常量池中的 “123” 常量?
[quote]那也就是说 句柄 s 不应该是一个被创建的对象?
“123” 如果没有的时候会创建常量对象了?[/quote]
理解正确!句柄(引用)和对象的内存区域都不一样。
顺便补充一点java内存知识:
句柄在栈中,对象实例在堆中。
类来自对现实世界的封装,实例来自非抽象类 是 类的 一个现实版本,能够体现类对
现实世界的封装,所以现实世界,环境不同对应的类会不同,那么这些类的对象对内存的需求不一样,因而对象实例不能在栈中创建。引用是确定的 ,编译时就知道它的大小。故在栈中。引用实际就是java中的指针,就是没有指针符号而已,指向被他引用的
对象。
是的,可以参考这篇文字,有详细解释: http://zangweiren.iteye.com/blog/209895
s 不只是个对对象的引用嘛
s 应该叫句柄,用来操作对象的
[quote]那是否可以说, String s = "123"; 在常量池中不存在 “123” 的时候, 会创建2个对象,一个 s 一个是 常量池中的 “123” 常量?[/quote]
这里最多创建一个,也可能没创建。就是"123"。并将其加到常量池中。s是引用或者叫做句柄。
String s = "123"; 很可能直接引用常量池中的字符串"123",因为它存在了所以不再创建。learnworld 推荐的博客不错可以去看看。