本帖最后由 舞动炫龙 于 2016-1-21 13:31 编辑  
 
1.判断定义为String类型的s1和s2是否相等 
     String s1 = "abc"; 
    String s2 = "abc"; 
     System.out.println(s1 == s2);         //true                 
     System.out.println(s1.equals(s2));     //true 
    解释: 
    1.String类型的字符串是常量,存储在常量池中,常量池中没有这个字符串对象,就创建一个,如果有直接用即可,所以s1和s2里面存储的是一样的地址 
    2.String类中的equals()方法重写了父类的,判断的是相同字符序列的字 
        
 
 
 
2.下面这句话在内存中创建了几个对象? 
     String s1 = new String("abc");    //创建两个对象,一个在常量池中,一个在堆内存中 
     依据:API参考文档: 
            public String(String original) 
            初始化一个新创建的 String 对象,在堆内存中新创建的字符串对象是该参数字符串的副本。  
      解释: 
      1.先在常量池中创建"abc",并分配一个地址值(当然要是常量池中有就直接用不在创建) 
      2.new String就是在堆内存中创建一个对象,然后把常量池中的"abc"的副本放到了堆内存中的new String中,并把分配的地址值赋值给s1,并且和常量池中的地址不一样      
          
 
    
3.判断定义为String类型的s1和s2是否相等 
    String s1 = new String("abc");        //记录的是堆内存对象的地址值             
    String s2 = "abc";                             //记录的是常量池中的地址值 
    System.out.println(s1 == s2);          //false 
    System.out.println(s1.equals(s2));   //true 
4.判断定义为String类型的s1和s2是否相等 
    String s1 = "a" + "b" + "c";     
        解释:java中有常量优化机制,编译器编译的时候就会使其变成"abc"; 就像byte b = 3+4;  在编译时就变成7,把7赋值给b,常量优化机制 
    String s2 = "abc";             
        解释:由于上句就已经在常量池中创建了"abc"了,所以就直接用就行了 
    System.out.println(s1 == s2);        //true 
    System.out.println(s1.equals(s2));//true 
 5.判断定义为String类型的s2和s3是否相等 
    String s1 = "ab"; 
    String s2 = "abc"; 
    String s3 = s1 + "c"; 
    System.out.println(s3 == s2);            //false 
    System.out.println(s3.equals(s2));    //true 
        解释:1.s1指向常量池中的"ab";s2指向常量池的"abc"; 
            2.s1 + "c";字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。也就是说s3里面存储的是堆内存中的地址值 
            3.s2记录的是常量池的地址值,s3记录的是堆内存中的地址值,所以是false 
            
 
 
              
 
 |   
        
 
    
    
    
     
 
 |