首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

java学习笔记1-string老有关问题

2012-11-10 
java学习笔记1--string老问题老掉牙的问题:1.String s1 abc2.String s2 new String(abc)3.Strin

java学习笔记1--string老问题
老掉牙的问题:
1.String s1 = "abc";
2.String s2 = new String("abc");
3.String s3 = new String();
  s3 = "abc";
以上三者顺序执行,分别创建了几个对象,哪些对象用==运算符,结果返回true?
下面我们来一个一个分析
  字符串有别于其他的基本数据类型,它属于对象(引用)类型。在内存中会为其单开一个存储区--字符串常量池,用来存储这些字符串。
  1.虚拟机JVM在读取到1的代码时,首先去字符串常量池查找,是否有“abc”,如果有则将该字符串的地址引用返回给栈中变量s1,如果没有,则会创建一个字符串对象“abc”,并将该对象的地址引用返回给s1.
   单就本题来看,1中创建了一个对象
2.JVM在读取到2的代码时,会分两个步骤走,第一步类似1,如果有“abc”,则将该字符串常量的地址引用传递给堆中由new关键字新建的一块内存区(类似于将其拷贝一份,存放到新建堆中),然后将堆内存地址引用传递给栈中变量s2。如果没有“abc”,则会新建一个字符串对象“abc”,然后将新建字符串对象放进字符串常量池中,并将该对象地址引用传递给由new关键字新建的一块内存区。接着将堆内存地址引用传递给s2.
  就本题而言,2中创建了1个对象
3.JVM在读取到3的代码时,会先通过new关键字,在堆内存中为新建的对象分配一个存储区,并将该存储区地址引用传递给栈中变量s3。然后会查看字符串常量池中是否存在字符串“abc”,如果存在,则将该字符串的地址引用传递给栈变量s3。如果不存在,则会在字符串常量池中创建该字符串对象“abc”,再而将该对象地址引用传递给s3.
本题中,3中创建了1个对象
s1==s2 --false
s1==s3 --true
s2==s3 --false

新手之言,如有错误和不妥之处,望各位多多指教,不甚感激~~~
O(∩_∩)O~
  

热点排行