Java基础篇----算术魔术大揭秘【面试题拓展】

简介: Java基础篇----算术魔术大揭秘【面试题拓展】

作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共同成长。请大家以开放的心态阅读,相信你们也会在这段知识之旅中找到启示。



前言

同学们,在学习Java中,理解和掌握运算符的使用是非常重要的,因为它们是编写有效和功能丰富的代码的基础。不同类型的运算符支持不同的操作,例如进行数学运算、比较值、执行逻辑操作等。透彻理解运算符的使用方式和规则,有助于编写更高效和可读性更强的代码。

下面我将带大家学习,在Java中我们需要掌握那些基本的运算符,就从底层的角度探究每种运算符是怎么使用的.


一、什么是运算符?

运算符是编程语言中用于执行各种操作的符号或关键字。在Java中,运算符用于执行算术、关系、逻辑、位、赋值等各种操作。它们是构建表达式的基本组成部分,允许程序对变量和值执行各种计算和比较。

二、运算符分类及底层逻辑:

1.算术运算符:

+(加法):执行两个操作数的加法。

-(减法):从左操作数减去右操作数。

*(乘法):将两个操作数相乘。

/(除法):用左操作数除以右操作数。

%(取模):返回左操作数除以右操作数的余数。

int a = 10;
int b = 5;
int sum = a + b;   // 15
int difference = a - b;  // 5
int product = a * b;   // 50
int quotient = a / b;   // 2
int remainder = a % b;  // 0

2.关系运算符:

==(等于):检查左右两个操作数是否相等。

!=(不等于):检查左右两个操作数是否不相等。

>(大于):检查左操作数是否大于右操作数。

<(小于):检查左操作数是否小于右操作数。

>=(大于等于):检查左操作数是否大于或等于右操作数。

<=(小于等于):检查左操作数是否小于或等于右操作数。

int x = 7;
int y = 10;
boolean isEqual = x == y;   // false
boolean notEqual = x != y;  // true
boolean greaterThan = x > y;  // false
boolean lessThan = x < y;     // true
boolean greaterOrEqual = x >= y;  // false
boolean lessOrEqual = x <= y;     // true

3.逻辑运算符:

&&(逻辑与):当且仅当两个操作数都为真时,结果为真。

||(逻辑或):当至少一个操作数为真时,结果为真。

!(逻辑非):将操作数的值取反。

boolean p = true;
boolean q = false;
boolean logicalAnd = p && q;   // false
boolean logicalOr = p || q;    // true
boolean logicalNotP = !p;      // false

4.位运算符:

&(按位与):对每一位执行与操作。

|(按位或):对每一位执行或操作。

^(按位异或):对每一位执行异或操作(相同为0,不同为1)。

~(按位取反):对操作数的每一位取反。

<<(左移):将操作数的位向左移动指定的位数,右侧用0填充。

>>(右移):将操作数的位向右移动指定的位数,左侧用符号位填充。

>>>(无符号右移):将操作数的位向右移动指定的位数,左侧用0填充。

int num1 = 5;   // 0101 in binary
int num2 = 3;   // 0011 in binary
int bitwiseAnd = num1 & num2;  // 0001 (1 in decimal)
int bitwiseOr = num1 | num2;   // 0111 (7 in decimal)
int bitwiseXor = num1 ^ num2;  // 0110 (6 in decimal)
int bitwiseComplement = ~num1; // 11111111111111111111111111111010 (-6 in decimal)
int leftShift = num1 << 1;     // 1010 (10 in decimal)
int rightShift = num1 >> 1;    // 0010 (2 in decimal)
int unsignedRightShift = num1 >>> 1;  // 0000 0000 0000 0000 0000 0000 0000 0101 (2,147,483,653 in decimal)

5.赋值运算符:

=(赋值):将右操作数的值赋给左操作数。

+=、-=、*=、/=、%=等:执行相应的算术运算,并将结果赋给左操作数。

&=、|=、^=、<<=、>>=、>>>=等:执行相应的位运算,并将结果赋给左操作数。

int x = 5;
int y = 3;
x += y;   // Equivalent to x = x + y;  // x is now 8
x -= y;   // Equivalent to x = x - y;  // x is now 5 again
x *= y;   // Equivalent to x = x * y;  // x is now 15
x /= y;   // Equivalent to x = x / y;  // x is now 5
x %= y;   // Equivalent to x = x % y;  // x is now 2

6.增量和减量运算符:

++(自增):将操作数的值增加1。

–(自减):将操作数的值减少1。

int count = 10;
count++;   // Equivalent to count = count + 1;  // count is now 11
count--;   // Equivalent to count = count - 1;  // count is now 10 again

3.面试题拓展:

1. 算术运算符:

  • 问题: 解释算术运算符 + 和 += 的区别。
  • 答案:
    + 是二元算术运算符,用于执行两个操作数的加法。例如,a + b。
    += 是赋值运算符,用于将右操作数的值添加到左操作数,并将结果赋给左操作数。例如,a += b 等效于 a = a + b。
  • 问题: 如何避免整数相除时出现的除法误差?
  • 答案:
    使用 double 或 float 类型进行除法,因为它们支持小数。
    或者在进行整数相除时,将其中一个操作数转换为浮点数类型,例如:(double) a / b。
  • 问题: 什么是取模运算符 %?如何使用它?
  • 答案:
    % 是取模运算符,用于返回左操作数除以右操作数的余数。
    例如,a % b 返回 a 除以 b 的余数。
int a = 10;
int b = 3;
int sum = a + b;        // 13
a += b;                 // a 现在为 13
int remainder = a % b;  // 1 (13 除以 3 的余数)

