java萌新的进化旅程01

初识java(01)

作为一名第一次接触java的萌新,很多东西改变了我的认知,使我意识到以往思考方式的不全面。

比如:“1≠1”

这个神奇的东西开始让我意识到java这门编程语言水有多深
让我觉得java是个有趣的东西
代码如下:

public class Test1 {
    public static void main(String[] args) {
        Integer a=new Integer(1);
        Integer b=new Integer(1);
            System.out.println(a==b);
    }
}

其结果居然是 false

后来查了一下资料发现是这样的

Integer
马上又出现了一个新问题

包装类是什么?

所谓包装类,就是能够直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类。Java共有六个包装类,分别是Boolean、Character、Integer、Long、Float和Double,从字面上我们就能够看出他们分别对应于 boolean、char、int、long、float和double。而String和Date本身就是类。所以也就不存在什么包装类的概念了。

这是从百度整理来的

那么现在已经大致清楚包装类是个什么东西了


回到问题本身,是什么导致了1≠1

Interger内存

简单地说,也就是Integer(包装类)里面存的其实是一个内存地址,而不是一个数值

到这里豁然开朗


然而这个问题到这里还没有结束
运行下面代码会发现结果为true

public class Test1 {
    public static void main(String[] args) {
        Integer a=new Integer(1);
        int b=1;
            System.out.println(a==b);
    }
}

原理如下

在这里插入图片描述

简单地说,当一个Integer(包装类)遇到一个int(基本数据类型)还是按照int(基本数据类型)来看就ok了


你以为到这里就完了?

下面又出现了一个蜜汁情况

public class Test1 {
    public static void main(String[] args) {
        Integer a=new Integer(1);
        Integer b=1;
            System.out.println(a==b);
    }
}

其运行结果是false

查阅资料发现原来是这样

在这里插入图片描述


到这里结束了吗?

还没!

public class Test1 {
    public static void main(String[] args) {
        Integer a=new Integer(130);
        Integer b=new Integer(130);
            System.out.println(a==b);
    }
}

false,是的,是false

此后博主就陷入怀疑人生阶段
然后在正式上课时听老师讲解才明白

首先,为了知道在按下run之后这段程序发生了什么,我们需要参考源码

在这里插入图片描述
这里使用的是source insight4.0

然后在这里输入想要查找的东西

在这里插入图片描述

查找内容如下

private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty(“java.lang.Integer.IntegerCache.high”);
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}

也就是说

这个Integer new一个数字是有取值区间的

其区间为-128—127

而130已经超出了这个区间


到了这里,问题完了吗?
暂时完了

以前从来都没有想过一个简简单单的1和1比较会引出一堆问题,有些时候我们在考虑问题时先入为主,认为一些东西理所当然的就该这样,而忽略了其背后的原因、原理。

同时,我们在发现问题时不妨多思考一些相关问题,这样又能获得一些其他知识。

最为重要的是,当我们学会了一个知识,应当记住的是它的思想,而不是代码,只有在掌握好思想后才能举一反三。




在这里插入图片描述资料整理来源,如有侵权会马上删除本篇博客

猜你喜欢

转载自blog.csdn.net/YaeSakuraZR/article/details/83870442