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. }  

  • 相关阅读:
    windows服务启动有界面的程序
    [转发]读取txt防止读到乱码--自动根据文件编码进行读取
    线程UI同步
    SQL2012导出的脚本没有if exists判断
    power designer 设计数据库生成到oracle数据库
    经典三层,单元工作模式出错的解决方案
    EF ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象
    Oracle 11g 客户端连接 oracle 10g 服务端,乱码问题
    EF 连接oracle 基础连接失败 问题解决
    vs2010 oraclelient 引用问题
  • 原文地址:https://www.cnblogs.com/Berryxiong/p/6195918.html
Copyright © 2011-2022 走看看