【2023,学点儿新Java-52】变量与运算符&企业真题_含阿里巴巴、字节跳动等大厂:Java开发中 计算金额时使用什么数据类型?char型变量能否存储一个中文汉字?...

前情提要:

  • 【2023,学点儿新Java-51】变量与运算符 (阶段性复习3):常用运算符回顾之比较运算符、逻辑运算符、条件运算符、了解位运算符
  • 【2023,学点儿新Java-50】阶段性章节复习:String类的使用 以及与基本数据类型变量间的运算 | 认识进制 | 常用运算符回顾之算术运算符、赋值运算符
  • 【2023,学点儿新Java-49】变量与运算符 (阶段性复习2):基本数据类型变量的使用,基本数据类型变量间的运算规则
  • 更多系列文章,可参阅本专栏或博主主页哦~

 
生活不在于它是否看起来有趣,而在于你是否感受到它的趣味。

 
在这里插入图片描述

 

作者主页: 追光者♂

        

个人简介:
 
[1] 计算机专业硕士研究生
 
[2] 2022年度博客之星人工智能领域TOP4
 
[3] 阿里云社区特邀专家博主
 
[4] CSDN-人工智能领域优质创作者
 
[5] 预期2023年10月份 · 准CSDN博客专家  
 

  • 无限进步,一起追光!!!

        

感谢大家 点赞  收藏⭐   留言!!!

        

针对“变量与运算符”的复习。本篇给出一些详细的企业面试真题以及具体的解答。包含题目:Java开发中 计算金额时使用什么数据类型?(58到家)、 char型变量中 能不能存储一个中文汉字,为什么?(中通快递)、short s1=1; s1=s1+1; //有什么错? (易错的有趣题目)int i=0; i=i++ 执行这两句后,变量 i 的值为?如何将两个变量的值互换?(北京x彩、中外翻译咨询) 、boolean 占几个字节?(阿里巴巴)为什么Java中0.1 + 0.2结果不是0.3?(字节跳动)

目录

  • 企业真题
    • 1.1 Java开发中 计算金额时使用什么数据类型?(58到家)
    • 1.2 char型变量中 能不能存储一个中文汉字,为什么?(中通快递)
    • 1.3 代码分析(君 为/宇 科技、新大陆)
      • 1.3.1 第一段代码
      • 1.3.2 第二段代码
    • 1.4 (易错的有趣题目)int i=0; i=i++ 执行这两句后,变量 i 的值为?
    • 1.5 如何将两个变量的值互换?(北京x彩、中外翻译咨询)
    • 1.6 boolean 占几个字节?(阿里巴巴)
      • 1.6.1 这是一种回答方案
      • 1.6.2 这也是一种回答方案
    • 1.7 为什么Java中0.1 + 0.2结果不是0.3?(字节跳动)

企业真题

部分题目之前已经讲解过,这里再分享几道题目。

1.1 Java开发中 计算金额时使用什么数据类型?(58到家)

解答:

在Java开发中,计算金额时通常使用BigDecimal数据类型。BigDecimal提供了精确的十进制计算,不会像floatdouble类型那样出现精度丢失的问题。由于金融计算通常需要精确的结果,因此使用BigDecimal可以确保金额计算的准确性。

  • 不能使用float或double,因为精度不高。

  • 使用BigDecimal类替换,可以实现任意精度的数据的运算。

 

1.2 char型变量中 能不能存储一个中文汉字,为什么?(中通快递)

解答:

在Java中,char是用来存储单个Unicode字符的数据类型,它采用UTF-16编码表示字符。在char中是可以 存储一个中文汉字的,因为一个中文汉字可以用一个Unicode字符表示。

Unicode编码 是一种用于标识各种文字字符的标准,它包含了几乎世界上所有的字符,包括汉字在内。每个Unicode字符都有一个唯一的代码点,这些代码点可以通过char类型来存储。

例如,要将一个中文汉字赋值给char变量,可以直接使用对应的Unicode字符表示。例如,char ch = '汉';,这样就将一个中文汉字赋值给了char变量ch

需要注意的是,Java中的char类型是16位的,可以表示大部分的Unicode字符,但对于一些较大的字符,可能需要使用UTF-32编码或特殊的处理方法来进行存储和处理。

简单地说:

char变量可以存储一个中文汉字。例如 char c1 = '中';

char c2 = 't'

