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

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

相关文章
|
8天前
|
Java
Java基础—笔记—static篇
`static`关键字用于声明静态变量和方法,在类加载时初始化,只有一份共享内存。静态变量可通过类名或对象访问,但推荐使用类名。静态方法无`this`,不能访问实例成员,常用于工具类。静态代码块在类加载时执行一次,用于初始化静态成员。
10 0
|
8天前
|
Java API 索引
Java基础—笔记—String篇
本文介绍了Java中的`String`类、包的管理和API文档的使用。包用于分类管理Java程序,同包下类无需导包,不同包需导入。使用API时,可按类名搜索、查看包、介绍、构造器和方法。方法命名能暗示其功能,注意参数和返回值。`String`创建有两种方式:双引号创建(常量池,共享)和构造器`new`(每次新建对象)。此外,列举了`String`的常用方法,如`length()`、`charAt()`、`equals()`、`substring()`等。
14 0
|
23天前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
24 0
|
1月前
|
Java
JAVA表达式
JAVA表达式
13 0
|
10天前
|
XML 数据可视化 前端开发
java正则表达式
java正则表达式
|
6天前
|
Java
Java 14 强势登场:Switch 表达式的进化之路
Java 14 强势登场:Switch 表达式的进化之路
13 0
|
8天前
|
Java API
Java基础—笔记—内部类、枚举、泛型篇
本文介绍了Java编程中的内部类、枚举和泛型概念。匿名内部类用于简化类的创建,常作为方法参数,其原理是生成一个隐含的子类。枚举用于表示有限的固定数量的值,常用于系统配置或switch语句中。泛型则用来在编译时增强类型安全性,接收特定数据类型,包括泛型类、泛型接口和泛型方法。
9 0
|
8天前
|
Java 开发者
Java中的Lambda表达式:简洁、灵活的编程利器
在现代软件开发中,编写简洁、高效的代码是至关重要的。Java中的Lambda表达式为开发者提供了一种简洁、灵活的编程方式,使得代码更具可读性和可维护性。本文将探讨Lambda表达式的基本概念、语法结构以及在实际项目中的应用,以帮助读者更好地理解和运用这一强大的编程工具。
5 0
|
10天前
|
存储 Java API
java8新特性 lambda表达式、Stream、Optional
java8新特性 lambda表达式、Stream、Optional
|
25天前
|
Java API 开发者
Java中的Lambda表达式及其应用
本文将介绍Java中的Lambda表达式,探讨其在函数式编程中的作用和应用。通过对Lambda表达式的语法、特点以及实际应用场景的详细分析,读者将能够更好地理解并运用Lambda表达式,从而提高代码的简洁性和可读性。
18 1