初识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
后来查了一下资料发现是这样的
马上又出现了一个新问题
包装类是什么?
所谓包装类,就是能够直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类。Java共有六个包装类,分别是Boolean、Character、Integer、Long、Float和Double,从字面上我们就能够看出他们分别对应于 boolean、char、int、long、float和double。而String和Date本身就是类。所以也就不存在什么包装类的概念了。
这是从百度整理来的
那么现在已经大致清楚包装类是个什么东西了
回到问题本身,是什么导致了1≠1
简单地说,也就是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比较会引出一堆问题,有些时候我们在考虑问题时先入为主,认为一些东西理所当然的就该这样,而忽略了其背后的原因、原理。
同时,我们在发现问题时不妨多思考一些相关问题,这样又能获得一些其他知识。
最为重要的是,当我们学会了一个知识,应当记住的是它的思想,而不是代码,只有在掌握好思想后才能举一反三。
资料整理来源,如有侵权会马上删除本篇博客