美文网首页zi
Java中String类的常见面试题

Java中String类的常见面试题

作者: ldlywt | 来源:发表于2016-06-27 22:36 被阅读1699次

    第一题:==与equals()的区别

    1.判断定义为String类型的s1和s2是否相等
        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"相加
        System.out.println(s3 == s2);            //false
    

    第二题:String字符串与BufferString的传递问题

    public class Demo7_StringBuffer {
        /**
         * 
        基本数据类型的值传递,不改变其值
        引用数据类型的值传递,改变其值
        
        String类虽然是引用数据类型,但是他当作参数传递时和基本数据类型是一样的
         */
        public static void main(String[] args) {
            String s = "heima";
            System.out.println(s);
            change(s);
            System.out.println(s);
            
            
            System.out.println("---------------------");
            StringBuffer sb = new StringBuffer();
            sb.append("heima");
            System.out.println(sb);
            change(sb);
            System.out.println(sb);
        }
        public static void change(StringBuffer sb) {
            //调用该方法时实际参数的sb和形式参数的sb指向的是同一个对象(StringBuffer容器)
            //方法内部又在该容器里添加了"itcast",所以方法结束时,局部变量的sb消失,但是实际参数的sb所指向的容器的内部的内容已经发生了改变
            sb.append("itcast");
        }
        public static void change(String s) {
            s += "itcast";
        }
        //为了便于大家理解,再建立一个changeString方法
        public static void changeString(String str) {
            //因为str是属于局部变量,在调用该方法是实际参数s和形式参数str指向同一个字符串对象
            //但是在方法内部将str又指向了一个新的字符串对象,而此时s还是指向的原来的字符串对象
            //changeString方法执行完毕,局部变量str消失,方法内部产生的新的字符串对象称为垃圾
            //但是s还是指向的原有的字符串对象,并没有改变
            str += "itcast";
        }
    }
    

    第三题:Integer的面试题

        Integer i1 = new Integer(97);
        Integer i2 = new Integer(97);
        System.out.println(i1 == i2);
        System.out.println(i1.equals(i2));        //false
        System.out.println("-----------");
    
        Integer i3 = new Integer(197);
        Integer i4 = new Integer(197);
        System.out.println(i3 == i4);
        System.out.println("-----------");        //false     
    
        Integer i5 = 97;
        Integer i6 = 97;
        System.out.println(i5 == i6);
        System.out.println("-----------");        //true
    
        Integer i7 = 197;
        Integer i8 = 197;
        System.out.println(i7 == i8);            //false
    
        /*
         * -128到127是byte的取值范围,如果在这个取值范围内,自动装箱就不会新创建对象,而是从常量池中获取
         * 如果超过了byte取值范围就会再新创建对象
         * 源码分析:
         * public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)            //i>= -128 && i <= 127
        return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
        }
         */

    相关文章

      网友评论

      本文标题: Java中String类的常见面试题

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