day01_Java基础
文章目录
- day01_Java基础
- 一、今日课程内容
- 二、Java语言概述(了解)
- 1、Java语言概述
- 2、为什么要学习Java语言
- 3、Java平台版本说明
- 4、Java特点
- 三、Java环境搭建(操作)
- 1、JDK和JRE的概述
- 2、JDK的下载和安装
- 3、IDEA的安装
- 4、IDEA的启动
- 四、Java入门案例(熟悉)
- 1、创建项目和模块
- 2、编写代码
- 3、IDEA常见的快捷键
- 五、(重要)Java基础语法(掌握)
- 1、注释
- 2、分隔符
- 3、Java关键词
- 4、标识符
- 5、变量
- 6、数据类型说明
- 7、数据类型转换
- 7.1 自动(隐式)类型转换
- 7.2 强制(显式)类型转换
- 8、了解ASCII码表
- 9、运算符
- 9.1 分类
- 9.2 算术运算符
- 9.3 赋值运算符
- 9.4 关系运算符
- 9.5 逻辑运算符
- 9.6 三元运算符
- 六、键盘录入(熟悉)
- 1、使用步骤
- 2、Scanner入门案例
- 七、(重要)流程控制(掌握)
- 1、if语句
- 2、switch语句
- 3、for循环
- 4、while循环
- 5、死循环
- 6、循环跳转
- 7、循环嵌套
- 八、作业
- 1、需求:打印99乘法表,格式如下。尝试实现正着的、while嵌套实现
- 2、打印如下图形
day01_Java基础
一、今日课程内容
- 1- Java语言概述(了解)
- 2- Java环境搭建(操作)
- 3- Java的入门案例(熟悉)
- 4- Java的基础语法(掌握)
- 5- 键盘录入操作(熟悉)
- 6- 流程控制(掌握)
二、Java语言概述(了解)
1、Java语言概述
计算机高级语言按照程序执行方式分为解释型语言和编译型语言两种。之前我们学的Python就属于解释型语言,Java等属于编译型语言。
解释型语言是指使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言。
编译型语言是指使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性“翻译”成可被该平台硬件执行的机器码(机器指令和操作数),并包装成该平台所能识别的可执行性程序的格式,这个转换过程成为编译。
Sun公司(Stanford University NetWork): 美国的斯坦福大学)在1995年推出的高级编程语言.
Java之父: 詹姆斯·高斯林(James Gosling)
sun公司在2009年被Oracle公司收购了
**
**
2、为什么要学习Java语言
- 使用非常广泛, 相对简单易学
- 能够看得懂大数据框架的源码, 因为大数据中很多框架都是基于Java语言开发的
- 为后续Flink课程打基础
3、Java平台版本说明
- J2SE:标准版,也就是其他两个版本的基础,在JDK1.5的时候,正式更名为 JavaSE
- J2ME:小型版,一般是用于研发嵌入式程序,已经被android替代了,在JDK1.5更为为 JavaME
- J2EE:企业版,一般开发企业级互联网程序,在JDK1.5的时候正式更为为 JavaEE(SpringBoot、SpringCloud、MyBatis。。。)
4、Java特点
- 1- 开源:JAVA源代码是开放的
- 2- 跨平台:
- 用Java编写的程序,可以在不同的操作系统上运行
- 原理:由JVM保证Java程序的跨平台性,但是JVM本生并不能跨平台
- 3- 多线程
- 4- 面向对象:继承 多态 接口
三、Java环境搭建(操作)
1、JDK和JRE的概述
-
JDK:Java开发工具包(Java Development Kit), 包含开发工具 和 JRE.
- 常用的开发工具: javac, java
-
JRE:Java运行时环境(Java Runtime Environment), 包含运行Java程序时所需的核心类库和 JVM.
- 核心类库: java.lang, java.util, java.io
-
JVM:Java虚拟机(Java Virtual Machine)
- 作用: 用来保证Java程序跨平台性的, 但是JVM本身并不能跨平台.

JRE与JDK区别图解

2、JDK的下载和安装
-
1- 下载JDK:
- Oracle官网地址: www.oracle.com
- 直接下载JDK地址: https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
-
2- 执行安装操作
- 2.1 傻瓜式安装即可, 一步一步下一步即可安装成功
- 2.2 安装路径:
- 不要安装到C盘, 不要用中文空格
- 2.3 目录说明
- bin: 存放的是编译器和工具
- db: 存数数据
- include: 编译本地方法.
- jre: Java运行时文件
- lib: 存放类库文件
- src.zip: 存放源代码的.
-
3- JDK卸载: 可直接在控制面板中卸载即可
-
4- 配置环境变量:







配置后, 一路点击确定退出即可
- 5- 测试操作:
- 方式一: 在DOS窗口中输入"javac 或者 java", 能看到对应的指令即可.
- 方式二: 在DOS窗口中输入"java -version", 可以看到当前配置的JDK的版本
3、IDEA的安装
IDEA 全称 IntelliJ IDEA,是Java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。
IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。它的旗舰版本还支持HTML,CSS,PHP,MySQL,Python等。免费版只支持Python等少数语言。
总结: IDEA这个软件是用Java语言开发的, 所以想使用IDEA, 你电脑上必须安装JRE.
jetbrains公司官网地址: www.jetbrains.com
IDEA下载地址: www.jetbrains.com/idea/download/other.html
安装步骤:





4、IDEA的启动
-
1- 不导入任何配置, 选择Do not import settings, 然后选择OK.

-
2- 设置用户界面主题, 可以根据自己的喜好进行设置, 然后选择Next: Default plugins

-
3- 这个界面是告诉我们, 当前的IDEA可以开发哪些程序, 默认这些模块都是选中的, 如果明确知道不需要使用某些模块, 可以通过Disable All禁用掉此模块. 这里我们不需要禁用, 直接选择Next: Featured plugins即可.

-
4- 这个界面是JetBrains公司提供给我们的可选择性安装的5个小插件, 我们可以根据需求进行选择, 这里建议安装最后一个插件IDE Features Trainer, 它可以帮助我们快速使用IDEA. 然后选择Start using IntelliJ IDEA即可.

-
5- 因为IDEA的旗舰版是收费的, 这里我们选择Evaluate for free(免费试用30天)

四、Java入门案例(熟悉)
1、创建项目和模块




或者:




如果有以下界面, 可以参考:


第一次进入项目, 会弹出以下内容:

2、编写代码
-
1- 在src源代码包下创建自定义包 com.itheima.demo01


-
2- 在com.itheima.demo01包下创建HelloWorld类.


