Java 面试 之String

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

关于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
*/
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值