2. 关系和逻辑运算符:

  • 问题: 解释逻辑运算符 && 和 || 的短路行为。
  • 答案:
    && 和 || 具有短路行为,即在必要时只执行其中一个操作数。
    对于 &&,如果第一个操作数为 false,则不会执行第二个操作数。对于 ||,如果第一个操作数为 true,则不会执行第二个操作数。
  • 问题: 对于两个字符串 str1 和 str2,str1.equals(str2) 和 str1 == str2 之间有何区别?
  • 答案:
    str1.equals(str2) 用于比较字符串的内容,而 str1 == str2 用于比较字符串的引用(内存地址)。
    推荐使用 equals 进行字符串内容比较,因为它比较的是字符串的实际值。
String str1 = "Hello";
String str2 = new String("Hello");
// 内容比较
boolean contentEquals = str1.equals(str2);  // true
// 引用比较
boolean referenceEquals = str1 == str2;     // false

3. 位运算符:

  • 问题: 使用位运算实现交换两个变量的值而不使用临时变量。
  • 答案:
    使用异或运算符 ^,因为 a ^ b ^ b 等效于 a。
  • 问题: 解释 & 和 | 运算符的作用,以及它们在哪些场景中常常使用。
  • 答案:
    & 是按位与运算符,执行每一位的与操作。
    | 是按位或运算符,执行每一位的或操作。
    通常在对二进制位进行特定操作时使用,例如掩码和权限设置。
int a = 5;
int b = 7;
// 交换值,不使用临时变量
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 按位与和按位或
int bitwiseAnd = a & b;  // 5 (0101 & 0111)
int bitwiseOr = a | b;   // 7 (0101 | 0111)

4. 赋值运算符:

  • 问题: 说明 += 和 ++ 之间的区别。
  • 答案:
    += 是复合赋值运算符,用于将右操作数的值添加到左操作数,并将结果赋给左操作数。
    ++ 是递增运算符,用于将操作数的值增加1。
  • 问题: 如何在不使用乘法运算符的情况下实现整数的两倍增加?
  • 答案:
    使用左移运算符 <<,因为 a << 1 等效于 a 的两倍。
int x = 5;
int y = 3;
// 复合赋值和递增
x += y;   // 等效于 x = x + y;  // x 现在为 8
x++;      // 等效于 x = x + 1;  // x 现在为 9

5. 增量和减量运算符:

  • 问题: 解释 i++ 和 ++i 之间的区别。
  • 答案:
    i++ 是后缀递增运算符,先返回原始值,然后增加1。
    ++i 是前缀递增运算符,先增加1,然后返回新值。
  • 问题: 在什么情况下使用前缀递增/递减运算符比后缀递增/递减更合适?
  • 答案:
    当在表达式中使用变量的新值之前,使用前缀形式更合适。
    当在表达式中使用变量的原始值之前,使用后缀形式更合适。
int count = 10;
// 前缀递增和后缀递减
int newCount1 = ++count;  // 先增加1,newCount1 现在为 11
int newCount2int newCount2 = count--;  // 先返回原始值(11),然后减少1,count 现在为 10

4.有趣的小米面试题:

问题: 小米公司正在组织一个趣味竞赛,参赛者需要通过计算来解锁手机。假设手机上的密码是一个四位数,每位数字范围在0到9之间。参赛者需要按照以下规则解锁手机:

1.手机密码的每一位数字都必须是偶数。

2.相邻两位数字的差的绝对值不能超过2。

请写一个程序,帮助小米公司判断一组四位数密码是否符合解锁规则。如果符合规则,输出"解锁成功!“,否则输出"解锁失败!”。

提示:

使用逻辑运算符和关系运算符来判断数字的奇偶性和相邻两位的差。

尝试编写函数来检查单个数字是否满足规则。

public class UnlockChallenge {
    public static void main(String[] args) {
        int password = 2468; // 请更换为不同的四位数密码进行测试
        if (isValidPassword(password)) {
            System.out.println("解锁成功!");
        } else {
            System.out.println("解锁失败!");
        }
    }
    // 检查单个数字是否是偶数
    private static boolean isEven(int digit) {
        return digit % 2 == 0;
    }
    // 检查相邻两位数字的差的绝对值是否不超过2
    private static boolean isDifferenceValid(int digit1, int digit2) {
        return Math.abs(digit1 - digit2) <= 2;
    }
    // 检查密码是否符合解锁规则
    private static boolean isValidPassword(int password) {
        int digit1 = password / 1000 % 10;
        int digit2 = password / 100 % 10;
        int digit3 = password / 10 % 10;
        int digit4 = password % 10;
        // 检查每一位数字是否为偶数,并且相邻两位的差的绝对值是否不超过2
        return isEven(digit1) && isEven(digit2) && isEven(digit3) && isEven(digit4) &&
               isDifferenceValid(digit1, digit2) && isDifferenceValid(digit2, digit3) &&
               isDifferenceValid(digit3, digit4);
    }
}

请替换 password 的值并运行程序,看看是否符合小米公司的解锁规则。


总结

同学们,感谢大家阅读博主的文章,希望大家可以得到有用的帮助!希望大家在以后的学习生活中一帆风顺,多多努力!

注:后面也是基础篇的完结篇了,希望大家打牢基础,为以后的编程做好铺垫,一步一个脚印,坚持不懈,持续输入新知识,巩固更新旧知识.

目录
相关文章
|
8天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
28 2
|
13天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
18天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
14天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
39 4
|
15天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
55 4
|
1月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
91 1
Java面试题之Java集合面试题 50道(带答案)
|
27天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
54 5
|
26天前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
20 1
|
1月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
28 3
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
421 37

热门文章

最新文章

下一篇
无影云桌面