面试题:关于string类的几道面试题

  1. 判定定义为String类型的str1和str2是否相等,为什么?
package test;

public class StringTest {
    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "abc";
        System.out.println(str1==str2);
        System.out.println(str1.equals(str2));
    }
}

输出结果:
第一行:true
第二行:true

分析:
在java中==是比较运算符,在比较基本类型数据是,比较的是值是否相等,比较引用类型数据时,比较的是两个对象的内存地址是否相等。String类型是属于引用类型数据。例子中把“abc”同时赋值给了str1和str2,因此,str1和str2指向的是同一个内存地址,所以第一个打印语句为true。

打开jdk api中的String类的equals方法 ,有这么一句话 “将此字符串与指定对象进行比较。 其结果是true当且仅当该参数不是null并且是String对象,表示相同的字符序列作为该对象”。由于str1和str2的值都是“abc”,字符序列相同,因此第二行打印结果也为true。

  1. 下面这句话在内存中创建了几个对象
String str = new  String("abc");

答案是创建了两个对象,一个在堆内存中,一个在常量池中,堆内存中的是常量池中对象的拷贝副本。

分析:
当看到new这个关键字,首先想到,new出来的对象都是存储在堆内存中。“abc"字符串是属于常量,所以应该先在常量池中创建对象"abc”。第二个对象通过new出来为什么是拷贝的副本呢?在jdk的api中可以找到答案:初始化新创建的String对象,使其表示与参数相同的字符序列; 换句话说,新创建的字符串是参数字符串的副本。

  1. 判断一下定义的String类型的str1和str2是否相等
 public static void test2(){
        String str1 = new String("abc");
        String str2 = "abc";
        System.out.println(str1==str2);
        System.out.println(str1.equals(str2));
    }

答案是false和true。

分析:
String str1 = new String(“abc”)在常量池和堆内存中创建了一个“abc”,并将堆内存中的内存地址赋给了str1,由于常量池中已经存在了“abc”,所以String str2=“abc”就不在创建对象,直接将常量池中“abc”的内存地址赋值给str2。== 比较的是str1和str2的内存地址,所以str1==str2输出为false,equals比较的是两个字符串的序列是否相等,因此str1.equals(str2)输出为true。

  1. 判断一下定义为String类型的str1和str2是否相等
 public static void test3(){
        String str1 = "a"+"b"+"c";
        String str2 = "abc";
        System.out.println(str1==str2);
        System.out.println(str1.equals(str2));
    }

答案是true和true。
分析:
“a”,“b”,“c"本来就是字符串常量,进行+号拼接后变成了”abc”,所以常量池会立马创建一个"abc"的字符串常量对象,所以String str2 = "abc"这行代码中并不会再创建对象。所以比较内存地址还是比较字符串序列都相等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值