首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

黑马软件工程师——字符串相关

2012-08-30 
黑马程序员——字符串相关android培训、java培训、期待与您交流! 字符串相关(String) public static void main

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

android培训、java培训、期待与您交流!

字符串相关(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。


---------------------- android培训、java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

热点排行