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-反射:
随机推荐
- JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
今天为大家分享一下我自己制作的浏览器滚动条,我们知道用css来自定义滚动条也是挺好的方式,css虽然能够改变chrome浏览器的滚动条样式可以自定义,css也能够改变IE浏览器滚动条的颜色.但是css ...
- Unity游戏内版本更新
最近研究了一下游戏内apk包更新的方法. ios对于应用的管理比较严格,除非热更新脚本,不太可能做到端内大版本包的更新.然而安卓端则没有此限制.因此可以做到不跳到网页或应用商店,就覆盖更新apk包. ...
- IteratorPattern(迭代子模式)
/** * 迭代子模式 * @author TMAC-J * 聚合:某一类对象的集合 * 迭代:行为方式,用来处理聚合 * 是一种行为模式,用于将聚合本身和操作聚合的行为分离 * Java中的COLL ...
- Consul-template的简单应用:配置中心,服务发现与健康监测
简介 Consul-template是Consul的一个方扩展工具,通过监听Consul中的数据可以动态修改一些配置文件,大家比较热衷于应用在Nginx,HAProxy上动态配置健康状态下的客户端反向 ...
- javascript 笔记!
1.通过javascript向文档中输出文本 document是javascript的内置对象,代表浏览器的文档部分 document.write("Hello Javascript&quo ...
- JQuery的基础和应用
<参考文档> 1.什么是? DOM的作用:提供了一种动态的操作HTML元素的方法. jQuery是一个优秀的js库.用来操作HTML元素的工具. jQuery和DOM ...
- Android中Activity的四大启动模式实验简述
作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...
- 基于Ubuntu Hadoop的群集搭建Hive
Hive是Hadoop生态中的一个重要组成部分,主要用于数据仓库.前面的文章中我们已经搭建好了Hadoop的群集,下面我们在这个群集上再搭建Hive的群集. 1.安装MySQL 1.1安装MySQL ...
- 超详细mysql left join,right join,inner join用法分析
下面是例子分析表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 ...
- CentOS 6.3下 安装 Mono 3.2 和Jexus 5.4
最新更新参看: Centos 7.0 安装Mono 3.4 和 Jexus 5.6 2012年初写过一篇<32和64位的CentOS 6.0下 安装 Mono 2.10.8 和Jexus 5.0 ...