-
3- 编写代码
package com.itheima.day01;public class HelloWorld {/*main方法,程序的入口快捷键:输入main,等有下拉框的提升,然后按回车即可*/public static void main(String[] args) {// 快捷键:输入sout,等有下拉框的提升,然后按回车即可System.out.println("Hello Java");}
}
- 4- 运行代码: 然后在代码编辑区右键, 选择Run HelloWorld.main(), 执行程序即可.

目录说明:


3、IDEA常见的快捷键

五、(重要)Java基础语法(掌握)
1、注释
注释常见分类为三种:分别是单行注释、多行注释、文档注释
//单行注释/*多行注释多行注释
*//**文档注释文档注释
*/文档注释的作用: 对代码进行解释用的,例如方法的作用是什么,需要传递什么样的参数
package com.itheima.day01;public class HelloWorld {/*main方法,程序的入口快捷键:输入main,等有下拉框的提升,然后按回车即可*/public static void main(String[] args) {// 快捷键:输入sout,等有下拉框的提升,然后按回车即可System.out.println("Hello Java");// 单行注释System.out.println("单行注释代码");/*多行注释注释1注释2....*/System.out.println(myAdd(1, 2));}/*** 实现对两个数据相加的操作* @param num1 数字1* @param num2 数字2* @return 求和的结果*/public static int myAdd(int num1, int num2){return num1+num2;}
}
2、分隔符
Java 语言里的分号(😉 花括号({})、方括号([])、圆括号(())、 圆点(.)都具有特殊的分割作用,被统称为分隔符。
-
分号(;) 是Java语言分隔语句的,每个 Java 语句都是使用分号作为结尾。
-
花括号({})作用是定义了一个代码块,一个代码块指的是”{” 和 “}” 所包含的代码片段,代码块逻辑上是一个整体,花括号是成对出现的。
-
方括号([])作用是用于访问数组元素,方括号通常跟着数组变量名;
-
圆括号(()) 功能较多,定义方法使用圆括号来包含参数声明;调用方法传递实参值;圆括号可以作为强制类型转换运算符等;
-
圆点(.)作用类/对象和它的成员(包含成员变量、方法和内部类)之间的分隔符,表明调用某个类或某个实例的指定成员。
3、Java关键词
就是被Java语言赋予了特殊含义的单词
特点:
•关键字是由纯英文字母组成的, 而且全部都是小写的.
•常用的开发工具(Notepad++, IDEA)针对于关键字都会高亮显示.
常见的关键词:
• public: 公共的权限, 目前先了解即可.
• class: 表示在创建一个类.
• static: 表示静态的意思.
• void: 表示方法的返回值类型.
其他关键词:

4、标识符
标识符就是用来给类、接口、方法、变量、包等起名字的规则
命名规则:
1.标识符只能包含52个英文字母(区分大小写)、0 ~ 9数字 、$(美元符号)和_(下划线)。
2.标识符不能以数字开头。
3.标识符不能和Java中的关键字重名。
4.最好做到见名知意.例如: name表示姓名, age表示年龄.
命名规范:
1.类, 接口的命名规范: 每个单词的首字母都大写, 其他字母全部小写(大驼峰命名法)例如: HelloWorld, VariableDemo.
2.变量, 方法的命名规范: 从第二个单词开始, 每个单词的首字母都大写, 其他字母全部小写(小驼峰命名法).例如: zhangSanAge, studentName
3.常量(指的是: 自定义常量)的命名规范: 所有字母都大写, 单词之间用_(下划线)隔开.例如: MAX_VALUE, MIN_VALUE, PI 注意: 目前先了解即可, 面向对象部分详细解释.
4.包的命名规范: 所有字母全部小写, 多级包之间用.(点符号)隔开, 一般是公司的域名反写.例如: cn.itcast、com.itheima

5、变量
在程序的执行过程中,其值可以在某个范围内发生改变的量就叫变量
Java中要求一个变量每次只能保存一个数据,而且必须要明确保存数据的数据类型
格式:
方式一: 声明变量并赋值
数据类型 变量名 = 初始化值;//示例: 声明(定义)一个int类型的变量, 变量名叫a, 初始化值为: 10
int a = 10;方式二: 先声明, 后赋值
数据类型 变量名;
变量名 = 初始化值;//示例
//1. 声明(定义)一个int类型的变量, 变量名叫a
int a;
//2. 把数字10赋值给变量a
a = 10;
示例:
package com.itheima.day01;public class HelloWorld {/*main方法,程序的入口快捷键:输入main,等有下拉框的提升,然后按回车即可*/public static void main(String[] args) {// 变量的定义String eatFood;String statue = "今天没有上火";if(statue=="今天上火了"){eatFood = "吃清淡的";}else{eatFood = "吃海底捞火锅";}System.out.println(eatFood);}
}
6、数据类型说明
Java是一种强类型语言, 针对于每一个数据都给出了明确的数据类型
- 基本数据类型(简称: 基本类型)
byte, short, char, int, long, float, double, boolean
- 引用数据类型(简称: 引用类型)
String, 数组, 类, 接口
图解:

基本类型占用字节大小以及取值范围:

注意事项:
1.变量未赋值,不能使用.
2.变量只在它所属的范围内有效.
3.一行上可以定义多个变量,但是不建议.
4.char类型的注意事项4.1- 值只能用单引号包起来4.2- 值的内容只能有一个字符
package cn.itcast.base;public class ArgDemo {public static void main(String[] args) {// 1-变量的定义方式一:声明变量并且赋值int argA = 10;System.out.println(argA);// 2-变量的定义方式二:先声明变量,再赋值double argB;if(argA>=10){argB = 10.1;}else{argB = 9.0;}System.out.println(argB);// 1.变量未赋值,不能使用.
// int c;
// System.out.println(c);// 2.变量只在它所属的范围内有效.if(argA>=10){int d = 2;System.out.println(d);}// System.out.println(d);// 3.一行上可以定义多个变量,但是不建议.int e=10,f=11;System.out.println(e);System.out.println(f);}
}
7、数据类型转换
不同类型的数据之间可能会进行运算,而这些数据取值范围不同,存储方式不同,直接进行运算可能会造成数据损失,所以需要将一种类型转换成另外一种类型再进行运算。
注: Java程序中要求参与计算的数据,必须保证数据类型的一致性,如果数据类型不一致将发生类型转换。
类型转换主要有二类: 自动(隐式)类型转换 和 强制(显式)类型转换
7.1 自动(隐式)类型转换
指的是小类型转大类型,会自动提升为大类型,运算结果是大类型.
大白话翻译: 将取值范围小的类型自动提升为取值范围大的类型
例如:
1.定义两个int类型的变量a和b, 分别赋值为10, 20.
int a=10,b=20;2.通过输出语句打印变量a和b的和.
System.out.println(a+" "+b);3.定义int类型的变量c, 接收变量a和b的和.
int c=a+b;4.打印变量c的值.
System.out.println(c);5.定义两个变量aa和bb, 一个是int类型的数据, 另一个是byte类型的数据.
int aa=1;
byte bb=2;6.定义变量cc接收 变量aa和bb的和。分别设置变量cc的数据类型为byte类型和int类型, 观察结果并打印.
int cc1 = aa+bb;
System.out.println(cc1);byte cc2 = aa+bb;
System.out.println(cc2);
演示案例:
public class Demo02_类型转换 {// 演示 类型转换: 自动(隐式)类型转换 强制类型转换public static void main(String[] args) {// 自动(隐式)类型转换byte a = 10;short b = 15;char c = 20;int d = 13;long e = 50L;float f = 3.5F;double g = 5.5;int v1 = a + b;int v2 = a + c;int v3 = b + c;int v4 = a + d;int v5 = b + d;long v6 = c + e;long v7 = d + e;float v8 = e + f;double v9 = e + g;double v10 = f + g;System.out.println(v1);System.out.println(v2);System.out.println(v3);System.out.println(v4);System.out.println(v5);System.out.println(v6);System.out.println(v7);System.out.println(v8);System.out.println(v9);System.out.println(v10);}
}
转换规则:
1.范围小的类型向范围大的类型提升,byte、short、char 运算时直接提升为int 。
2.boolean类型的数据只有true和false这两个, 所以boolean类型的数据不参与类型转换.即: byte、short、char --> int --> long --> float --> double
7.2 强制(显式)类型转换
指的是手动将大类型转换成小类型,运算结果是小类型.
大白话翻译: 将取值范围大的类型强制转换成取值范围小的类型.
注意: 在进行大类型转换为小类型的时候, 可能出现数据丢失, 甚至直接报错(可能超过了小类型的范围大小)
格式:
数据类型 变量名 = (数据类型)要被转换的数据值;
示例: 尝试把小数1.5赋值给int类型的变量a, 并打印结果.
public class NarrowConversion{private static String main(String[] args) {int iValue =232;//强制把一个 int 类型的值转换成 byte 类型的值byte bValue=(byte)iValue;// 将输出-23System.out.println(bValue);double dValue=3.98;// 强制把一个 double 类型的值转换成 int 类型的值int tol = (int)dValue;// 将输出 3System.out.println(tol);}
}
案例演示:
package com.itheima;public class Demo02_类型转换 {// 演示 类型转换: 自动(隐式)类型转换 强制类型转换public static void main(String[] args) {byte a = 10;short b = 15;char c = 20;int d = 13;long e = 50L;float f = 3.5F;double g = 5.5;// 强制类型转换byte q1 = (byte)(a + d);System.out.println(q1);short q2 = (short) (a + b);System.out.println(q2);long q3 = (long) (e + f);System.out.println(q3);byte q4 = (byte) (e +a);System.out.println(q4);}
}注意: 将小数强转成整数的时候,会直接将小数位数全部丢弃
8、了解ASCII码表
https://www.zhihu.com/tardis/bd/art/388458283?source_id=1001
观察下述代码, 打印结果是多少呢?
public static void main(String[] args) {//字符类型变量char c = 'a';int i = 1;//字符类型和int类型计算System.out.println(c+i);
}
在计算机的内部都是二进制的0, 1数据,如何让计算机可以直接识别人类文字呢?
于是就产生出了编码表的概念。
-
编码表:就是将人类的文字和一个十进制数进行对应起来组成一张表格。 ‘a’ -> 97 char:0-65535
-
存储字符时:需要查找ASCII码表,找到字符对应的数字,将数字转换为二进制数存放到计算机中
-
使用字符时:将对应的二进制数转换为十进制 找到ASCII表中对应的字符 显示出来
-
将所有的英文字母,数字,符号都和十进制进行了对应,因此产生了世界上第一张编码表ASCII码表.
-
ASCII(American Standard Code for Information Interchange 美国标准信息交换码), 规则如下:
| 字符 | 数值 |
|---|---|
| ‘0’ | 48 |
| ‘9’ | 57 |
| A | 65 |
| Z | 90 |
| a | 97 |
| z | 122 |
注意:
在char类型和int类型计算的过程中,char类型的字符先查询编码表,得到97,再和1求和,结果为98。
char类型提升为了int类型。char类型内存2个字节,int类型内存4个字节。
package com.itheima;public class Test03_ASCII码 {public static void main(String[] args) {// 注意 ASCII码 主要针对char类型的数据char c1 = 'A';System.out.println(c1 + 10); // 75 说明 'A' = 65char c2 = 'a';System.out.println(c2 + 10); // 107 说明 'a' = 97char c3 = 'b';System.out.println(c3 + 10); // 108 说明 'b' = 98char c4 = '0';System.out.println(c4 + 10); // 58 说明 '0' = 48// 注意: 其实看到的这些数值 对应的就是ASCII码表中对应字符的十进制的表示内容}
}
9、运算符
9.1 分类
- 算术运算符
+, -, *, /, %, ++, --
- 赋值运算符
=, +=, -=, *=, /=, %=
- 比较(关系)运算符
==, !=, >, >=, <, <=
- 逻辑运算符
&&, ||, !
- 三元(三目)运算符
注意: Java中的运算符绝大多数和Python中的运算符用法都一样, 只有个别运算符的用法不同, 我们主要是学习这些用法不同运算符.
package com.itheima;public class Test04_运算符 {public static void main(String[] args) {System.out.println("演示一: 算术运算符 ++ --");// 1. 构建一个int类型的变量int a = 10;System.out.println(a++); // 10System.out.println(a); // 11int b = 10;System.out.println(++b); // 11System.out.println(b); // 11/*说明: ++ -- 是用于对数据进行 +1 或者 -1的操作在使用的时候, 都可以在变量的前面和后面设置: a++ 或者 ++a区别:a++: 先让 a 参与运算, 运算后执行 +1操作++a: 先执行a +1的操作, 然后基于+1后结果参与运算*/System.out.println("演示二: 逻辑运算符 && || ! ");// 格式:// boolean flag = 条件1 [&& ||] 条件2 [&& ||] 条件3 ...// !条件1 用于取反操作int c = 10;int d = 15;int e = 25;boolean flag = c > d && c > e; // 当两个条件都不成立的时候, 结果为FalseSystem.out.println(flag);flag = c < d && c > e;System.out.println(flag); // 当其中一个条件不成立的时候, 结果为falseflag = c < d && c < e;System.out.println(flag); // 当所有的条件都成立的时候, 返回trueflag = c > d || c > e; // 当两个条件都不成立的时候, 结果为FalseSystem.out.println(flag);flag = c < d || c > e;System.out.println(flag); // 当其中一个条件成立的时候, 结果为 trueflag = c < d || c < e;System.out.println(flag); // 当所有的条件都成立的时候, 返回trueflag = !(c < d);System.out.println(flag);flag = c < d && e < d || c < e;System.out.println(flag);/*&&: 并且 只有当所有的条件都成立的时候, 才会返回true, 否则均为false||: 或者 只有当所有的条件都不成立的时候, 才会返回false, 否则均为true!: 非 取反操作*/System.out.println("演示三: 三元运算符 ");// 需求: 当 d > e的时候, 返回 "d比e大" 否则 返回 "d比e小"// python: 'd比e大' if d < e else 'd比e小'// java 三元表达式格式: 条件 ? true: falseString s = d > e ? "d比e大" : "d比e小";System.out.println(s);if (d > e){System.out.println("d比e大");}else {System.out.println("d比e小");}}
}
package cn.itcast.base;public class OperatorDemo {public static void main(String[] args) {/*++ --这两个可以放在变量的前面,也可以放在后面,但是两种计算顺序不同++: 对变量值加一--: 对变量值减一如果将运算符放在变量的后面,是先赋值,再计算。int b = a++;先将a的值赋值给b,因此b的值是10,再对变量a做加一的操作,因此a变成了11int d = ++c;先对c做加一的操作,c变成了11,再将c的值赋值给d,因此d的值也是11*/int a = 10;int b = a++;System.out.println(a);System.out.println(b);int c = 10;int d = ++c;System.out.println(c);System.out.println(d);/*逻辑运算符演示&& || !&&:表达式中全部为true的时候,结果才是true;只要有一个是false,结果就是false||: 表达式中只要有一个是true,结果就是true*/int e = 10;int f = 11;int g = 12;int h = 13;boolean flag1 = f>e && g>h;System.out.println(flag1);boolean flag2 = f>e && h>g;System.out.println(flag2);boolean flag3 = e>f && h++>g;System.out.println(flag3);System.out.println(h);System.out.println("------------------------------------------");boolean flag4 = e>f || h>g;System.out.println(flag4);boolean flag5 = e>f || g>h;System.out.println(flag5);boolean flag6 = f>e || g++>h;System.out.println(flag6);System.out.println(g);boolean flag7 = e>f || g++>h;System.out.println(flag7);System.out.println(g);boolean flag8 = e>f;System.out.println(flag8);System.out.println(!flag8);/*三元(三目)运算符boolean类型的表达式 ? true条件下执行的表达式 : false条件下执行的表达式*/String result = !(e>f) ? "e大于f" : "e小于f";System.out.println(result);}
}
9.2 算术运算符
自增自减运算符
解释:
++ 运算,变量自己增长1。反之,-- 运算,变量自己减少1,用法与++ 一致, 此处以++举例.
- 独立运算:
- 变量在独立运算时,前++和后++没有区别 。
- 变量前++ :例如 ++i 。
- 变量后++ :例如 i++ 。
- 混合运算:
- 和其他变量放在一起,前++和后++就产生了不同。
- 变量前++ :变量a自己加1,将加1后的结果赋值给b,也就是说a先计算。a和b的结果都是2。
public static void main(String[] args) {int a = 1;int b = ++a;System.out.println(a);//计算结果是2System.out.println(b);//计算结果是2
}变量后++ :变量a先把自己的值1,赋值给变量b,此时变量b的值就是1,变量a自己再加1。a的结果是2,b的结果是1。
public static void main(String[] args) {int a = 1;int b = a++;System.out.println(a);//计算结果是2System.out.println(b);//计算结果是1
}
package com.itheima;public class Demo04_运算符 {// 演示运算符public static void main(String[] args) {//1. 算术运算符: ++ --int a = 10;//a++; // 等于: a = a + 1 / a += 1// System.out.println(a); // 11// System.out.println(a++); // 11// System.out.println(a); // 12// System.out.println(++a); // 13/*a++: 先使用 a参与运算, 运算后, 然后对a + 1++a; 先对 a进行 + 1 操作, +1 后, 再参与运算*///int i1 = 10 + a++;int i2 = 10 + ++a;//System.out.println(i1); // 20System.out.println(i2); // 21// 说明 -- 与之类似, 只不过是 -1 操作System.out.println(a--); // 11System.out.println(--a); // 9}
}
9.3 赋值运算符
Java和Python中的赋值运算符用法一致, 只不过默认包含有强制类型转换, 具体如下:
下面的程序有问题吗?
public static void main(String[] args){short s = 1;s+=1;System.out.println(s);
}
分析: s += 1 逻辑上看作是s = s + 1 计算结果被提升为int类型,再向short类型赋值时发生错误,因为不能将取值范围大的类型赋值到取值范围小的类型。但是,s=s+1进行两次运算,+= 是一个运算符,只运算一次,并带有强制转换的特点,也就是说s += 1 就是s = (short)(s + 1),因此程序没有问题编译通过,运行结果是2.
// 2- 赋值运算符 (底层带有强制转换)
short b = 5;
b = (short) (b + 1);
System.out.println(b);b +=1; // == b = (short) (b + 1);
System.out.println(b);
9.4 关系运算符
Java中的关系运算符和Python中的关系运算符用法一致,这里不做过多的介绍了
9.5 逻辑运算符
• 逻辑运算符是用来判断并且, 或者, 除非等逻辑关系的符号.
• 该符号两端一般连接值为布尔类型的关系表达式.
| 符号 | 作用 | 说明 |
|---|---|---|
| && | 短路与 | 并且的意思. 有false则整体为false, 都为true, 则整体为true,有短路效应. |
| || | 短路或 | 或者的意思, 有true则整体为true, 都为false, 则整体为false,有短路效应. |
| ! | 逻辑非 | 取反的意思, 以前为true, 取反后为false, 以前为false, 取反后为true |
案例演示:
public class OperatorDemo03 {public static void main(String[] args) {//1. 定义两个int类型的变量a和b, 初始化值分别为: 2, 5int a = 2, b = 5;//2. 演示逻辑与(&)/* System.out.println((a++ > 2) & (b++ < 7)); //两个表达式都会执行.System.out.println(a);System.out.println(b);*/System.out.println("------------------");//3. 演示短路与(&&)System.out.println((a++ > 2) && (b++ < 7)); //左边表达式结果为false, 右边不执行.System.out.println(a);System.out.println(b);}
}
演示:
int d = 100;
int e = 200;
// && 两边的条件 如果都成立, 返回true 如果有任意条件不成立, 都会返回false
boolean tmp1 = d >= 100 && e > 200;
// || 两边的条件, 如果都不成立, 返回false, 只要有任意一方成立, 均返回true
boolean tmp2 = d > 100 || e > 200;
// ! 取反操作
boolean tmp3 = !(d > 100);System.out.println(tmp1);
System.out.println(tmp2);
System.out.println(tmp3);注意: && || 都可以支持并联写多个条件 同样也可以混合使用例如: 条件1 && 条件2 && 条件3 && ....条件1 || 条件2 || 条件3 || ....条件1 && 条件2 || 条件3 || .... !条件1 && 条件2 || 条件3...
9.6 三元运算符
格式
三元运算符也叫三目运算符,即由三部分组成,格式如下:
关系表达式? 表达式1:表达式2;
先执行关系表达式, 看其结果是true还是false.
1.如果是true, 则执行表达式1
2.如果是false, 则执行表达式2
需求
-
1 定义两个int类型的变量a. b, 初始化值分别为10, 20
-
2 通过三元运算符, 获取变量a和b的最大值.
-
3 将结果(最大值)打印到控制台上.
public class OperatorDemo04 {public static void main(String[] args) {//1. 定义两个int类型的变量a. b, 初始化值分别为10, 20int a = 10, b = 20;//2. 通过三元运算符, 获取变量a和b的最大值.int max = a < b ? b : a;//3. 将结果(最大值)打印到控制台上.System.out.println(max);}
}
package com.itheima.day01;public class 运算符 {public static void main(String[] args) {// 算术运算符int a = 10;// ++/--放在变量后面的情况,先进行赋值操作,再进行加1或者减1的操作// ++/--放在变量前面的情况,先进行加1或者减1的操作,再进行赋值操作
// int b = a++;
// int b = ++a;int b = --a;System.out.println(a);System.out.println(b);// 逻辑运行算/*&&:与。左右两边全部都成立的时候,最终结果才是true;否则就是false||:或。左右两边只要有任意一个成立,那么最终的结果就是true!:非。取反的操作。*/System.out.println(5>6 && 7<8); // falseSystem.out.println(5<6 && 7<8); // trueSystem.out.println(5>6 || 7<8); // trueSystem.out.println(5>6 || 7>8); // falseSystem.out.println(!(5>6)); // trueSystem.out.println(!(5>6 || 7>8)); // true// 三元运算符:是对简单的if判断语句进行了简化int age = 100;String result = age>=18?"成年了,可以打游戏":"未成年,回去写作业吧";System.out.println(result);String result2 = age>=18?(age>=90?"别打游戏了,心脏不好":"可以玩点刺激的"):"未成年,回去写作业吧";System.out.println(result2);}
}
六、键盘录入(熟悉)
类似于Python中的input(),raw_input(), Java中也是支持键盘录入的.
1、使用步骤
- 1 导包。包就是文件夹.
注意:
a) Scanner类是java.util包下的类, 使用之前必须要先导包.
b) 导包的语句是定义在类的上面的, 格式如下: import java.util.Scanner;
- 2 创建Scanner类的对象, 格式为:
//暂时先理解为固定格式, 也就是必须这么写.
Scanner sc = new Scanner(System.in);
- 3 通过Scanner类的nextInt()方法接收用户录入的数据.
int a = sc.nextInt();
2、Scanner入门案例
需求
1 提示用户录入他/她的年龄.
2 通过键盘录入功能, 接收用户录入的年龄.
3 将用户录入的数据(年龄)打印到控制台上.
package com.itheima.day01;import java.util.Scanner;public class 键盘录入 {public static void main(String[] args) {// 1- 创建Scanner实例对象// Java中创建类的实例对象需要用new关键字Scanner sc = new Scanner(System.in);// 2- 输出提示信息System.out.println("请输入您的年龄:");// 3- 获取用户输入int inputAge = sc.nextInt();// Java里面可以直接对字符串与数字进行拼接操作。但是不能同时输出多个变量System.out.println("您输入的年龄是:"+inputAge);}
}
七、(重要)流程控制(掌握)
和Python中一样, Java中也是有分支结构和循环结构的, 它们的用法都一样, 只是写法稍有不同, 接下来, 我们来研究下Java中分支结构和循环结构的格式.
1、if语句
如果我们想某些代码是在满足条件的情况下, 才能被执行, 此时就需要用到选择结构了, 选择结构也叫分支结构, 主要分为以下两种:
- if语句, 主要用于范围的判断
- switch case语句, 主要用于固定值的判断.
if语句格式:
单分支格式:
if(判断条件){// 满足条件的内容
}双分支:
if(判断条件){// 满足条件的内容
} else {// 不满足条件的内容
}多分支
if(判断条件){// 满足条件的内容
} else if (判断条件) {// 满足条件的内容
} else if (判断条件) {// 满足条件的内容
} else {// 不满足条件的内容
}多分支
if(判断条件){// 满足条件的内容
} else if (判断条件) {// 满足条件的内容
}
相关的案例:
package com.itheima.day01;import java.util.Scanner;public class IF多分支 {public static void main(String[] args) {// 1- 创建键盘录入的实例对象Scanner sc = new Scanner(System.in);// 2- 提示用户输入考试分数System.out.println("请输入您的考试得分:");// 3- 获取用户输入的内容double inputScore = sc.nextDouble();System.out.println("用户的考试得分是:"+inputScore);// 4- 判断用户的考试级别// 如下的代码逻辑有问题
// if(inputScore>=60){
// System.out.println("及格");
// }else if(inputScore>=70){
// System.out.println("良好");
// }else if(inputScore>=90){
// System.out.println("优秀");
// }else{
// System.out.println("没有及格");
// }if(inputScore>=90){System.out.println("优秀");}else if(inputScore>=70){System.out.println("良好");}else if(inputScore>=60){System.out.println("及格");}else{System.out.println("没有及格");}}
}
2、switch语句
switch语句, 一般是用于做固定值判断的。适合值是离散。
格式:
switch(表达式) { case 值1: 语句体1;break;case 值2:语句体2;break;case 值3:语句体3;break;... //根据需求, 可以写多组case.default: 语句体n;break;
}

示例:
1 一年有12个月, 分属于春夏秋冬4个季节, 键盘录入一个月份, 请用程序实现判断该月份属于哪个季节, 并输出。
2 具体标准如下:
1 输入: 1、2、12 输出:冬季2 输入: 3、4、5 输出:春季3 输入: 6、7、8 输出:夏季4 输入: 9、10、11 输出:秋季输入:其它数字 输出:数字有误
代码实现:
package com.itheima;import java.util.Scanner;public class Test02_switch {public static void main(String[] args) {//1. 创建键盘录入的对象Scanner scanner = new Scanner(System.in);//2. 获取教案录入的月份信息(1~12)// ln 是用于换行的//System.out.println("请输入一个月份, 判断属于哪个季节(1~12):");System.out.print("请输入一个月份, 判断属于哪个季节(1~12): ");int month = scanner.nextInt();// 3. 根据输入的月份信息, 进行判断switch (month){case 12:System.out.println("冬季");break;case 1:System.out.println("冬季");break;case 2:System.out.println("冬季");break;case 3:System.out.println("春季");break;case 4:System.out.println("春季");break;case 5:System.out.println("春季");break;case 6:System.out.println("夏季");break;case 7:System.out.println("夏季");break;case 8:System.out.println("夏季");break;case 9:System.out.println("秋季");break;case 10:System.out.println("秋季");break;case 11:System.out.println("秋季");break;default:System.out.println("您输入的数字有误, 请重新输入...");break;}}
}
注意:
在switch语句中,如果case的后面不写break,将出现case穿透现象,也就是不会在判断下一个case的值,直接向后运行,直到遇到break,或者整体switch结束。
所以以上代码可以优化为:
package com.itheima;import java.util.Scanner;public class Test03_switch {public static void main(String[] args) {//1. 创建键盘录入的对象Scanner scanner = new Scanner(System.in);//2. 获取教案录入的月份信息(1~12)// ln 是用于换行的//System.out.println("请输入一个月份, 判断属于哪个季节(1~12):");System.out.print("请输入一个月份, 判断属于哪个季节(1~12): ");int month = scanner.nextInt();// 3. 根据输入的月份信息, 进行判断switch (month){case 12:case 1:case 2:System.out.println("冬季");break;case 3:case 4:case 5:System.out.println("春季");break;case 6:case 7:case 8:System.out.println("夏季");break;case 9:case 10:case 11:System.out.println("秋季");break;default:System.out.println("您输入的数字有误, 请重新输入...");break;}}
}
3、for循环
for循环是我们在实际开发中应用到的最多的循环, 它一般适用于循环次数固定的情况.
格式:
for(初始化条件1; 判断条件2; 控制条件3) {//循环体;
}
说明:
1 初始化条件: 用来记录 循环的初始状态的. 即: 从哪开始循环.
2 判断条件: 用来决定循环是否继续执行的, 条件成立, 则循环继续执行, 条件不成立, 整个循环就结束了.
3 控制条件: 用来控制初始化条件变化的, 一般是每循环一次, 初始化条件+1.
4 循环体: 需要用来重复做的事情(代码).
案例1:
1 通过for循环, 打印1~5之间的数字.
2 通过for循环, 打印5~1之间的数字.
package com.itheima;public class Test04_for {public static void main(String[] args) {// 需求: 通过 for循环, 打印 1~5之间的数字for(int i = 1; i <=5; i++){System.out.println(i);}System.out.println("------------------");// 需求2: 通过for循环, 打印 5~1之间的数字for(int i = 5; i >=1 ; i--){System.out.println(i);}}
}
案例二: 求偶数和
求1-100之间的偶数和,并把求和结果打印到控制台上
package cn.itcast.base;public class ForDemo {public static void main(String[] args) {// 通过for循环, 打印1~5之间的数字.for(int i=1;i<=5;++i){System.out.println(i);}// 通过for循环, 打印5~1之间的数字.for(int i=5;i>=1;i--){System.out.println(i);}// 求1-100之间的偶数和,并把求和结果打印到控制台上/*1-打印1-100之间的数字2-筛选出偶数3-求偶数的和4-打印最终的结果*/// 偶数的中间临时聚合结果int sum = 0;for(int i=1;i<=100;i++){if(i%2==0){// sum = sum + i;sum += i;}}System.out.println(sum);}
}
4、while循环
while循环也是我们在实际开发中应用到的比较多的循环, 它一般适用于循环次数不固定的情况.
格式:
初始化条件1;
while(判断条件2) {//循环体3;//控制条件4;
}
案例:在控制台打印10次HelloWorld.
// 需求1: 在控制台打印10次HelloWorld
int i = 1;
while(i<=10){System.out.println("Hello World");i++;
}
案例: 求和
获取1~100之间所有偶数和, 并将结果打印到控制台上.
// 需求2: 求和 获取 1~100之间所有偶数和 并将结果打印到控制台上
int j = 1;
int sum = 0;
while( j <= 100) {if(j % 2 == 0){sum += j;}j++;
}System.out.println("偶数之和为:"+ sum);
5、死循环
所谓的死循环指的是永不会结束的循环, 也就是循环的判断条件永远为true。在Java中, 死循环的写法格式常用有以下2种:
- for(;😉 { }
- while(true){ }:推荐使用
public class DeadLoop {public static void main(String[] args) {for(;;) {System.out.println("Hello World!");}while(true) {System.out.println("Hello World!");}}
}
package com.itheima.day01;import java.util.Scanner;public class 死循环结合switch案例 {public static void main(String[] args) {// 1- 创建Scanner实例对象Scanner sc = new Scanner(System.in);while(true){// 2- 提示用户输入System.out.println("请输入月份:");// 3- 获取用户输入的月份int inputMonth = sc.nextInt();System.out.println("用户输入的月份是:"+inputMonth);// 4- 判断月份属于哪个季节switch (inputMonth){// case后面必须要有空格case 1:case 2:case 12:System.out.println("冬季");break;case 3:case 4:case 5:System.out.println("春季");break;case 6:case 7:case 8:System.out.println("夏季");break;case 9:case 10:case 11:System.out.println("秋季");break;default:System.out.println("您输入的月份有误");break;}}}
}
6、循环跳转
有些时候, 我们想提前终止循环的执行, 或者跳过循环的某一次执行, 例如: 打印1~10之间, 所有不是3倍数的数字, 或者采用死循环让用户不断的录入他/她的账号和密码, 直到用户录入正确, 再终止循环. 这些都要用到循环控制跳转知识点.
break: 是用来终止整个循环, 循环不再继续执行.
continue: 用来结束本次循环, 进行下一次循环的, 循环还会继续执行.
例如:
package cn.itcast.base;public class BreakAndContinueDemo {public static void main(String[] args) {// 打印1-10的数字,如果遇到3的倍数,就进行特殊处理/*break: 用来结束整个循环(for/while)continue:用来结束当前循环(for/while),进入到下个循环中*/for(int i=1;i<=10;i++){if(i%3==0){System.out.println("3的倍数"+i);
// break;continue;}System.out.println(i);}}
}
演示:
package com.itheima;public class Test06_break和continue {public static void main(String[] args) {// 演示 for循环的break和continue// 需求: 通过 for循环, 打印 1~5之间的数字for(int i = 1; i <=5; i++){System.out.println(i);// 当i等于3的时候, 跳出整个循环if(i == 3){break;}System.out.println(i);}System.out.println("------------------");// 需求2: 通过for循环, 打印 5~1之间的数字for(int i = 5; i >=1 ; i--){// 当 i等于3的时候, 跳出本次循环if(i == 3) {continue;}System.out.println(i);}// 演示在while循环中:// 需求1: 在控制台打印10次HelloWorldint i = 1;while(i<=10){System.out.println(i);// 当i等于3的时候, 跳出整个循环if(i == 3){break;}i++;}System.out.println("------------------");// 需求1: 在控制台打印10次HelloWorldint j = 1;while(j<=10){// 当 i等于3的时候, 跳出本次循环if(j == 3) {j++;continue;}System.out.println(j);j++;}}
}
7、循环嵌套
所谓的循环嵌套指的是循环结构中还包裹着循环结构, 外边的循环结构叫外循环, 里边的循环结构叫内循环.
for循环和while循环,可以任意组合。工作中,一般推荐就2层循环。如果你的代码的循环嵌套层数>3层,一定要重新思考你的实现思路。
循环嵌套用的最多的就是for循环的嵌套, 具体格式如下:
for(初始化条件; 判断条件; 控制条件) { //外循环for(初始化条件; 判断条件; 控制条件) { //内循环//循环体;}
}
八、作业
1、需求:打印99乘法表,格式如下。尝试实现正着的、while嵌套实现
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*4=4 2*4=8 3*4=12 4*4=16
1*3=3 2*3=6 3*3=9
1*2=2 2*2=4
1*1=1
package com.itheima.day01;public class 倒着的99乘法表 {public static void main(String[] args) {for (int line = 1; line <= 9 ; line++) {// 外层循环控制层数for (int j = 1; j <= 10-line; j++) {// 内层循环控制每行的内容System.out.print(j + "*" + (10-line) + "=" + (j*(10-line)) + "\t");}// 输出一个回车换行System.out.println();}}
}
2、打印如下图形
****
*********

package com.itheima.day01;import java.util.Scanner;public class 打印菱形 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入要打印的层数:");int lineCount = sc.nextInt();// 先打印上半部分for(int line=1;line<=lineCount;line++){// 外层循环控制行号for (int i = 1; i <= lineCount-line; i++) {// 负责打印每行的空格System.out.print(" ");}for (int i = 1; i <= 2*line-1; i++) {// 负责打印每行的星星System.out.print("*");}// 打印每行的回车换行System.out.println();}// 先打印下半部分for(int line=lineCount-1;line>=1;line--){// 外层循环控制行号for (int i = 1; i <= lineCount-line; i++) {// 负责打印每行的空格System.out.print(" ");}for (int i = 1; i <= 2*line-1; i++) {// 负责打印每行的星星System.out.print("*");}// 打印每行的回车换行System.out.println();}}
}
相关文章:
day01_Java基础
文章目录 day01_Java基础一、今日课程内容二、Java语言概述(了解)1、Java语言概述2、为什么要学习Java语言3、Java平台版本说明4、Java特点 三、Java环境搭建(操作)1、JDK和JRE的概述2、JDK的下载和安装3、IDEA的安装4、IDEA的启动…...
cursor 弹出在签出前,请清理仓库工作树 窗口
问题出现的背景:是因为我有两台电脑开发,提交后,另一个电脑的代码是旧的,这个时候我想拉取最新的代码,就会出现如下弹窗,因为这个代码暂存区有记录或者工作区有代码的修改,所以有冲突࿰…...
详解直方图均衡化
直方图均衡化(Histogram Equalization) 是图像处理中一种常用的对比度增强技术,通过调整图像的灰度分布,使得图像的直方图尽可能均匀分布,从而提高图像的对比度和细节表现。以下是直方图均衡化的原理详解: …...
MyBatis-Plus 自动填充功能
MyBatis-Plus(MP) 提供了一个非常强大的功能——自动填充功能。该功能可以在执行插入或更新操作时,自动为某些字段赋值,免去手动设置这些字段的麻烦。常见的应用场景包括 创建时间 和 更新时间 字段的自动填充,帮助开发…...
认知动力学视角下的生命优化系统:多模态机器学习框架的哲学重构
认知动力学视角下的生命优化系统:多模态机器学习框架的哲学重构 一、信息熵与生命系统的耗散结构 在热力学第二定律框架下,生命系统可视为负熵流的耗散结构: d S d i S d e S dS d_iS d_eS dSdiSdeS 其中 d i S d_iS diS为内部熵…...
Kibana:Spotify Wrapped 第二部分:深入挖掘数据
作者:来自 Elastic Philipp Kahr 我们将比以往更深入地探究你的 Spotify 数据并探索你甚至不知道存在的联系。 在由 Iulia Feroli 撰写的本系列的第一部分中,我们讨论了如何获取 Spotify Wrapped 数据并在 Kibana 中对其进行可视化。在第 2 部分中&#…...
C++—类与对象(中)
目录 1、类的6个默认成员函数 2、构造函数 构造函数的特性 3、初始化列表 4、析构函数 概念 5、拷贝构造函数 6、运算符重载 7、赋值运算符重载 赋值运算符重载格式 8、前置和后置重载 9、const修饰的成员 10、取地址及const取地址重载 1、类的6个默认成员函数 一…...
MySQL 事务笔记
MySQL 事务笔记 目录 事务简介事务操作事务四大特性并发事务问题事务隔离级别总结 事务简介 事务(Transaction)是数据库操作的逻辑单元,由一组不可分割的SQL操作组成。主要用于保证: 多个操作的原子性(要么全部成功…...
红黑树和 STL —— set和map 【复习笔记】
1. 二叉搜索树 1.1 二叉搜索树的概念 相比较前文的堆,二叉搜索树并不需要必须是一棵完全二叉树 二叉搜索树(二叉排序树或二叉查找树,简称BST)是具有以下特性的二叉树: 1. 若它的左子树非空,则左子树上所…...
网络空间安全(7)攻防环境搭建
一、搭建前的准备 硬件资源:至少需要两台计算机,一台作为攻击机,用于执行攻击操作;另一台作为靶机,作为被攻击的目标。 软件资源: 操作系统:如Windows、Linux等,用于安装在攻击机和…...
HarmonyOS学习第11天:布局秘籍RelativeLayout进阶之路
布局基础:RelativeLayout 初印象 在 HarmonyOS 的界面开发中,布局是构建用户界面的关键环节,它决定了各个组件在屏幕上的位置和排列方式。而 RelativeLayout(相对布局)则是其中一种功能强大且灵活的布局方式࿰…...
【2025年2月28日稳定版】小米路由器4C刷机Immortalwrt 23.05.4系统搭载mentohust 0.3.1插件全记录
小米路由器4C刷机Immortalwrt系统搭载mentohust插件全记录 首先将路由器按住后面的reset,用一个针插进去然后等待5s左右,松开,即可重置路由器。 然后要用物理网线物理连接路由器Lan口和电脑,并将路由器WAN口连接至网口。确保电脑…...
【SpringBoot+Vue】博客项目开发二:用户登录注册模块
后端用户模块开发 制定参数交互约束 当前,我们使用MybatisX工具快速生成的代码中,包含了一个实体类,这个类中包含我们数据表中的所有字段。 但因为有些字段,是不应该返回到前端的,比如用户密码,或者前端传…...
idea + Docker + 阿里镜像服务打包部署
一、下载docker desktop软件 官网下载docker desktop,需要结合wsl使用 启动成功的画面(如果不是这个画面例如一直处理start或者是stop需要重新启动,不行就重启电脑) 打包成功的镜像在这里,如果频繁打包会导致磁盘空间被占满,需…...
从入门到精通:Linux 权限管理(rwx/chmod/chown)
目录 1. 引言:为什么需要文件权限? 2. 基础概念:理解 rwx 权限 (1)权限的三种角色 (2)权限的三种类型 (3)权限的两种表示法 (4) 目录的 rwx…...
虚拟机如何设置ip
在虚拟机中设置IP地址的具体步骤会因虚拟机软件(如VMware、VirtualBox等)和操作系统(如Windows、Linux等)的不同而有所差异。以下是几种常见虚拟机软件和操作系统的IP设置方法。 --- 一、VMware中的IP设置 1.Windows虚拟机 1. 打…...
自然语言处理:稀疏向量表示
介绍 大家好,我是博主。今天又来和大家分享自然语言处理领域的知识了。原本我计划这次分享NLP中文本表示的相关内容,不过在整理分享计划的过程中,发现这部分知识里包含一些涉及复杂数学原理和抽象概念的内容。对于刚接触NLP的小伙伴们来说&a…...
ubuntu 20.04 安装labelmg
1. 下载安装包 下载链接:下载链接 2. 安装启动 # 创建labelImg的环境 conda create -n labelImg# 激活labelImg环境 source activate labelImg安装依赖 pip install pyqt5-dev-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/cd requirements/pip install -…...
Redis版本的EOL策略与升级路径(刷到别划走)
各位看官,刷到就点进来,大数据已经抓到你喽~😊 前言 在软件行业做服务端开发的我们,多多少少都会接触到Redis,用它来缓存数据、实现分布式锁等,相关八股文烂熟于心,但是往往会忽略具…...
ExpMoveFreeHandles函数分析和备用空闲表的关系
第一部分:ExpMoveFreeHandles和备用空闲表的关系 ULONG ExpMoveFreeHandles ( IN PHANDLE_TABLE HandleTable ) { ULONG OldValue, NewValue; ULONG Index, OldIndex, NewIndex, FreeSize; PHANDLE_TABLE_ENTRY Entry, FirstEntry; EXHAND…...
[预订酒店]
预订酒店 真题目录: 点击去查看 E 卷 100分题型 题目描述 放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店(n>=k>0),并由低到高打印酒店的价格。 输入描述 第一行:n,…...
java项目之基于ssm的学籍管理系统(源码+文档)
项目简介 基于ssm的学籍管理系统实现了以下功能: 学生信息管理: 学生信息新增 学生信息修改 学籍异动管理: 学籍异动添加 学籍异动删除 学籍异动修改 学生学业管理: 学生学业添加 学生学业修改 学生学业删除 学院信息管理&am…...
SpringBoot+Redis+Mybatis-plus黑马点评
短信登录 基于Session实现登录 流程: 发送短信验证码-->短信验证码注册登录-->校验登录状态(保存用户到ThreadLocal,方便后续使用) 不能每次请求服务都要进行登录状态校验,解决办法:拦截器 在Sp…...
算法-二叉树篇23-二叉搜索树中的插入操作
二叉搜索树中的插入操作 力扣题目链接 题目描述 给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同…...
[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解
一、前言 学习STM32一阵子以后,相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED,之前的寄存器只是作为一个引入,并没有深层次的讲解,在教…...
DeepSeek-V3关键技术之一:DeepSeekMoE
DeepSeekMoE 是一种创新的大规模语言模型架构,旨在通过高效的计算流程和优化设计,在保持高性能的同时显著降低计算成本。 1. 架构设计 DeepSeekMoE 基于 Transformer 架构,融合了以下核心技术: 专家混合系统(Mixture…...
MySQL--DQL、DML、DDL、DCL概念与区别
在SQL中,根据功能和操作对象的不同,通常将语文分为四大类:DQL(数据查询语言)、DML(数据操作语言)、DDL(数据定义语言)、DCL(数据控制语言) 一、D…...
Android Activity启动流程详解
目录 Activity 启动流程详细解析 1. 应用层发起启动请求 1.1 调用 startActivity() 1.2 通过 Instrumentation 转发请求 2. 系统服务处理(AMS 阶段) 2.1 Binder IPC 通信 2.2 AMS 处理流程 2.3 跨进程回调 ApplicationThread 3. 目标进程初始化…...
夜天之书 #106 Apache 软件基金会如何投票选举?
近期若干开源组织进行换届选举。在此期间,拥有投票权的成员往往会热烈讨论,提名新成员候选人和治理团队的候选人。虽然讨论是容易进行的,但是实际的投票流程和运作方式,在一个成员众多的组织中,可能会有不少成员并不清…...
保姆级教程:用Chart.js实现柱状图与折线图联动
保姆级教程:用Chart.js实现柱状图与折线图联动 ▲ 最终实现的交互式组合图表效果 一、技术原理剖析 1.1 Chart.js渲染机制 Chart.js基于HTML5 Canvas实现图表绘制,其核心原理包括: 数据绑定:将数据对象映射为图形元素分层渲染:通过order属性控制图层叠加顺序坐标系计算:…...
