Java习题答案

答案:A


这题考察了:

  1. Object 的 equals() 方法,和 String 重写过的 equals() 方法
  2. 对 String 类型变量的改变,是否会生成新的 String 对象
  3. String 类型的对象是否可变,是否是线程安全的
  4. 运算符重载是什么?+ 号拼接字符串的用法

1)Object 的 equals() 方法,和 String 重写过的 equals() 方法

  1. Object 的 equals() 方法源码

        public boolean equals(Object obj) {
            return (this == obj);
        }
    

    比较的是对象引用是否相同,即两个对象的内存地址是否相同

  2. String 重写过的 equals() 方法

        public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            if (anObject instanceof String) {
                String anotherString = (String)anObject;
                int n = value.length;
                if (n == anotherString.value.length) {
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }
    

    从这里可以看出

        while (n-- != 0) {
            if (v1[i] != v2[i])
                return false;
            i++;
        }
    

    比较了字符串对应字符数组的每一个字符的内容

    所以 String 重写过的 equals() 方法并不是比较对象的内存地址,比较的是 String 对象里的内容

2)对 String 类型变量的改变,是否会生成新的 String 对象

阅读 String 源码即可发现 ,String 对象的字符串内容是被如下的字符数组存储的,而这个字符串数组是被 final 修饰的,是不能改变原字符串的内容的。通常我们所说的对字符串变量的改变,都是 new 了一个新的字符串类型的变量

private final char value[];

3)String 类型的对象是否可变,是否是线程安全的

根据 2)中可知,String 类型的变量不可变。

那为什么可以说它线程安全?

  • 假设现在有一个字符串对象是多个线程的共享数据,由于 String 类型的变量不可变,这些线程并不能改变它的内容,因此也不会引发共享数据改变而带来的安全性问题

4)运算符重载是什么?+ 号拼接字符串的用法

先来看一下运算符重载的定义:

  • 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型

但是,Java 不同于 C++,为了避免语言的复杂性,Java 里面用户是无法自定义重载运算符的

那 “String 可以使用 + 进行拼接” 这个表述是对的,应该怎么理解这句话?

  • Java 里面的 + 拼接字符串,底层是通过 new 了一个 StringBuilder 的实例对象,通过调用该实例对象的 append() 方法来实现字符串拼接的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值