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-反射:
随机推荐
- 关于CryptoJS中md5加密以及aes加密的随笔
最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...
- [虾扯蛋] android界面框架-Window
从纯sdk及framwork的角度看,android中界面框架相关的类型有:Window,WindowManager,View等.下面就以这几个类为出发点来概览下安卓开发的"界面架构&quo ...
- 2015 西雅图微软总部MVP峰会记录
2015 西雅图微软总部MVP峰会记录 今年决定参加微软MVP全球峰会,在出发之前本人就已经写这篇博客,希望将本次会议原汁原味奉献给大家 因为这次是本人第一次写会议记录,写得不好的地方希望各位园友见谅 ...
- Js 原型和原型链
Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...
- 微软Azure 经典模式下创建内部负载均衡(ILB)
微软Azure 经典模式下创建内部负载均衡(ILB) 使用之前一定要注意自己的Azure的模式,老版的为cloud service模式,新版为ARM模式(资源组模式) 本文适用于cloud servi ...
- C#向PPT文档插入图片以及导出图片
PowerPoint演示文稿是我们日常工作中常用的办公软件之一,而图片则是PowerPoint文档的重要组成部分,那么如何向幻灯片插入图片以及导出图片呢?本文我将给大家分享如何使用一个免费版Power ...
- 如何在ASP.Net创建各种3D图表
我们都知道,图表在ASP.NET技术中是一种特别受欢迎而又很重要的工具.图表是表示数据的图形,一般含有X和Y两个坐标轴.我们可以用折线,柱状,块状来表示数据.通过图表控件,我们即能表示数据又能比较各种 ...
- addTwoNumbers
大神的代码好短,自己写的120多行=_= 各种判断 ListNode *f(ListNode *l1, ListNode *l2) { ListNode *p1 = l1; ListNode *p2 ...
- 访问者模式(visitorpattern)
/** * 访问者模式 * @author TMAC-J * 在客户端和元素之间添加一个访问者 * 当你需要添加一些和元素关系不大的需求时,可以直接放在访问者里面 * 或者是元素之间有一些公共的代码块 ...
- Sass之坑Compass编译报错
前段时间在使用Compass时遇到了其为难处理的一个坑,现记录到博客希望能帮助到各位. 一.问题: 利用Koala或者是gulp编译提示如下,截图为koala编译提示错误: 二.解决办法 从问题截图上 ...