现在的位置: 首页 > 综合 > 正文

Java 面试 之String

2013年08月23日 ⁄ 综合 ⁄ 共 1524字 ⁄ 字号 评论关闭

端正认识,面试题不论是在面试中,还是工作都有帮助

关于String 的比较,详细看以下代码

package com.zgct;

public class StringTest

{

     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(s1 == s2);
System.out.println(s == s1.intern());
System.out.println(s1 == s1.intern());
System.out.println(s1.intern() == s2.intern());


/** 当main方法里面第一行代码执行完后,产生两个对象,一个在池,一个在堆。一个对象是abc,它在String pool(String 池)里面; 
* 另一个对象是new String("abc"),它在Java的内存堆(heap)里面,  s是对象的引用(reference),也就是地址,s指向这个对象

* 当执行到main方法里面第二行代码时,没有生成新对象。因为这时Java首先在String pool查找有没有 abc 这样的字符串,在这里是可以找到,
* s1 这个引用指向abc这个对象

* 当执行到main方法里面第三行代码时,产生一个对象。Java首先到String pool里查找有没有abc这样的字符串,在这里是可以找到;产生的对象
* 是new String("abc"),它也在Java内存堆里面,注意这个对象绝不是第一行产生的那个对象, s2 是此对象的引用,s2指向此对象
*  
*  到现在,s1 表示String pool里面的对象,s,s2都表示引用,但指向的对象不同
*  在Java 中 == 比较的永远是两个对象的内存地址, 也就是说比较==两边的引用是不是指向同一个对象
*  因此前三行打印结果都是false
*
* 当执行到main方法里面第7行代码时,intern方法 首先查找String pool有没有s指向的对象的值abc,
* 在这里是有,abc是s1的值, 这样一个引用s与String pool池的s1比较肯定是不同的,返回false

* 当执行到main方法里面第8行代码时,s1.intern()返回String pool池的一个值,与s1完全相同,返回true
*
* 当执行到main方法里面第9行代码时,s.intern()返回String pool池的一个值,s2.intern()也返回String pool池的一个值,
* 两个值是abc, 因此返回true
*/

String hello = "hello";
String hel = "hel";
String lo = "lo";
System.out.println(hello == "hel" + "lo");
System.out.println(hello == "hel" + lo);

/** 当执行到main方法里面第13行代码时,"hel" + "lo" 两个常量返回String pool 池的"hello",
* hello对象也指向String pool池的"hello",返回true

* 当执行到main方法里面第14行代码时,由于lo是String变量,它跟"hel"相加将会在Java的堆里生成一个新的对象,
* hello是在String pool池中,一个在池,一个在堆,因此返回false
*/
     }
}

抱歉!评论已关闭.