String

作者: couriravant | 来源:发表于2019-12-11 16:43 被阅读0次
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1 == s2);                     
        System.out.println(s1.equals(s2));         
    2.下面这句话在内存中创建了几个对象?
        String s1 = new String("abc");            
    3.判断定义为String类型的s1和s2是否相等
        String s1 = new String("abc");            
        String s2 = "abc";
        System.out.println(s1 == s2);        
        System.out.println(s1.equals(s2));
    4.判断定义为String类型的s1和s2是否相等
        String s1 = "a" + "b" + "c";
        String s2 = "abc";
        System.out.println(s1 == s2);        
        System.out.println(s1.equals(s2));
    5.判断定义为String类型的s1和s2是否相等
        String s1 = "ab";
        String s2 = "abc";
        String s3 = s1 + "c";
        System.out.println(s3 == s2);
        System.out.println(s3.equals(s2));
    
    解答:
        上面所有equals()方法的结果都是true,因为equals()方法在String类中,我们来看下API中的解释
    equals:
        将此字符串与指定的对象比较。当且仅当该参数不为null,并且是与此对象表示相同字符序列的 String 对象时,结果才为true。
        因为String类中字符串是常量;它们的值在创建之后不能更改
    
    第一题中:
        //常量池中没有这个字符串对象,就创建一个,如果有直接用即可
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1 == s2);             //==号比较的是地址值,true    
        System.out.println(s1.equals(s2));         //比较的是字符串的内容:true
    第二题:
        //创建几个对象
        //创建两个对象,一个在常量池中,一个在堆内存中
        String s1 = new String("abc");        
        System.out.println(s1);
    第三题:
        String s1 = new String("abc");            //录的是堆内存对象的地址值        
        String s2 = "abc";                        //记录的是常量池中的地址值
        System.out.println(s1 == s2);             //false
    第四题:
        //byte b = 3 + 4;                        //在编译时就变成7,把7赋值给b,常量优化机制
        String s1 = "a" + "b" + "c";            //java中有常量优化机制,在编译时期就能确定s2的值为"abc",所以编译时期,在常量池中创建"abc"
        String s2 = "abc";                        //执行到这里时常量池中已经有了"abc",所以就不再创建,所以s1和s2指向的是常量池中同一个字符串常量"abc"
        System.out.println(s1 == s2);             //true,java中有常量优化机制    
    第五题:
        String s1 = "ab";
        String s2 = "abc";
        String s3 = s1 + "c";                    //s1是变量,s1与常量"c"相加,会使用StringBuilder的append方法创建堆对象
        System.out.println(s3 == s2);            //false
    

    补充:
    String s = new String("abc")这个语句创建了几个对象的题目。 这种题目主要就是为了考察程序员对字符串对象的常量池掌握与否。上述的语句中是创建了2个对象,第一个对象是”abc”字符串存储在常量池中,第二个对象在JAVA Heap中的 String 对象。

    string.intern()的作用, 如果常量池中存在当前字符串, 就会直接返回当前字符串. 如果常量池中没有此字符串, 会将此字符串放入常量池中后, 再返回

    String s = new String("1"); //创建两个对象,第一个是常量池中的1,第二个是堆中的1
    s.intern(); //此时,常量池中有1,所以s的引用还是指向堆中的1
    String s1 = "1"; //发现常量池中已有1,将常量池中的1返回给s1
    System.out.println(s == s2); //false

    String s = new String("1");
    String s2 = "1";
    s.intern();
    System.out.println(s == s2); //false

    String s3 = new String("1") + new String("1"); //只有堆对象11,11没有在常量池
    s3.intern(); //s3放入常量池
    String s4 = "11"; //用了常量池中的11
    System.out.println(s3 == s4); // true

    String s3 = new String("1") + new String("1");
    String s4 = "11";
    s3.intern(); //常量池已有11,返回堆11对象
    System.out.println(s3 == s4); //false

    相关文章

      网友评论

          本文标题:String

          本文链接:https://www.haomeiwen.com/subject/uhfagctx.html