我相信每一个学过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. 实现代理设置proxy

    用户在哪些情况下是需要设置网络代理呢? 1. 内网上不了外网,需要连接能上外网的内网电脑做代理,就能上外网:多个电脑共享上外网,就要用代理: 2.有些网页被封,通过国外的代理就能看到这被封的网站:3. ...

  2. C++中的const

    一,C++中const的基本知识 1.C++中const的基本概念 1.const是定义常量的关键字,表示只读,不可以修改. 2.const在定义常量的时候必须要初始化,否则报错,因为常量无法修改,只 ...

  3. SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

    Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...

  4. Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy

    本文针对 Python 操作 MySQL 主要使用的两种方式讲解: 原生模块 pymsql ORM框架 SQLAchemy 本章内容: pymsql 执行 sql 增\删\改\查 语句 pymsql ...

  5. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  6. log4net使用手册

    1. log4net简介 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.Java平台下,它还 ...

  7. “此网页上的某个 Web 部件或 Web 表单控件无法显示或导入。找不到该类型,或该类型未注册为安全类型。”

    自从vs装了Resharper,看见提示总是手贱的想去改掉它.于是乎手一抖,把一个 可视web部件的命名空间给改了. 喏,从LibrarySharePoint.WebPart.LibraryAddEd ...

  8. Linux实战教学笔记03:操作系统发展历程及系统版本选择

    标签(空格分隔): Linux实战教学笔记-陈思齐 第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System ...

  9. Python3中的字符串函数学习总结

    这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...

  10. 【月入41万】Mono For Android中使用百度地图SDK

    借助于Mono For Android技术,.Net开发者也可以使用自己熟悉的C#语言以及.Net来开发Android应用.由于Mono For Android把Android SDK中绝大部分类库都 ...