Integer和int及String的总结
秉承着总结发表是最好的记忆,我把之前遇到的问题在这里总结和大家分享一下,希望大家共同进步:
一.Integer和int
首先说下自动拆装箱,基本数据类型转换为包装类型的过程叫装箱,反之则是拆箱,其中最特殊也是面试经常遇到的是Integer,下面总结说明,话不多说,show the code,先猜一下下面这6个题的答案:
Integer a1=new Integer(10);
Integer b1=new Integer(10);
System.out.println("1:"+(a1==b1));//1 Integer a2=128;
Integer b2=128;
System.out.println("2:"+(a2==b2));// Integer a3=5;
Integer b3=5;
System.out.println("3:"+(a3==b3));// int a4=3;
Integer b4=new Integer(3);
System.out.println("4:"+(a4==b4));// Integer a5=new Integer(40);
Integer b5=new Integer(40);
Integer c5=new Integer(0);
System.out.println("5.1:"+(a5==b5));//5.1
System.out.println("5.2:"+(a5==b5+c5));//5.2 Integer a6=30;
Integer b6=new Integer(30);
System.out.println("6:"+(a6==b6));//
让我们看下对应的答案,要养成良好的习惯,先猜完在看答案 >O<
---------------我------是-----答-----案-----分----割-----线------------------
1:false
2:false
3:true
4:true
5.1:false
5.2:true
6:false
看了答案之后是不是有点意外,如果你答错了,请继续往下看,下面的具体分析可能会对你有所帮助,但是如果你都答对了并且已经很清楚原因了,那么请你也继续往下看,因为有可能我的分析有不对的地方,还要请你指正出来,不废话了,开始分析:
1.
Integer a1=new Integer(10);
Integer b1=new Integer(10);
System.out.println("1:"+(a1==b1));//1 false
这个答案为false可能你猜到了,因为包装类属于引用类型,使用new是在堆中创建了一个对象,而且此处用的比较方法时“==”,比较的是内存地址,所以两个对象的内存不一样很正常,如果改为equels比较,结果就为true;
2.
Integer a2=128;
Integer b2=128;
System.out.println("2:"+(a2==b2));//2 false
这个是自动转换,jvm会自动转换,实际就等同与Integer a=new Integer(128),然后就和上道题一样的解释了,明白了吧。
3.
Integer a3=5;
Integer b3=5;
System.out.println("3:"+(a3==b3));//3 true
看到答案是不是感觉懵X了,上面不是说的好好的,按照上面的解释,答案就是false啊,但实际却为true,别着急,我来解释,这个就比较特殊了,涉及到jvm的包装类型的缓存机制了,如果Integer要装箱,会先判断值,如果是在-128到127之间,则不会new Integer(X),而是直接从缓存中(常量池)获取的,所以上述的两个值都是取至缓存中的同一个值,所以引用地址是一样的,答案为true,网上关于这一块将的比较详细,如果有想更细致的研究,可以搜索网上的文档,还有源码参考,我就不在Ctrl C V了。
4.
int a4=3;
Integer b4=new Integer(3);
System.out.println("4:"+(a4==b4));//4 true
说到这个,还有点故事,有一次电话面试,面试官问了我一个这样的问题,当时的我真的是靠懵,但是不知道是我没听清,还是面试官没说明白,说把上述的3换成128,答案就是false,为此,我自己亲自验证,然后又网上搜索,最后确定这个说法是错误的,不管把值换成多少,答案都是true;当Integer和int做“==”比较时,会自动的拆箱,把Integer转换为int类型,然后在值比较。
5.
Integer a5=new Integer(40);
Integer b5=new Integer(40);
Integer c5=new Integer(0);
System.out.println("5.1:"+(a5==b5));//5.1 false
System.out.println("5.2:"+(a5==b5+c5));//5.2 true
如果前面的都看了,这个5.1的答案你可能猜对了,但是这个5.2的答案看着是不是又懵X了,别着急,我再来解释下5.2,当Integer类型做运算时,会自动拆箱,把Integer类型转换为int类型,如果是用“==”做比较,则比较的是值,所以答案是true。
6.
Integer a6=30;
Integer b6=new Integer(30);
System.out.println("6:"+(a6==b6));//6 false
看完前面的种种情况之后,相信你会猜对这个题的答案了,不仅是猜,而且也能解释个一二了,我就再解释下吧(解释的有点多........),Integer b6=30;会直接从常量池中取,而不会在堆中new Integer(30),所以两个引用的地址不一样,用“==”比较时答案就为false。
看完这些相信大家已经很明白了,然后最后在给大家留个小作业,考验下大家,请看题:
int a7=30;
Integer b7=30;
System.out.println("7:"+(a7==b7));//
----------答--------案--------在--------此---------
不用怀疑自己,这个相信你已经会很自信的用自己的知识解释答案了,是的,答案为true,我没有给各位看官下套套。。。。。。只是让大家更坚信自己了~
二.String的常量池
刚才上面说到Integer的常量池了,大家肯定不禁想到String的常量池了,是不是正好可以建立关联记忆了,是的,我也忍不住想总结一下了,那就啰唆几句吧。
先抛个砖......
String n=new String("abc");
问:这个会创建几个“abc”?
答:不知道。
这个答案实在是高啊,我也不知道会创建几个,扯淡吧;其实正确的答案是一个或者是两个,因为这个得看常量池,如果常量池中已经存在“abc”这个字符串了,则会在堆中创建一次,
如果常量池中没有“abc”,则会在堆中new一个“abc”,然后在常量池中再创建一个“abc”,
这个就是标准的解释。
以后如果碰到这种类似的题都可以按照这种解释,不管是直接“String m="abc"”的方式,还是上面new的方式,jvm都会先检查常量池中是否有该字符串,如果有,则="abc"这种方式就不会在常量池中创建新的字符串了;如果是new这种方式,则也会先判断常量池,如果常量池中已经存在,则会只在堆中创建一次,如果常量池中不存在,则会先在常量池中创建一个,然后在堆中在创建一个,引用指向堆;所有的这类题目都可以按照这种思路解释,如果出题的话,可以挖出很多大坑,希望大家以后要小心,下面出个题趁热打铁给大家练练手吧,请看题:
String m="abc";
String n=new String("abc");
System.out.println("1:"+(m==n));//1 false
String s="abc";
System.out.println("2:"+(m==s));//2 true
答案在图中的注释,如果有跳不出坑的童鞋,可以给我留言,我会一一的给你们啰唆的明明白白的。
然后由于联想记忆法,我又想到了String、StringBuffer和StringBuilder的知识了,啊......好烦躁,真想忍不住的在给大家啰唆几句,想想还是算了吧,真的是没完没了T.T
上述的总结中,如果有不一样的观点,或错误,欢迎大神给予指正哦~
Integer和int及String的总结的更多相关文章
- java - Integer、int 、String相互转换总结
一下子还真记不清这三种数据类型之间的转换方法,所以做个小笔记. public class Test03 { public static void main(String[] args) { //int ...
- Java连载77-Integer常用方法、Integer、int、String三者相互转化、自动装箱、自动拆箱
一.关于Integer中常用的方法 package com.bjpowernode.java_learning; public class D77_1_ { public static void ...
- Java数据类型中String、Integer、int相互间的转换
1.Integer转换成int的方法 Integer i; int k = i.intValue(); 即Integer.intValue(); 2.int转换成Integer int i; Int ...
- java中的BigDecimal和String的相互转换,int和String的类型转换,Integer类和String相互转换
一: /*由数字字符串构造BigDecimal的方法 *设置BigDecimal的小数位数的方法 */ 注:BigDecimal在数据库中存的是number类型. import java.math.B ...
- 8.String to Integer (atoi) (INT; Overflow)
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- 详解Integer.toString(int i)方法和String.valueOf(int i)方法
通过查看String类的源码: public static String valueOf(int i) { return Integer.toString(i); } 我们可以看到,String.va ...
- (备忘)Java数据类型中String、Integer、int相互间的转换
1.Integer转换成int的方法 Integer i; int k = i.intValue();即Integer.intValue(); 2.int转换成Integer int i; Integ ...
- Int,String,Integer,double之间的类型的相互转换
Int整数,String字符串之间的类型的转换 int转成String 结果为: String转成int类型 结果为: double转成String 结果为: String转成double 结果为: ...
- Integer与int的区别
简述:int与Integer的区别: 对于它们,我们可能只是知道简单的区别.Integer是int的一个封装类,int的初始值为0,而Integer的初始值为null.但是他们之间真的仅仅只有这些区别 ...
随机推荐
- Vue-router 第10节 路由中的钩子
Vue-router 第10节 路由中的钩子 [TOC] 第10节 路由中的钩子 我们知道一个组件从进入到销毁有很多的钩子函数,同样在路由中也设置了钩子函数.路由的钩子选项可以写在路由配置文件中,也可 ...
- 四、华为VRP平台介绍和常用配置
一.华为VRP平台 华为现用的平台是VRP(Versatile Routing Platform)是华为公司数据通信产品的通用操作系统平台. 包含华为产品中的路由.交换.安全.无线等等 二.华为设备管 ...
- BaseRuntimeException自定义业务异常类实现
public class BaseRuntimeException extends RuntimeException { private final int code; public BaseRunt ...
- IntelliJ IDEA 在方法大括号中{}点击回车多出一个},如何取消
在 File - settings - Editor - General- Smart Keys - Enter 去掉 Insert pair '}' 的对勾就可以了
- log4j入门(转) --- 很详细 也很简单容易懂
log4j入门(转) Log4j实在是很熟悉,几乎所有的Java项目都用它啊.但是我确一直没有搞明白.终于有一天我受不了了,定下心去看了一把文档,才两个小时,我终于搞明白了.一般情况下Log4j总是和 ...
- jQuer实时监控input对table进行筛选
记得以前写过一个预定表格~~~~~比这个更难,一大串前端js~~~忘了~~~好记性不如烂笔头~~记录下,既帮助别人,也帮助自己~~~ 实现思路~通过.on监听input标签的内容变化,通过this获取 ...
- Redis安装部署(一主二从三哨兵)
需求:根据当前客户的生产环境,模拟安装部署Redis的测试环境,方便后续的功能测试. 1.准备工作 2.安装编译Redis 3.Redis运行环境配置 4.Redis启动和关闭 1.准备工作 Redi ...
- python 获取的json字符串取值
获取到的json字符串,然后对其取值 {u'result': {u'10.10.10.100': {u'status': u'OK', u'msg': u"{'listen': {'': s ...
- Asp.Net Core 3.1 学习3、Web Api 中基于JWT的token验证及Swagger使用
1.初始JWT 1.1.JWT原理 JWT(JSON Web Token)是目前最流行的跨域身份验证解决方案,他的优势就在于服务器不用存token便于分布式开发,给APP提供数据用于前后端分离的项目. ...
- Java IO 流--FileUtils 工具类封装
IO流的操作写多了,会发现都已一样的套路,为了使用方便我们可以模拟commosIo 封装一下自己的FileUtils 工具类: 1.封装文件拷贝: 文件拷贝需要输入输出流对接,通过输入流读取数据,然后 ...