我相信每一个学过java的人儿们都被java表达式虐过,各种"肯定是它,我不可能错!",然后各种"尼玛,真假,怎么可能?",虽然在实际开发中很少会真的让你去使用那些知识,但熟悉表达式的陷阱对于理解java数据类型在内存中的存储和运算以及JVM工作的原理有很大的帮助,最主要的,面试题太能考这些玩意了,有些坑当时爬出来了,过几天再做又会义无反顾的跳进去,于是我整理了自己做错过的一些题,也搜集了一些充满恶意的表达式方面的小题目,放在此处,警世:

问题

结果

脱坑必备

System.out.println(-11%-7.1);                                                                 -4                     

a.第一个操作数提供最终结果的符号

b.两个数的绝对值的计算结果提供最终的计算结果

int a = 1;
int b = 2;
System.out.println((a=3) + (b=4) + a*b);

19

JVM执行这个表达式是按从左到右执行的,虽然乘除的优先级高于加减,但这里不会进行先乘除后加减的,此题较为简单.

int a = 10;
int b = 10;
double c = 10.0;
System.out.println(a==b);
System.out.println(a==c);

true

true

第一个true很简单,不解释

第二个true是因为:

先将a的值由int->double,然后比较a与c的值

结论:==比较基本数据类型时会先同一成更高精度的类型,再比较其值

System.out.println(3.0*10==30.0);
System.out.println(3.14*10==31.4);
System.out.println(3.1415*10==31.415);

true

false

false

这题不用太过纠结,只需要记住,

计算机用二进制来表示小数的,对于某些小数,二进制无法精确表示

Integer i=1;
Integer j=1;
System.out.println(i==j);

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;
int b = 1;
int c = a > b ? (a = 4) : (b = 3);
System.out.println(a);
System.out.println(b);
System.out.println(c);

4

1

4

三目运算时,如果条件表达式确认了取哪一个值,那么另一个值
将不再进行运算

System.out.println( true ? false : true ? false : true );

false

JVM运算过程:读到true->读到?(得知这是一个三目运算符)->读到false->读到":"(得知false是第一个数据)->读取":"后面的内容(不管有什么都当做是第二个数据).

所以运算形式是:true?false:(true?false:true).

int a = 1;
a+= a+= a++;
System.out.println(a);

 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;
System.out.println(s1);
short s2 = 1; s2 =s2+1;
System.out.println(s2);

2

编译报错

对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译

对于short s2 = 1; s2 = s2 + 1; 由于s2+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s2时,编译器将报告需要强制转换类型的错误

//第一个
int a = 10;
double d = 9.5;
System.out.println(a > d ? a : d);
//第二个
System.out.println(3>2?'a':true);
//第三个
char a = 'a';
int c = 0;
System.out.println(true ? a : 0);
System.out.println(false ? c : a);

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笔记--笔试中极容易出错的表达式的陷阱的更多相关文章

  1. java笔记整理

    Java 笔记整理 包含内容     Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...

  2. Java笔记 —— 继承

    Java笔记 -- 继承 h2{ color: #4ABCDE; } a{ text-decoration: none!important; } a:hover{ color: red !import ...

  3. Java笔记 —— 方法重载和方法重写

    Java笔记 -- 方法重载和方法重写 h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: red ...

  4. Java笔记——循环语句

    Java笔记--循环语句     1. while语句 规律: 1. 首先计算表达式的值. 2. 若表达式为真,则执行循环语法,直至表达式为假,循环结束.   while(表达式) 语句; 例如: i ...

  5. Java笔记——选择语

    Java笔记--选择语句     1. if语句 规律: 1. 首先计算表达式的值. 2. 若表达式为真,则执行对应语句,为假则不执行.   第一种: if(表达式) 语句;//多个语句可用{} 例如 ...

  6. 《Java笔记——基础语法》

    Java笔记--基础语法       一.字符串的拼接: 例如: System.out.println(""+"");     二.换行语句: 例如: Syst ...

  7. java web学习总结(三十一) -------------------EL表达式

    一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...

  8. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  9. java笔记00-目录

    --2013年7月26日17:49:59 学习java已久,趁最近有空,写一个总结: java笔记01-反射:

随机推荐

  1. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  2. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

  3. ZKWeb网页框架1.4正式发布

    本次更新的内容有 添加更快的批量操作函数 添加IDatabaseContext.FastBatchSave 添加IDatabaseContext.FastBatchDelete 注意这些函数不会触发注 ...

  4. scanf类型不匹配造成死循环

        int i = 0; while (flag) { printf("please input a number >>> "); scanf("% ...

  5. springmvc+mybatis+spring 整合 bootstrap html5

    A 调用摄像头拍照,自定义裁剪编辑头像 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技 ...

  6. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  7. JavaScript对象和数组

    1.JavaScript中有两个非常重要的数据类型是对象和数组. 通过"."或者"[]"来访问对象属性 举例:var book = { topic:" ...

  8. AFNetworking报错"_UTTypeCopyPreferredTagWithClass", referenced from: _AFContentTypeForPathExtens

    问题: 在和Unity交互的过程中,从Unity开发工具打包出来的项目文件,在添加AFNetworking库,运行时报出以下错误: Undefined symbols for architecture ...

  9. 【SAP业务模式】之ICS(六):发票输出类型

    这篇开始主要讲述发票输出类型: 首先我们新建一个发票类型,用于公司间的发票MIV,而标准的发票类型还是F2保持不变: 一.新建发票类型: 目录:SPRO-销售与分销-出具发票-开票凭证-定义出具发票类 ...

  10. Linux LVM逻辑卷配置过程详解

    许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份.删除相关数据,甚至被迫重新规划分区并重装操作系统,以 ...