java笔记--笔试中极容易出错的表达式的陷阱
我相信每一个学过java的人儿们都被java表达式虐过,各种"肯定是它,我不可能错!",然后各种"尼玛,真假,怎么可能?",虽然在实际开发中很少会真的让你去使用那些知识,但熟悉表达式的陷阱对于理解java数据类型在内存中的存储和运算以及JVM工作的原理有很大的帮助,最主要的,面试题太能考这些玩意了,有些坑当时爬出来了,过几天再做又会义无反顾的跳进去,于是我整理了自己做错过的一些题,也搜集了一些充满恶意的表达式方面的小题目,放在此处,警世:
问题 |
结果 |
脱坑必备 |
| System.out.println(-11%-7.1); | -4 |
a.第一个操作数提供最终结果的符号 b.两个数的绝对值的计算结果提供最终的计算结果 |
|
int a = 1; |
19 |
JVM执行这个表达式是按从左到右执行的,虽然乘除的优先级高于加减,但这里不会进行先乘除后加减的,此题较为简单. |
|
int a = 10; |
true true |
第一个true很简单,不解释 第二个true是因为: 先将a的值由int->double,然后比较a与c的值 结论:==比较基本数据类型时会先同一成更高精度的类型,再比较其值 |
|
System.out.println(3.0*10==30.0); |
true false false |
这题不用太过纠结,只需要记住, 计算机用二进制来表示小数的,对于某些小数,二进制无法精确表示 |
|
Integer i=1; i=127;j=127; System.out.println(i==j); i=128;j=128; System.out.println(i==j); |
true true false |
java自动装箱功能: 首先判断当前值的范围是不是在byte的表示范围内-128~127 如果在此范围内,JVM在内存中创建一个数组,该数组有256个数,在此范围内的值的创建直接从数组中取,如果超出范围,就会自己创建,所以前两个输出true,第三个输出false. |
|
int a = 2; |
4 1 4 |
三目运算时,如果条件表达式确认了取哪一个值,那么另一个值 |
|
System.out.println( true ? false : true ? false : true ); |
false |
JVM运算过程:读到true->读到?(得知这是一个三目运算符)->读到false->读到":"(得知false是第一个数据)->读取":"后面的内容(不管有什么都当做是第二个数据). 所以运算形式是:true?false:(true?false:true). |
|
int a = 1; |
3 |
JVM运算过程:1.a=a+(a+=a++) ->2.a=1+(a=a+(a++)) ->3.a=1+(a=1+(a++)) ->4. a=1+(a=1+1)->5.a=1+2->6.a=3. |
|
short s1 = 1; s1 += 1; |
2 编译报错 |
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译 对于short s2 = 1; s2 = s2 + 1; 由于s2+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s2时,编译器将报告需要强制转换类型的错误 |
|
//第一个 |
10.0 a a 97 |
三目运算符的第二个和第三个数的数据类型如果不一致,会进行强制转换,这里int->double 第一个:返回类型是double:int类型的10转成了double类型的10.0 第二个:返回类型是Object:char类型和boolean类型无法进行统一,则都转化为Object,不会抛异常 第三个: 1:返回类型是char:0和i都是int类型,但0是常量,常量int的0可以用char来表示 2:返回类型是int:i是变量,所以要对char和int类型进行类型统一,统一后为int |
以后再碰到会整理到这里...
java笔记--笔试中极容易出错的表达式的陷阱的更多相关文章
- java笔记整理
Java 笔记整理 包含内容 Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...
- Java笔记 —— 继承
Java笔记 -- 继承 h2{ color: #4ABCDE; } a{ text-decoration: none!important; } a:hover{ color: red !import ...
- Java笔记 —— 方法重载和方法重写
Java笔记 -- 方法重载和方法重写 h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: red ...
- Java笔记——循环语句
Java笔记--循环语句 1. while语句 规律: 1. 首先计算表达式的值. 2. 若表达式为真,则执行循环语法,直至表达式为假,循环结束. while(表达式) 语句; 例如: i ...
- Java笔记——选择语
Java笔记--选择语句 1. if语句 规律: 1. 首先计算表达式的值. 2. 若表达式为真,则执行对应语句,为假则不执行. 第一种: if(表达式) 语句;//多个语句可用{} 例如 ...
- 《Java笔记——基础语法》
Java笔记--基础语法 一.字符串的拼接: 例如: System.out.println(""+""); 二.换行语句: 例如: Syst ...
- java web学习总结(三十一) -------------------EL表达式
一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- java笔记00-目录
--2013年7月26日17:49:59 学习java已久,趁最近有空,写一个总结: java笔记01-反射:
随机推荐
- 几个有趣的WEB设备API(二)
浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...
- DDD 领域驱动设计-看我如何应对业务需求变化,愚蠢的应对?
写在前面 阅读目录: 具体业务场景 业务需求变化 "愚蠢"的应对 消息列表实现 消息详情页实现 消息发送.回复.销毁等实现 回到原点的一些思考 业务需求变化,领域模型变化了吗? 对 ...
- 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...
- .Net 分布式云平台基础服务建设说明概要
1) 背景 建设云平台的基础框架,用于支持各类云服务的业务的构建及发展. 2) 基础服务 根据目前对业务的理解和发展方向,总结抽象出以下几个基础服务,如图所示 3) 概要说明 基础服务的发展会根 ...
- 使用ubuntu作为web开发环境的一些感受
从ms-dos,win95,win98,winMe,winXp,vista,win7,win10我都有使用的经历,我使用时间最长的应属winxp,其次是win7,说实话,我觉得这两个系统是微软做的最好 ...
- PHP获取上个月最后一天的一个容易忽略的问题
正常来说,PHP是有一个很方便的函数可以获取上个月时间的 strtotime (PHP 4, PHP 5, PHP 7) strtotime - 将任何英文文本的日期时间描述解析为 Unix 时间戳 ...
- AJAX实现登录界面
使用php跳转界面和AJAX都可实现登录界面的跳转的登录失败对的提醒.但是,php跳转的方式 需要额外加载其他界面,用户体验差.AJAX可实现当前页面只刷新需要的数据,不对当前网页进行 重新加载或者是 ...
- CSS 3学习——边框
在CSS 3中可以设置边框圆角.边框阴影和边框图像,分别通过border-radius.border-image和box-shadow属性设置. 边框圆角 border-radius属性是以下4个属性 ...
- JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- Cocos2d-x不要随便在onEnter里面addChild
使用任何版本的Cocos2d-x(1.x,2.x,3.0),在onEnter中调用addChild,都要小心谨慎,因为它有可能导致两种莫名其妙的BUG,莫名其妙的BUG当然难以定位了!更何况这个BUG ...