直接量是指:在程序中,通过源代码直接指定的值。

 1.字符串直接量:

String s1="zcyoung";  
String s2="zc"+"young";  
System.out.println(s1==s2);

 输出结果为true,s1与s2均指向字符串常量池相同的地址

2.字符串对象

String s1="zc";  
String s2=new String("zc");  
System.out.println(s1==s2);

输出结果为false,首先 s1为一个字符串直接量,当定义了s1后,会在字符串池中查找是否存在该字符串,即"abc",如果不存在,就会创建一个字符串对象"abc",并将该对象存入字符串池中,当下次再使用"abc"时,就会直接指向字符串池中的该字符串。
而s2定义时是首先在堆里new了一个字符串对象,该对象又指向了字符串直接量"abc"。而对于引用使用(==)来比较,是比较引用中所存的对象的地址。s1存的地址是字符串池中的字符串的位置,而s2存放的是堆中的new出来的那一块内存地址。所以s1==s2输出当然为false。
另外s2在创建时一共创建了2个对象,第一个是new出来的存放在堆当中的,第二个是"abc"这个直接量。

下面这段代码又有不同的问法,问这段代码创建了几个对象:

String temp = "hello";  // 在常量池中
String str = new String(temp); // 在堆上12345

题目中的String创建方式,是调用String的有参构造函数,而这个有参构造函数的源码则是这样的public String(String original),这就是说,我们可以把代码转换为下面这种:

这段代码就创建了2个String对象,temp指向在常量池中的,str指向堆上的,而str内部的char value[]则指向常量池中的char value[],所以这里的答案是2个对象。

假如就只有这一句String str = new String("hello")代码,并且此时的常量池的没有"hello"这个String,那么答案是两个;

如果此时常量池中,已经存在了"hello",那么此时就只创建堆上str,而不会创建常量池中temp,(注意这里都是引用),所以此时答案就是一个。

3.字符串运算

String s1="abc";  
String s5="a";  
String s6=s5+"bc";  
System.out.println(s1==s6);

输出为false

String s1="abc";  
final String s5="a";  
String s6=s5+"bc";  
System.out.println(s1==s6);

输出为true,第二段代码与第一段代码的区别在于 s5定义成为了final类型的,所以在编译时期就能将s6中的s5直接替换成“a”,最终s6也就指向了与s1相同的内存区域。这里使用到了宏变量和宏替换的概念。





你可能感兴趣的文章

评论区

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

您好,欢迎到访网站!
  查看权限

«   2018年6月   »
123
45678910
11121314151617
18192021222324
252627282930

最新留言