博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Integer和int及String的总结
阅读量:4947 次
发布时间:2019-06-11

本文共 4066 字,大约阅读时间需要 13 分钟。

秉承着总结发表是最好的记忆,我把之前遇到的问题在这里总结和大家分享一下,希望大家共同进步:

一.Integer和int

首先说下自动拆装箱,基本数据类型转换为包装类型的过程叫装箱,反之则是拆箱,其中最特殊也是面试经常遇到的是Integer,下面总结说明,话不多说,show the code,先猜一下下面这6个题的答案:

1         Integer a1=new Integer(10); 2         Integer b1=new Integer(10); 3         System.out.println("1:"+(a1==b1));//1     4          5         Integer a2=128; 6         Integer b2=128; 7         System.out.println("2:"+(a2==b2));//2 8          9         Integer a3=5;10         Integer b3=5;11         System.out.println("3:"+(a3==b3));//312         13         int a4=3;14         Integer b4=new Integer(3);15         System.out.println("4:"+(a4==b4));//416         17         Integer a5=new Integer(40);18         Integer b5=new Integer(40);19         Integer c5=new Integer(0);20         System.out.println("5.1:"+(a5==b5));//5.121         System.out.println("5.2:"+(a5==b5+c5));//5.222         23         Integer a6=30;24         Integer b6=new Integer(30);25         System.out.println("6:"+(a6==b6));//6

 

让我们看下对应的答案,要养成良好的习惯,先猜完在看答案 >O<

---------------我------是-----答-----案-----分----割-----线------------------

1:false2:false3:true4:true5.1:false5.2:true6:false

 

看了答案之后是不是有点意外,如果你答错了,请继续往下看,下面的具体分析可能会对你有所帮助,但是如果你都答对了并且已经很清楚原因了,那么请你也继续往下看,因为有可能我的分析有不对的地方,还要请你指正出来,不废话了,开始分析:

1.

1         Integer a1=new Integer(10);2         Integer b1=new Integer(10);3         System.out.println("1:"+(a1==b1));//1 false

这个答案为false可能你猜到了,因为包装类属于引用类型,使用new是在堆中创建了一个对象,而且此处用的比较方法时“==”,比较的是内存地址,所以两个对象的内存不一样很正常,如果改为equels比较,结果就为true;

2.

1         Integer a2=128;2         Integer b2=128;3         System.out.println("2:"+(a2==b2));//2 false

这个是自动转换,jvm会自动转换,实际就等同与Integer a=new Integer(128),然后就和上道题一样的解释了,明白了吧。

3.

1         Integer a3=5;2         Integer b3=5;3         System.out.println("3:"+(a3==b3));//3 true

看到答案是不是感觉懵X了,上面不是说的好好的,按照上面的解释,答案就是false啊,但实际却为true,别着急,我来解释,这个就比较特殊了,涉及到jvm的包装类型的缓存机制了,如果Integer要装箱,会先判断值,如果是在-128到127之间,则不会new Integer(X),而是直接从缓存中(常量池)获取的,所以上述的两个值都是取至缓存中的同一个值,所以引用地址是一样的,答案为true,网上关于这一块将的比较详细,如果有想更细致的研究,可以搜索网上的文档,还有源码参考,我就不在Ctrl C V了。

4.

1         int a4=3;2         Integer b4=new Integer(3);3         System.out.println("4:"+(a4==b4));//4 true

说到这个,还有点故事,有一次电话面试,面试官问了我一个这样的问题,当时的我真的是靠懵,但是不知道是我没听清,还是面试官没说明白,说把上述的3换成128,答案就是false,为此,我自己亲自验证,然后又网上搜索,最后确定这个说法是错误的,不管把值换成多少,答案都是true;当Integer和int做“==”比较时,会自动的拆箱,把Integer转换为int类型,然后在值比较。

5.

1         Integer a5=new Integer(40);2         Integer b5=new Integer(40);3         Integer c5=new Integer(0);4         System.out.println("5.1:"+(a5==b5));//5.1 false5         System.out.println("5.2:"+(a5==b5+c5));//5.2 true