因为 char使用的是unicode字符集,包含了世界范围的所有的字符。

 

1.3 代码分析(君 为/宇 科技、新大陆)

1.3.1 第一段代码

short s1=1; 
s1=s1+1;  //有什么错?  

简单地讲=右边是int类型。需要强转

进一步回答:

在Java中,对于表达式s1 + 1,其中s1short类型的变量,会发生类型提升。具体来说,在表达式s1 + 1中,1是一个int类型的字面值当int类型和short类型 进行运算时,short类型 会自动提升为int类型。而结果的类型是int类型,无法直接赋值给short类型的变量。

因此,在s1=s1+1;这行代码中,会发生编译错误。为了解决这个问题,可以通过强制类型转换来将结果转换回short类型,或者简写为s1 += 1;,这样可以避免编译错误。

正确的写法可以是:

short s1 = 1;
s1 += 1;

或者:

short s1 = 1;
s1 = (short)(s1 + 1);

这样就可以保证代码的正确性。


可能有同学会有疑问:s1 += 1; 的意思不就是 s1 = s1+1 吗,为什么这样就可以了?

 
这里再解释一下:

是的,s1 += 1的确等同于s1 = s1 + 1,它们的效果是一样的。在这种情况下,s1 += 1;可以成功编译并执行,没有错误。

问题之所以出现在s1 = s1 + 1;这行代码中,是因为 编译器在这里无法自动将int类型的结果转换为short类型。这是由于赋值运算符=的行为对数据类型有一定的限制。而+=运算符 则具有隐式的类型转换功能,它会自动将右侧表达式的结果转换为左侧变量的类型。

因此,s1 += 1;等价于s1 = (short)(s1 + 1);,其中的类型转换是隐式进行的,编译器 会自动 将int类型转换为short类型,从而避免了编译错误。

也就是说,s1 += 1;是一种更简洁的写法,它能够正确执行加法运算并将结果赋值给short类型的变量s1,而不需要显式的类型转换。

 

1.3.2 第二段代码

short s1=1;
s1+=1; //有什么错? ——————没错

上述代码有错吗?

答案——没错。详细地 见上述分析~~

 

1.4 (易错的有趣题目)int i=0; i=i++ 执行这两句后,变量 i 的值为?

解答:

在执行int i=0; i=i++;这两行代码后,变量i的值为0。

i=i++;这行代码中,首先i++会将i的当前值0 赋给临时变量,然后将i的值加1,但在赋值操作时,使用了之前保存的临时变量的值,因此i的值被再次赋值为0。

  • 简而言之,i = i++等效于int temp = i; i = i + 1; i = temp;,所以i的值没有发生变化,仍为0。

这是由于后置递增运算符++的特性,它会先将当前值保存于临时变量,再进行自增操作在同一个表达式中,对同一变量 进行多次赋值是一个容易产生歧义的写法,因此在实际编程中应尽量避免这种写法,以免引起错误。

 

1.5 如何将两个变量的值互换?(北京x彩、中外翻译咨询)

这里先给出一种常见的方式:(通过中间变量,进行值的转移)

String s1 = "abc";
String s2 = "123";

String temp = s1;
s1 = s2;
s2 = temp;

其它的方法:

亦可使用异或运算来实现变量值的互换,这种方法 无需使用额外的变量。代码如下:

int a = 5;
int b = 10;

a = a ^ b;
b = a ^ b;
a = a ^ b;

通过连续进行异或运算,可以实现两个变量的值互换。不过需要注意的是,这种方法 仅适用于数值类型(如int、long),对于其他类型的变量(如对象类型)不适用。

 

1.6 boolean 占几个字节?(阿里巴巴)

1.6.1 这是一种回答方案

注:这种回答是某位资深程序员的回答。

编译时不谈占几个字节

但是JVM 在给boolean类型 分配内存空间时,boolean类型的变量 占据一个槽位 (slot,等于4个字节)。
细节:true:1 false:0

拓展:在内存中,

  • byte\short\char\boolean\int\float : 占用1个slot
  • double\long:占用2个slot

1.6.2 这也是一种回答方案

这种回答 显然与上面的回答相悖,但也有迹可循,算不上错。

在Java中,boolean类型占用的内存空间是虚拟机实现相关的,没有明确规定占用多少字节。不过,可以通过Java中的布尔数组 来推断boolean类型的大致占用空间。

