java笔记--笔试中极容易出错的表达式的陷阱

简介:   我相信每一个学过java的人儿们都被java表达式虐过,各种"肯定是它,我不可能错!",然后各种"尼玛,真假,怎么可能?",虽然在实际开发中很少会真的让你去使用那些知识,但熟悉表达式的陷阱对于理解java数据类型在内存中的存储和运算以及JVM工作的原理有很大的帮助,最主要的,面试题太能考这些玩意...

  我相信每一个学过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

    以后再碰到会整理到这里...

相关文章
|
2月前
|
Java 编译器 API
Java Lambda表达式与函数式编程入门
Lambda表达式是Java 8引入的重要特性,简化了函数式编程的实现方式。它通过简洁的语法替代传统的匿名内部类,使代码更清晰、易读。本文深入讲解Lambda表达式的基本语法、函数式接口、方法引用等核心概念,并结合集合操作、线程处理、事件回调等实战案例,帮助开发者掌握现代Java编程技巧。同时,还解析了面试中高频出现的相关问题,助你深入理解其原理与应用场景。
|
2月前
|
安全 Java API
Java中的Lambda表达式:简洁与功能的结合
Java中的Lambda表达式:简洁与功能的结合
365 211
|
2月前
|
安全 Java
Java中的Switch表达式:更简洁的多路分支
Java中的Switch表达式:更简洁的多路分支
440 211
|
2月前
|
Java 编译器
Java 17 Switch表达式:更简洁、更强大的流程控制
Java 17 Switch表达式:更简洁、更强大的流程控制
|
3月前
|
设计模式 数据采集 Java
Java正则表达式的基础知识,进阶至熟练掌握。
通过大量的练习来熟悉它们的识别模式、如何设计模式来解决实际问题,才能够逐步达到熟练掌握。更多的是通过实践、编写代码和解决真实问题来完善技能。在这方面,没有快速的捷径,唯有刻意练习和长时间的代码实践。
83 0
|
3月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
253 14
|
4月前
|
SQL JSON 安全
Java 8 + 中 Lambda 表达式与 Stream API 的应用解析
摘要:本文介绍了Java 8+核心新特性,包括Lambda表达式与Stream API的集合操作(如过滤统计)、函数式接口的自定义实现、Optional类的空值安全处理、接口默认方法与静态方法的扩展能力,以及Java 9模块化系统的组件管理。每个特性均配有典型应用场景和代码示例,如使用Stream统计字符串长度、Optional处理Map取值、模块化项目的依赖声明等,帮助开发者掌握现代Java的高效编程范式。(150字)
83 1
|
6月前
|
Java 编译器 API
Java Lambda 表达式:以 Foo 接口为例深入解析
本文深入解析了 Java 8 中 Lambda 表达式的用法及其背后的函数式接口原理,以 `Foo` 接口为例,展示了如何通过简洁的 Lambda 表达式替代传统匿名类实现。文章从 Lambda 基本语法、函数式接口定义到实际应用层层递进,并探讨默认方法与静态方法的扩展性,最后总结常见误区与关键点,助你高效优化代码!
136 0
|
6月前
|
缓存 监控 Java
深入解析java正则表达式
本文深入解析Java正则表达式的应用,从基础概念到实际开发技巧全面展开。正则表达式是一种强大的文本处理工具,广泛应用于格式验证、搜索替换等场景。Java通过`Pattern`和`Matcher`类支持正则表达式,`Pattern.compile()`方法将正则字符串编译为高效模式对象。文章详细介绍了核心类的功能、常用正则语法及实际案例(如邮箱和电话号码验证)。掌握这些内容,可显著提升文本处理能力,满足多种开发需求。
215 1

热门文章

最新文章