如果前面的都看了,这个5.1的答案你可能猜对了,但是这个5.2的答案看着是不是又懵X了,别着急,我再来解释下5.2,当Integer类型做运算时,会自动拆箱,把Integer类型转换为int类型,如果是用“==”做比较,则比较的是值,所以答案是true。

6.

1         Integer a6=30;2         Integer b6=new Integer(30);3         System.out.println("6:"+(a6==b6));//6 false

看完前面的种种情况之后,相信你会猜对这个题的答案了,不仅是猜,而且也能解释个一二了,我就再解释下吧(解释的有点多........),Integer b6=30;会直接从常量池中取,而不会在堆中new Integer(30),所以两个引用的地址不一样,用“==”比较时答案就为false。

看完这些相信大家已经很明白了,然后最后在给大家留个小作业,考验下大家,请看题:

1         int a7=30;2         Integer b7=30;3         System.out.println("7:"+(a7==b7));//7

----------答--------案--------在--------此---------

不用怀疑自己,这个相信你已经会很自信的用自己的知识解释答案了,是的,答案为true,我没有给各位看官下套套。。。。。。只是让大家更坚信自己了~

二.String的常量池
刚才上面说到Integer的常量池了,大家肯定不禁想到String的常量池了,是不是正好可以建立关联记忆了,是的,我也忍不住想总结一下了,那就啰唆几句吧。
先抛个砖......
问:这个会创建几个“abc”?
答:不知道。
这个答案实在是高啊,我也不知道会创建几个,扯淡吧;其实正确的答案是一个或者是两个,因为这个得看常量池,如果常量池中已经存在“abc”这个字符串了,则会在堆中创建一次,
如果常量池中没有“abc”,则会在堆中new一个“abc”,然后在常量池中再创建一个“abc”,
这个就是标准的解释。
以后如果碰到这种类似的题都可以按照这种解释,不管是 还是上面new的方式,jvm都会先检查常量池中是否有该字符串,如果有,则 这种方式就不会再创建新的字符串了,如果是 这种方式,则也会先判断常量池,如果常量池中已经存在,则会只在堆中创建一次;所有的这类题目都可以按照这种思路解释,如果出题的话,可以挖出很多大坑,希望大家以后要小心,下面出个题趁热打铁给大家练练手吧,请看题:

1         String m="abc";2         String n=new String("abc");3         System.out.println("1:"+(m==n));//1 false4         String s="abc";5         System.out.println("2:"+(m==s));//2 true

答案在图中的注释,如果有跳不出坑的童鞋,可以给我留言,我会一一的给你们啰唆的明明白白的。

然后由于联想记忆法,我又想到了String、StringBuffer和StringBuilder的知识了,啊......好烦躁,真想忍不住的在给大家啰唆几句,想想还是算了吧,真的是没完没了T.T

上述的总结中,如果有不一样的观点,或错误,欢迎大神给予指正哦~

 

转载于:https://www.cnblogs.com/littleorange7/p/10152286.html

你可能感兴趣的文章
HashMap详解
查看>>
Adobe Scout 入门
查看>>
51nod 1247可能的路径
查看>>
js05-DOM对象二
查看>>
mariadb BINLOG_FORMAT = STATEMENT 异常
查看>>
jq工具函数(九)使用$.extend()扩展Object对象
查看>>
如何监视性能和分析等待事件
查看>>
PAT 1058. 选择题(20)
查看>>
理解MapReduce计算构架
查看>>
python爬虫Day2:爬取豆瓣电影信息top250
查看>>
ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理
查看>>
Jmeter参数的AES加密使用
查看>>
hdu 2594 Simpsons’ Hidden Talents【kmp】
查看>>
numpy两列数据合并的方法
查看>>
多机联合产生负载
查看>>
kubelet Pod status的状态分析
查看>>
常见错误: 创建 WCF RIA Services 类库后, 访问数据库出错
查看>>
对Javascript面向对象的理解
查看>>
已知一个日期和天数, 求多少天后的日期(是那个超时代码的AC版)
查看>>
CAS 逻辑流程图
查看>>