通常情况下,一个boolean类型的变量 可以认为占用1个字节,即8个比特位。这是因为在计算机中,最小的可寻址存储单元是字节(byte),而一个字节可以存储8个比特位(bit)。

  • 但值得注意的是,boolean类型的占用空间 也可能会受到虚拟机和操作系统的优化策略的影响。例如,某些虚拟机实现 可能会将多个boolean类型的变量打包在一个字节中,以节省内存空间。

简单地说,boolean类型 在Java中通常被认为占用1个字节的空间,但具体占用空间 可能会根据虚拟机的实现而有所不同。(这是一种取巧的回答

 

1.7 为什么Java中0.1 + 0.2结果不是0.3?(字节跳动)

这个问题之前讲过哦~

可回顾: 【2023,学点儿新Java-31】测试:整型和浮点型变量的使用 | 附:计算机存储单位(转换关系)| 企业真题:为什么0.1+0.2不等于0.3

在代码中测试 0.1 + 0.2,你会惊讶的发现,结果不是0.3,而是0.3000……4。这是为什么?

几乎所有现代的编程语言 都会遇到上述问题,包括 JavaScript、Ruby、Python、Swift 和 Go 等。引发这个问题的原因是,它们都采用了IEEE 754标准

IEEE是指“电气与电子工程师协会”,其在1985年发布了一个IEEE 754计算标准,根据这个标准,小数的二进制表达 能够有最大的精度上限提升。但无论如何,物理边界是突破不了的,它仍然不能实现“每一个十进制小数,都对应一个二进制小数”。正因如此,产生了0.1 + 0.2不等于0.3的问题。

具体的:

整数变为二进制,能够做到“每个十进制整数 都有对应的二进制数”,比如数字3,二进制就是11;再比如,数字43就是二进制101011,这个毫无争议。

对于小数,并不能做到“每个小数都有对应的二进制数字”。举例来说,

  • 二进制小数0.0001表示十进制数0.0625 (至于它是如何计算的,不用深究);
  • 二进制小数0.0010表示十进制数0.125;
  • 二进制小数0.0011表示十进制数0.1875。

看,对于四位的二进制小数,二进制小数虽然是连贯的,但是十进制小数却不是连贯的。比如,你无法用四位二进制小数的形式表示0.125 ~ 0.1875之间的十进制小数。

所以在编程中,遇见小数判断相等情况,比如开发银行、交易等系统,可以采用四舍五入或者“同乘同除”等方式进行验证,避免上述问题。



记录一下 一位研究生的回答:

在Java中,浮点数(如0.1和0.2)的运算可能会导致精度误差。这是因为浮点数在计算机中是以二进制形式表示的,而某些十进制数无法精确地转换为二进制数。

例如,0.1在二进制形式下是无限重复的序列,而0.2也是类似的的情况。当这两个数进行加法运算时,会出现无限重复的二进制数,导致无法精确地表示结果。

可以尝试使用Double类的toString()方法将浮点数转换为字符串,以保留更多的小数位数。例如:

double result = 0.1 + 0.2;  
String strResult = Double.toString(result);  
System.out.println(strResult);

这将输出结果为“0.30000000000000004”,而不是预期的“0.3”。这是因为在浮点数运算中,精度受到限制,导致舍入误差。

 


 

热门专栏推荐

  • Python&AI专栏:【Python从入门到人工智能】
  • 前端专栏:【前端之梦~代码之美(H5+CSS3+JS.】
  • 文献精读&项目专栏:【小小的项目 (实战+案例)】
  • C语言/C++专栏:【C语言、C++ 百宝书】(实例+解析)
  • Java系列(Java基础/进阶/Spring系列/Java软件设计模式等)
  • 问题解决专栏:【工具、技巧、解决办法】
  • 加入Community 一起追光:追光者♂社区

 

持续创作优质好文ing…✍✍✍

 

记得一键三连哦!!!

 

求关注!求点赞!求个收藏啦!

【2023,学点儿新Java-52】变量与运算符&企业真题_含阿里巴巴、字节跳动等大厂:Java开发中 计算金额时使用什么数据类型?char型变量能否存储一个中文汉字?..._第1张图片

你可能感兴趣的:(备战2023博客之⭐_Java,java,BigDecimal,面试题,企业真题,Java面试题,JavaSE,阿里巴巴,字节跳动)