zoukankan      html  css  js  c++  java
  • Java字符串面试(二)

    先看下面2个程序

    1. public static void main(String[] args) {  
    2.         String a = "a1";    
    3.         String b = "a" + 1;    
    4.         System.out.println(a == b);   
    5.     }  
    1. public static void main(String[] args) {  
    2.     String a = "a1";    
    3.     String b = "1";    
    4.     String c = "a" + b;  
    5.     System.out.println(a == c);   
    6. }  

    第一个程序输出是true,由于“a” 和1算是字符串常量,所以在编译期b的值就确定了,在运行期不会产生StringBuilder对象,所以在运行期,由于“a1“已经在String Pool中存在, 所以对象”a1“的引用同时指向a和b。

    第二个程序中输出是false。因为在运行期才能确定"a"+b的值,所以为了提高效率,在运行期会产生一个StringBuilder对象,对它调用append方法,最后调用toString()方法,返回一个String对象的引用。

     

    下面开始说几个面试题:

    1.

    1. public static void main(String[] args) {  
    2.         //打印true,原因见上面分析  
    3.         String a = "a1";    
    4.         String b = "a" + 1;    
    5.         System.out.println(a == b);  
    6.     }  

    2

    1. public static void main(String[] args) {  
    2.         //打印false,原因见上面分析  
    3.         String a = "ab";    
    4.         String bb = "b";    
    5.         String b = "a" + bb;    
    6.         System.out.println(a == b);    
    7.     }  

    3.

    1. public static void main(String[] args) {  
    2.     //打印true,final说明bb始终指向”b“,不能把其他对象的引用给bb,所以,在编译期,bb的值是确定的,即  
    3.     //"a" + bb的值也是确定的,所以和上面1同理  
    4.     String a = "ab";    
    5.     final String bb = "b";   
    6.     String b = "a" + bb;    
    7.     System.out.println(a == b);    
    8. }  

    4

    1. public static void main(String[] args) {  
    2.     //打印false, 简言之,就是编译期不能确定,在运行期才能确定,因此会产生StringBulder对象,通过toSring()返回一个String  
    3.     //的引用,肯定他a和b的内存地址是不同的。  
    4.     String a = "ab";    
    5.     final String bb = getBB();    
    6.     String b = "a" + bb;    
    7.     System.out.println(a == b);    
    8. }    
    9.   
    10. private static String getBB() {    
    11.     return "b";    
    12. }  

    5

    1. public class Test {  
    2.     private static String a = "ab";    
    3.       
    4.     public static void main(String[] args) {   
    5.         //打印false,true, static数据放在方法区中,其他和不是static的变脸一样  
    6.         String s1 = "a";    
    7.         String s2 = "b";    
    8.         String s = s1 + s2;    
    9.         System.out.println(s == a);    
    10.         System.out.println(s.intern() == a);    
    11.     }   
    12. }  

    分析图如下:

    6

    1. public class Test {  
    2.     private static String a = new String("ab");      
    3.       
    4.     public static void main(String[] args) {  
    5.         //打印false,false,true。分析看后面的分析图  
    6.         String s1 = "a";    
    7.         String s2 = "b";    
    8.         String s = s1 + s2;    
    9.         System.out.println(s == a);    
    10.         System.out.println(s.intern() == a);    
    11.         System.out.println(s.intern() == a.intern());    
    12.           
    13.     }    
    14. }  

  • 相关阅读:
    .Net下的MSMQ(微软消息队列)的同步异步调用
    [收藏]JS获取网页中HTML元素的几种方法分析
    在FireFox下设为首页的解决方法
    如何创建和使用Web Service代理类
    [收藏]61条面向对象设计的经验原则
    [总结]DotNet中用到的加密算法总结
    如何把用SQL语句int型整数转换成二进制数
    彻底杜绝PHP的session,cookie,Cannot modify header错误
    MSN总是报80048820的错误,网上搜的一些资料解决不了,我找到了真正解决办法!
    [收藏]MD5加密的javascript实现
  • 原文地址:https://www.cnblogs.com/Berryxiong/p/6195918.html
Copyright © 2011-2022 走看看