JAVA常见对象String中常见的面试题

本文探讨了Java中String对象的比较,包括`==`运算符和`.equals()`方法的使用。解释了常量池和堆内存中String对象的创建与引用,以及concatenation操作如何影响对象创建。通过示例展示了不同初始化方式下对象相等性的判断结果。
摘要由CSDN通过智能技术生成

        判断定义为String类型的s1,s2是否相等

        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));

     都是true,equals方法是将此字符串与指定对象比较,当且仅当该参数不为null,并且是与此对象表示相同字符序列的String对象时,结果才为true,==号比较的是地址值,abc在常量池中,s1通过地址值找到abc,但由于常量池中已经存在abc,所以s2需要时不再创建,直接指向abc,因此s1,s2是同一个地址值。

    下面这句话在内存中创建了几个对象

String s1 = new String("abc");                                                                 

 两个对象,在常量池里面创建了对象abc,然后在堆里面创建了对象把abc拷贝过去有一个地址值,然后再把地址值给s1。常量池跟堆内存中的地址值是不一样的

判断定义为String类型的s1和s2是否相等

String s1 = new String("abc");

String s2 = "abc";

System.out.println(s1==s2);

System.out.println(s1.equals(s2));

 false,true。因为常量池跟堆内存中的地址值是不一样的,因此输出结果为false

判断定义为String类型的s1和s2是否相等

String s1 = "a" + "b" + "c";

String s2 = "abc";

System.out.println(s1==s2);

System.out.println(s1.equals(s2));

都是true,因为java中有常量优化机制,在编译时就变成了把”abc“赋值给s1。 

判断定义为String类型的s1和s2是否相等

String s1 = "ab";

String s2 = "abc";

String s3 = s1 + "c";

System.out.println(s2==s3);

System.out.println(s2.equals(s3));

false,true。 因为常量池中在s1,赋值之后常量池只有ab,s2赋值时是一个新的常量abc,s3赋值时,由于通过加号串联,因此创建了一个StringBuffer(或是StringBulids)对象在堆中通过append方法将ab和c加在一起成为abc,调用ToString方法转换成对应字符串,最终s3的地址值是这个String对象的地址值。JAVA语言提供对字符串串联符号“+”以及其他对象转换为字符串的特殊支持,字符串串联是通过(StringBuilder或者StringBuffer)类及其append方法实现的,字符串转换是通过ToString方法实现的,该方法由Object类定义,并可被JAVA中的所有类继承,有关字符串串联和转换的更多信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值