学习 臧圩人的面试题详解后总结 及费解的问题

 

 1  怎么样的对象在编译类时就放入字符串池中?

 

  只有 定义为 final  并且在初始化时赋值的 字符串常量,才会在编译时就放入字符串池中的。

 

 因为变量是在调用时才能确定其值的,所以在编译时不会将变量放入常量池中的。

 

 也就是说只有常量才会放入字符串池中的。

 

2 关于“ + ”

 

  只有两个引号包含文本的对象 相“+” 才会放入字符串池中。也就是前面说过的---只有常量才会放入字符串池中的。

 

 

 

3 关于 String.intern

 

 

    String a = "ab";
   String b = "cd";
   String c = "abcd";
   
   String a2 = a.intern();
   
   if("ab"==a2){
    System.out.println("a2 放入字符串池中");
   }else{
    System.out.println("a2 没有放入字符串池中");
   }
   
   String a3 = "ab"+"cd";
   
   if("abcd"==a3){
    System.out.println("a3 放入字符串池中");
   }else{
    System.out.println("a3 没有放入字符串池中");
   }
   
   
   String a4 = a.intern()+b.intern();
   
   if("abcd"==a4){
    System.out.println("a4 放入字符串池中");
   }else{
    System.out.println("a4 没有放入字符串池中");
   }
   
   
   String a5 = a3.intern();
   
   if("abcd"==a5){
    System.out.println("a5 放入字符串池中");
   }else{
    System.out.println("a5 没有放入字符串池中");
   }
   

 

   输出结果:

            a2 放入字符串池中
            a3 放入字符串池中
           a4 没有放入字符串池中
           a5 放入字符串池中

 

 

  jdk    给出  intern()    的解释是:

 

           返回字符串对象的规范化表示形式。

           一个初始为空的字符串池,它由类 String 私有地维护。

           当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确          定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

         它遵循以下规则:对于任意两个字符串 st,当且仅当 s.equals(t)true 时,s.intern () == t.intern() 才为 true

 

 

问题:

   当 a2 = a.intern 时,池中已经有“ab” 所以输出为放入字符串池

   同理  a.intern 时返回的是“ab”;

 

   但是  同理  哪么  String a4 = a.intern()+b.intern();  应该就等于  ="ab"+"cd"; 等于String a3 = "ab"+"cd";

   但是返回的结果却是字符串池中有a3,没有a4,哪么  a.intern()+b.intern();   返回的应该是什么?

 

 

  当 a4执行完后   执行 String a5 = a3.intern();
  返回是 a5 放入字符串池中   就是说 a4 执行得到结果不是“abcd” 而是另一个对象“????”

  因为字符串池中没有“????”, 所以放入字符串池中,所以 执行a5 的时候 池中是有“????”这个对象的

 

  哪么 String a4 = a.intern()+b.intern();   到底返回的“????” 到底是什么

 

 

问题已经解决:

 

 虽然 a.intern()+b.intern() 返回的是“ab”+“cd”   但是他们的值是在创建对象的相加运算的时候才确定的值,也就是  说他们 是变量,是不没有放入常量池中   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值