黑马程序员——字符串相关

[url=http://edu.csdn.net/heima]android培训[/url]、[url=http://edu.csdn.net/heima]java培训[/url]、期待与您交流!

字符串相关(String)
public static void main(String[] args)
{
String s = new String("abc");

String s1 = "abc";

String s2 = new String("abc");

System.out.println(s == s1);

System.out.println(s == s2);

System.out.println(s2 == s1);
}
问题描述:
① 当执行完第6行代码的时候,在内存里生成几个对象,分别是什么,在什么地方。
② 当执行完第8行代码的时候,在内存中共有几个对象,分别是什么,在什么地方。
③ 当执行完第8行代码的时候,在内存中共有几个对象,分别是什么,在什么地方。
④ 当程序执行完后,输出的结果是什么。
解:
① 首先在String Pool里边生成一个对象,值为“abc”,当程序运行到第6行的时候,回到String Pool中查找看看有没有“abc”这个对象,因为String Pool中没有“abc”对象,所以虚拟机会把第6行括号里面的“abc”对象放到String Pool里边,接下来执行new String(“abc”)方法在堆内存中又生成一个内容为“abc”的对象。S指向该堆内存中的对象,所以有两个对象,一个在String Pool中,一个是在堆内存中。
② 当执行完第8行语句的时候,内存中没有生成新的对象。因为当定义一个字符串时,如果使用的是常量值而不是用new的方式定义的时候,java首先还是到String Pool中查找看有没有内容为该常量值的对象存在。因为之前在String Pool中已经生成“abc”对象,就不会再生成了。继而s1的引用会指向String Pool中的“abc”对象。
③ 只要java中有new关键字就会生成新的对象。会在堆内存中又生成一个内容为“abc”的新对象,并且s2引用指向这个对象。
④ 在java中“==”对原生数据数据类型来说比较的是他们的值,而对于引用类型来说永远比较的是他们的地址,也就是说它们是不是指向同一个对象。所以上述的程序返回的都是false;

问题描述2:
如果上述程序后面加上
System.out.println(s == s.intern());
System.out.println(s == s1.intern());
System.out.println(s1.intern() == s2.intern());
运行结果如何?
解:
当s.intern()方法被调用的时候java会到String Pool中检查有没有内容为“abc”这个对象,如果有的话s.intern()方法的返回值就是String Pool中“abc”对象的地址,即s1,因为s和s1指向的不是一个对象,所以第一个返回的是false,同理后两个为true。
问题描述3:
String hello = "hello";
String hel = "hel";
String lo = "lo";

System.out.println(hello == "hel" + "lo");
System.out.println(hello == "hel" + lo);
执行结果如何?
解:
字符串执行“+“操作时,当加号两边都是字面的常量值的时候,java会在String Pool中查找有没有和组合内容相等的对象,如果有的话直接返回该内容的地址,所以第一个输出是true。当加号两边有一个不是字面的常量值时,而是通过引用赋给的值时,java会在堆内存中新生成一个对象,所以第二行输出为false。


---------------------- [url=http://edu.csdn.net/heima]android培训[/url]、[url=http://edu.csdn.net/heima]java培训[/url]、期待与您交流! ----------------------

详细请查看:[url=http://edu.csdn.net/heima]http://edu.csdn.net/heima[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值