java基础,每日三题(String、==、equals、数组)

题目均来自牛客网

1、
有以下代码片段:

String str1="hello";
String str2="he"+ new String("llo");
System.out.println(str1==str2);

请问输出的结果是:false
- 解
类似问题连接:
String is immutable. What exactly is the meaning? [duplicate]
Difference between string object and string literal [duplicate]

还有一篇比较好的博文
Java技术——你真的了解String类的intern()方法吗
大致总结:
1)首先String是不可改变的,不可改变是指字符串本身,而不是引用对象。
2)之所以要弄String的这种interning机制是为了加速字符串比较的速度,这样字符串的比较就只需要比较引用是否相同,而不需要一个一个字符去比较
3)当用字面量(literal)即用引号的方式创建字符串时,(String s=”aa”) 首先会在字符串常量区找是否有此字符串,有的话直接引用此字符串,没有的话,在字符串常量区新建一个。
4)第三点也就解释了为什么String类是final的,因为若允许用户自定义继承改变其行为,就会导致一个字符串的改变影响到所有引用了此字符串的变量。
5)使用new String时,是在堆创建的对象,new出来的对象不同,引用自然就不同,而==对于对象的比较是直接比较的引用,因此结果自然是false

2、

Integer i = 42;
Long l = 42l;
Double d = 42.0;

下面为true的是
(i == l)
(i == d)
(l == d)
i.equals(d)
d.equals(l)
i.equals(l)
l.equals(42L)


  • 正确:l.equals(42L)

以Integer为例,它重写的equals源码为:

public int intValue() {
        return value;
    }

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

即一开始就会比较二者的类型是否相等,不相等直接返回false
若是普通数据而言,还会进行自动装箱操作。
以上满足后,再进行真正值的比较
而对于==而言,
stackoverflow上有这个问题
When using == for a primitive and a boxed value, is autoboxing done, or is unboxing done
总结来说就是,
1)如果两边都是包装类型的话,则都不会进行拆箱,直接是引用的比较
但这儿引用又分两种情况
因为Integer有一个缓存区存放了-128~127的int值,
因此,Interger (范围内数1) == Integer(范围内数1)为true
即二者引用是相同的,
而当超过此范围时,两者就是两个独立的包装对象,因此==的结果是 false
2)当==运算符有任何一边是非包装类(且是numeric)时,都会进行自动拆箱操作

3、
Which statement declares a variable a which is suitable for referring to an array of 50 string objects?
char a[][];
String a[];
String[] a;
Object a[50];
String a[50];
Object a[];

  • 解答
    1)对于Object[] x 与Object x[]这两种写法,其实都是一样的,
    但是官方推荐的是Object[] 这种写法
    2)java数据,在声明时是不能指定初始长度的,因此正确的是:
    String a[];
    String[] a;
    Object a[];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值