http://blog.csdn.net/xyz1982510/archive/2008/09/12/2916467.aspx
看过上面详细的解释贴,但还是有疑问。在此请求解答。文中说:
String是一个特殊的包装类数据。可以用:
String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
问题一:String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true问题二:String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false问题三:String s1 = "ja";
String s2 = "va";
String s3 = "java";
String s4 = s1 + s2;
System.out.println(s3 == s4);//false
System.out.println(s3.equals(s4));//true根据上面解说,能理解问题一和问题二。
但是关于问题一还有一个疑问:这个str1和str2是不是在栈里,"abc"只有一个,在堆里。str1跟str2的值都是"abc"的起始地址,是否是这样?
关于问题三,计算s4=s1+s2的时候 栈和堆是怎么分配的,谢谢!!!!!
看过上面详细的解释贴,但还是有疑问。在此请求解答。文中说:
String是一个特殊的包装类数据。可以用:
String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
问题一:String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true问题二:String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false问题三:String s1 = "ja";
String s2 = "va";
String s3 = "java";
String s4 = s1 + s2;
System.out.println(s3 == s4);//false
System.out.println(s3.equals(s4));//true根据上面解说,能理解问题一和问题二。
但是关于问题一还有一个疑问:这个str1和str2是不是在栈里,"abc"只有一个,在堆里。str1跟str2的值都是"abc"的起始地址,是否是这样?
关于问题三,计算s4=s1+s2的时候 栈和堆是怎么分配的,谢谢!!!!!
解决方案 »
- Struts2 的 Action 类里怎么创建 session request response out 对象
- 表单中的控件名字是动态的 怎么获取他的值
- 【控件】Java程序员要掌握的十个JSP中的标签库
- 两个jsp select option中的值传递哪里错了
- 招聘职位:JAVA高级程序员/系统分析员
- 求:关于eclipse的一个不解
- 请教关于 正则表达式 的问题
- 用参数引用一个类的变量或方法的问题
- 我怎么运行(调用)我的EJB呀(在发布和部署后)?
- dom/sax/jdom等解析xml時,那個更快?
- ssh中,则样在类中配置查询出的结果集按照创建时间降序排列
- (求教)如何用jxl导出大批量(几十万条)数据到Excel?
s1-s3都在栈内,各自的值是对应字符串在栈内的地址?可以这样理解么?那么在分配S4的时候是怎么操作的,求解!
朋友,更糊涂了。
比如:String str = "abc"; 之前看到的理解:栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
而你给我资料:这种类型的声明我们都可以理解为他们的内存地址就是相应的值,即把他们当成基本数据类型来理解。
这两个是否一样?我觉得我已经进死胡同了。
按我的理解是,即使是基本数据类型,比如int a=1
的意思是,栈内有2个地址,一个地址比如0x0001,另一个0x0010,一个存放a,一个存放1, 前者指向后者。
同理对于String str = "abc" 两个地址0x1001,0x1011,分别存放str和abc,前者指向后者。
这样理解是错的么? 我纠结了。 请帮忙解答
String str = "abc";是放在池里的String str =new String("abc");这个"abc"是放在堆里的为什么String a="abc";
String b = "a"+"b"+"c";
为什么a==b为true?因为编译器在编译时自动将"a"+"b"+"c"优化为"abc"所以ab的引用时一样的String s1 = "ja";
String s2 = "va";
String s3 = "java";
String s4 = s1 + s2;
System.out.println(s3 == s4);//false为什么这个不等?因为s4是2个字符串对象的相加,会在堆里开辟内存,所以引用不一样