Java基本语法
文章目录
- Java基本语法
- 前言
- 一、准备工作
- 1.1 计算机软件与硬件
- 1.2 计算机编程语言
- 1.3 Java语言概述&程序分析
- 1.4 Java环境搭建&Java API
- 1.5 Java核心机制JVM
- 二、变量
- 2.1 关键字&标识符
- 2.2 变量
- 2.3 数据类型(基本数据类型)
- 2.3.1 基本数据类型
- 2.3.2 基本数据类型变量间运算规则(自动&强制)
- 2.4 计算机底层存储数据
- 2.4.1 计算机存储单位(二进制)
- 2.4.2 进制的分类&换算
- 2.5 运算符
- 四、流程控制语句
- 4.1 顺序结构
- 4.2 分支语句
- 4.2.1 if-else条件判断结构
- 4.2.2 switch-case选择结构
- 4.2.3 if-else比较switch-case
- 4.3 循环语句
- 4.3.1 for循环
- 4.3.2 while循环
- 4.3.3 do-while循环
- 4.3.4 特殊的循环("无限"/嵌套)
- 五、补充
- 5.1 关键字break&continue的使用
- 5.2 Scanner类
- 5.3 获取随机数
- 5.4 关于字符集
- 5.5 代码的整洁之道
- 六、企业真题
- 6.1 准备工作方面的题目
- 6.2 变量和数据类型
- 6.3 流程控制语句
前言
包含:概述、数据类型、进制、运算符、变量、流程控制语句
一、准备工作
1.1 计算机软件与硬件
1、计算机软件和硬件的组成图
2、CPU、内存与硬盘
- CPU(Central Processing Unit,中央处理器)
- 人靠大脑思考,电脑靠CPU来运算、控制。
- 硬盘(Hard Disk Drive)
- 计算机最主要的存储设备,容量大,断电数据不丢失。
- 正常分类:
机械硬盘(HDD)
、固态硬盘(SSD)
以及混合硬盘(SSHD)
- 固态硬盘在开机速度和程序加载速度远远高于机械硬盘,缺点就是贵,所有无法完全取代机械硬盘。
- 内存(Memory)
- 负责硬盘上的数据与CPU之间数据交换处理
- 具体的:保存从硬盘读取的数据,提供给CPU使用;保存CPU的一些临时执行结果,以便CPU下次使用或保存到硬盘。
- 断电后数据丢失
3、软件介绍
软件定义:即一系列按照特定顺序组织
的计算机数据
和指令
的集合。
分类:系统软件、应用软件
4、人机交互方式:图形化GUI、命令行CLI
5、常用的DOS指令
DOS定义:(Disk Operating System,磁盘操作系统)即一个操作系统,是单用户、单任务(即只能执行一个任务)的操作系统。现在被Windows系统取代。
常用指令:
操作1:进入和回退
操作 | 说明 |
---|---|
盘符名称: | 盘符切换。E:回车,表示切换到E盘。 |
dir | 列出当前目录下的文件以及文件夹 |
cd 目录 | 进入指定单级目录。 |
cd 目录1\目录2\… | 进入指定多级目录。cd atguigu\JavaSE |
cd … | 回退到上一级目录。 |
cd \ 或 cd / | 回退到盘符目录。 |
操作2:增、删
操作 | 说明 |
---|---|
md 文件目录名 | 创建指定的文件目录。 |
rd 文件目录名 | 删除指定的文件目录(如文件目录内有数据,删除失败) |
操作3:其它
操作 | 说明 |
---|---|
cls | 清屏。 |
exit | 退出命令提示符窗口。 |
← → | 移动光标 |
↑ ↓ | 调阅历史操作命令 |
Delete和Backspace | 删除字符 |
1.2 计算机编程语言
1、计算机编程语言定义:人与计算机交流的方式。人们可以使用编程语言
对计算机下达命令
,让计算机完成人们需要的功能。
计算机语言如:C 、C++、Java、Go、JavaScript、Python,Scala等。语言 = 语法 + 逻辑
2、计算机语言简史
第一代:机器语言:使用的是最原始的穿孔卡片
。这种卡片上使用的是用二进制代码
表示的语言,称为机器语言
。
第二代:汇编语言:使用英文缩写的助记符
来表示基本的操作,比如:LOAD
、MOVE
等。也称为符号语言
。
- 缺点:与机器之间有汇编器。汇编语言是
面向机器的
,不同计算机机型特点不同,因此会有不同的汇编语言,彼此之间不能通用
。程序不易移植,较难调试。
第三代:高级语言:接近日常英语的指令来编写程序,程序中的符号和算式与日常用的数学式子差不多。独立于机器,有一定的通用性;计算机不能直接识别和执行用高级语言编写的程序,需要使用编译器或者解释器,转换为机器语言
才能被识别和执行。
面向过程的语言
:C、Pascal、Fortran、C++面向对象的语言
:Java、C++
1.3 Java语言概述&程序分析
1、Java版本概览
2、Java技术体系平台
- Java SE(Java Standard Edition)标准版**
- 支持面向
桌面级应用
(如Windows下的应用程序)的Java平台,即定位个人计算机的应用开发。 - 包括用户界面接口AWT及Swing,网络功能与国际化、图像处理能力以及输入输出支持等。
- 此版本以前称为J2SE
- 支持面向
- Java EE(Java Enterprise Edition)企业版
- 为开发企业环境下的应用程序提供的一套解决方案,即定位
在服务器端的Web应用开发
。 - JavaEE是JavaSE的扩展,增加了用于服务器开发的类库。如:Servlet能够延伸服务器的功能,通过请求-响应的模式来处理客户端的请求;JSP是一种可以将Java程序代码内嵌在网页内的技术。
- 版本以前称为J2EE
- 为开发企业环境下的应用程序提供的一套解决方案,即定位
- Java ME(Java Micro Edition)小型版
- 支持Java程序运行在
移动终端(手机、机顶盒)上的平台
,即定位在消费性电子产品的应用开发 - JavaME是JavaSE的内伸,精简了JavaSE 的核心类库,同时也提供自己的扩展类。增加了适合微小装置的类库:javax.microedition.io.*等。
- 此版本以前称为J2ME
- 支持Java程序运行在
注意:Android开发不等同于Java ME的开发
3、Java语言优点
- 跨平台性:比如:Java的int永远都是32位。不像C++可能是16,32,可能是根据编译器厂商规定的变化。通过Java语言编写的应用程序在不同的系统平台上都可以运行。“
Write once , Run Anywhere
”。
原理:只要在需要运行 java 应用程序的操作系统上,先安装一个Java虚拟机 (J
VM ,JavaV
irtualM
achine) 即可。由JVM来负责Java程序在该系统中的运行。 - 面向对象性:面向对象是一种程序设计技术,非常
适合大型软件的设计和开发
。面向对象编程支持封装、继承、多态等特性,让程序更好达到高内聚
,低耦合
的标准。 - 健壮性:吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制。
- 安全性高:Java适合于网络/分布式环境,需要提供一个安全机制以防恶意代码的攻击。如:
安全防范机制
(ClassLoader类加载器),可以分配不同的命名空间以防替代本地的同名类、字节代码检查。 - 简单性: Java就是C++语法的
简化版
,我们也可以将Java称之为“C++--
”。比如:头文件,指针运算,结构,联合,操作符重载,虚基类等。 - 高性能:Java语言本身发展中通过虚拟机的优化提升了
几十倍运行效率
。比如,通过JIT(JUST IN TIME)即时编译技术提高运行效率。Java低性能的短腿,已经被完全解决了
。业界发展上,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。
4、Java语言缺点
- 语法过于复杂、严谨,对程序员的约束比较多,与python、php等相比入门较难。
- 一般适用于大型网站开发,
整个架构会比较重
。 并非适用于所有领域
。比如,Objective C、Swift在iOS设备上就有着无可取代的地位。浏览器中的处理几乎完全由JavaScript掌控。Windows程序通常都用C++或C#编写。Java在服务器端编程和跨平台客户端应用领域则很有优势。
5、Java开发三步骤:编写、编译、运行
- 编写:将 Java 代码编写到扩展名为 .java 的源文件中
- 编译:“javac Java源文件名.后缀名java”,通过 javac.exe 命令对该 java 文件进行编译,编译后的文件,是Java的可运行文件,称为字节码文件.class
- 运行:“java 主类名字”,通过 java.exe 命令对生成的 class 文件进行运行
6、Java语言特点:严格区分大小写,标点只能是英文状态下的,阔成对出现。
常见的错误:class、String、System、main;声明为public的类名要和文件名一致
字符编码问题:cmd命令行窗口的字符编码&java源文件的字符编码。法一:将Java源文件另存为ANSI编码方式(中文操作系统下即为GBK字符集);法二:在使用javac命令式,可以指定源文件的字符编码:javac -encoding utf-8 Review01.java
建议:缩进、必要的空格(变量类型、变量、赋值符号、变量值之间填充相应控股更美观)
注释:提升了程序的可阅读性;调试程序的重要方法。被注释的文字不会出现在字节码文件中,更不会被JVM解释执行。
文档注释:可以被JDK提供的工具javadoc解析,生成一套以网页形式体现的该程序的说明文档
//单行注释
//注释文字
//多行注释
/*
注释文字1
注释文字2
注释文字3
*/
//文档注释
/**@author 指定java程序的作者@version 指定源文件的版本
*/
7、Hello代码示例
Java程序示例
- Java程序的入口是main方法
- 常见的输出语句:System.out.println(输出内容);System.out.print(输出内容);一个换行一个不换行。
- 源文件名与类名:以public修饰的类必须要一致,如果不是的话可以不一样一样,但是在实际开发中建议一样。
- 一个源文件中可以有多个类:但是只能有一个public类,编译后会生成多个.class字节码文件
class HelloChina {public static void main(String[] args) {System.out.println("HelloWorld!!");}
}
1.4 Java环境搭建&Java API
1、JDK&JRE
- JDK (
J
avaD
evelopmentK
it):是Java程序开发工具包,包含JRE
和开发人员使用的工具。JDK= JRE + 开发工具集 - JRE (
J
avaR
untimeE
nvironment) :是Java程序的运行时环境,包含JVM
和运行时所需要的核心类库
。JRE = JVM + Java SE标准类库
2、JDK版本的选择:Java 8、Java 17
3、JDK下载&环境配置流程
- JDK下载:JDK下载链接
- JDK安装:注意安装路径不要有中文
- 配置path环境:因为path环境变量是window操作系统执行命令时,所要搜寻的路径。因此配置path是希望在命令行使用javac.exe等工具时,任意目录下都可以找到这个工具所在的目录。
- 法一手动配置:变量名"JAVA_HOME":jdk\jdk1.8.0_271;变量名"Path":%JAVA_HOME%\bin
- 法二自动配置:Path变量的顺序对先后调用是有影响的。
- 测试:重新开启DOS命令行,在任意目录下输入
javac
或java
命令或java -version
,运行成功。
4、Java的开发工具
文本:Notepad++、EditPlus、Sublime Text、ultraedit
集成开发环境:eclipse、mueclipse、IntelliJ IDEA、NetBeans IDE
5、Java API文档
API的定义:(Application Programming Interface,应用程序编程接口)是 Java 提供的基本编程接口。
Java语言提供了大量的基础类,因此 Oracle 也为这些基础类提供了相应的说明文档,用于告诉开发者如何使用这些类,以及这些类里包含的方法。大多数Java书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料。
获取方式:JDK使用说明书、帮助文档
- 在线看:Java API文档
- 离线下载:Java API文档
1.5 Java核心机制JVM
1、JVM定义:(J
ava V
irtual M
achine ,Java虚拟机):是一个虚拟的计算机,是Java程序的运行环境。JVM具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。
2、JVM实现的功能
- 实现Java程序的跨平台性:编写的Java代码,都运行在JVM 之上
- 自动内存管理(内存分配、内存回收)
- Java程序在运行过程中,涉及到运算的
数据的分配
、存储
等都由JVM来完成 - Java消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间。
- GC的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上
减少了
因为没有释放空间而导致的内存泄漏
。
问题:Java程序还会出现内存溢出和内存泄漏问题吗?
会的,比如方法递归就会出现内存溢出,即在栈帧不断的调用方法都没有出栈,就会导致。
- Java程序在运行过程中,涉及到运算的
二、变量
2.1 关键字&标识符
1、关键字定义:被Java语言赋予了特殊含义,用做专门用途的字符串(或单词)
官方地址:Java关键字官网
关键字说明:
关键字一共50个
,其中const
和goto
是保留字
(reserved word)。
true
,false
,null
不在其中,它们看起来像关键字,其实是字面量,表示特殊的布尔值和空值。
2、标识符:Java中变量、方法、类等要素命名时使用的字符序列。即凡是自己可以起名字的地方都叫标识符
(1)标识符的命名规则:
- 由26个英文字母大小写,0-9 ,_或 $ 组成
- 数字不可以开头。
- 不可以使用关键字和保留字,但能包含关键字和保留字。
- Java中严格区分大小写,长度无限制。
- 标识符不能包含空格。
判断:miles、Test、a++、 --a、4#R、$4、 #44、apps、class、public、int、x、y、radius
(2)标识符的命名规范(软性要求
):“见名知意”
- 包名:多单词组成时所有字母都小写:xxxyyyzzz。
例如:java.lang、com.atguigu.bean - 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
例如:HelloWorld,String,System等 - 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
例如:age,name,bookName,main,binarySearch,getName - 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
例如:MAX_VALUE,PI,DEFAULT_CAPACITY
(3)一些问题
为什么标识符的声明规则里要求不能数字开头?
//如果允许数字开头,则如下的声明编译就可以通过:
int 123L = 12;
//进而,如下的声明中l的值到底是123?还是变量123L对应的取值12呢? 出现歧义了。
long l = 123L;
2.2 变量
1、变量的概念:是程序中不可或缺的组成单位,最基本的存储单元
- 内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化
- 变量的构成包含三个要素:
数据类型
、变量名
、存储的值
- Java中变量声明的格式:
数据类型 变量名 = 变量值
2、变量的作用:用于在内存中保存数据。
3、使用变量注意:
- Java中每个变量必须先声明,后使用。
- 使用变量名来访问这块区域的数据。
- 变量的作用域:其定义所在的一对{ }内。
- 变量只有在其
作用域
内才有效。出了作用域,变量不可以再被调用。 - 同一个作用域内,不能定义重名的变量。
4、Java中变量的数据类型
- 基本数据类型:包括
整数类型
、浮点数类型
、字符类型
、布尔类型
。 - 引用数据类型:包括
数组
、类
、接口
、枚举
、注解
、记录
。
5、变量的使用 - 变量的声明:格式:数据类型 变量名;
- 变量的赋值:就是把“值”存到该变量代表的内存空间中。同时,给变量赋的值类型必须与变量声明的类型一致或兼容。
语法格式:变量名 = 值;- 使用合适类型的
常量值
给已经声明的变量赋值 - 使用其他
变量
或者表达式
给变量赋值 - 变量可以反复赋值
- 可以将变量的声明和赋值一并执行
- 使用合适类型的
变量的使用:声明、赋值
// 变量的声明
int age; //存储一个整数类型的年龄
double weight;
char gender;//存储一个单字符类型的性别
boolean marry;//存储一个布尔类型的婚姻状态
String name;//存储一个字符串类型的姓名
//声明多个同类型的变量
int a,b,c; //表示a,b,c三个变量都是int类型。//给变量赋值
age = 18;//给变量赋的值类型必须与变量声明的类型一致或兼容
int z = 2 * x + y;//使用表达式赋值
char gender;
gender = '女';
gender = '男';//给变量重新赋值,修改gender变量的值
//同时声明和赋值
boolean isBeauty = true;
String name = "迪丽热巴";
2.3 数据类型(基本数据类型)
2.3.1 基本数据类型
1、整型类型(byte、short、int、long)
- Java的整型
常量默认为 int 型
。 - 在定义long类型时赋值时需要以"
l
"或"L
"作为后缀,否则虽然能赋值成功,但是这发生了自动类型提升。 - 有固定的表数范围和字段长度,不受具体操作系统的影响,以保证Java程序的可移植性。
2、浮点类型(float、double)也有固定的表数范围和字段长度
- 浮点型常量有两种表示形式:
- 十进制数形式。如:5.12 512.0f .512 (必须有小数点)
- 科学计数法形式。如:5.12e2 512E2 100E-2
- double:
双精度
,精度是float的两倍。Java 的浮点型常量默认为double型
- float:
单精度
,尾数可以精确到7位有效数字。因为常量默认是double,赋值时需要以"f
"或"F
"作为后缀,否则编译不通过!
浮点精度说明:
- 并不是所有的小数都能可以精确的用二进制浮点数表示。二进制浮点数不能精确的表示0.1、0.01、0.001这样10的负次幂。
- 浮点类型float、double的数据不适合在
不容许舍入误差
的金融计算领域。如果需要精确
数字计算或保留指定位数的精度,需要使用BigDecimal类
。
3、字符类型char
-
用来表示通常意义上“
字符
”(占2字节,由四位十六进制表示);因为它都对应有Unicode码,可以看做是一个数值进行运算。 -
Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。
-
特殊的字符对应在计算机存储的二进制:‘1’:49;‘a’:97;‘A’:65
-
字符型变量的三种表现形式:
- 形式1:使用单引号(’ ')括起来的
单个字符
。
例如:char c1 = ‘a’; char c2 = ‘中’; char c3 = ‘9’; - 形式2:直接使用
Unicode值
来表示字符型常量:‘\uXXXX
’。其中,XXXX代表一个十六进制整数。
例如:\u0023 表示 ‘#’。 - 形式3:Java中还允许使用
转义字符‘\’
来将其后的字符转变为特殊字符型常量。
例如:char c3 = ‘\n’; // '\n’表示换行符
转义字符 说明 Unicode表示方式(16进制) 对应的十进制 \n
换行符 \u000a 10 \t
制表符 \u0009 9 \"
双引号 \u0022 34 \'
单引号 \u0027 39 \\
反斜线 \u005c 92 \b
退格符 \u0008 8 \r
回车符 \u000d 13 - 形式1:使用单引号(’ ')括起来的
总结char类型:每个字符都有对应的Unicode编码,因此可以计算机中以二进制形式存储,如果不参与运算,那么就是他本来的字符,如果参与运算得到就是数值,转义字符也是一样的。
System.out.println('1'+2);//51
System.out.println('1');//1
System.out.println('\r'+1);//14
System.out.println('\r');//回车符的效果
4、boolean类型:用来判断逻辑条件,一般用于流程控制语句中(if/where/for/do-while)
- 只有两个值:true、false
- 不可以使用0或非 0 的整数替代false和true,这点和C语言不同。
- 拓展:Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达所操作的boolean值,在编译之后都使用java虚拟机中的int数据类型来代替:true用1表示,false用0表示。
5、基本数据类型总结对比
类 型 | 占用存储空间 | 表数范围 |
---|---|---|
byte | 1字节=8bit位 | -128~127 |
short | 2字节 | -215 ~215-1 |
int | 4字节 | -231~231-1(约21亿) |
long | 8字节 | -263 ~263-1 |
单精度float | 4字节 | -3.403E38~3.403E38 |
双精度double | 8字节 | -1.798E308~1.798E308 |
char | 2字节 | |
boolean |
2.3.2 基本数据类型变量间运算规则(自动&强制)
在Java程序中,不同的基本数据类型(只有7种,不包含boolean类型)变量的值经常需要进行相互转换。
1、基本数据类型
- 自动类型提升:将取值范围小(或容量小)的类型自动提升为取值范围大(或容量大)的类型
- 赋值:当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时
- 运算:当存储范围小的数据类型与存储范围大的数据类型变量一起混合运算时,会按照其中最大的类型运算。
- 运算:当byte,short,char数据类型的变量进行算术运算时,按照int类型处理。
- 强制类型转换:将取值范围大(或容量大)的类型强制转换成取值范围小(或容量小)的类型。
- 当把存储范围大的值(常量值、变量的值、表达式计算的结果值)强制转换为存储范围小的变量时,可能会
损失精度
或溢出
。 - 当某个值想要提升数据类型时,也可以使用强制类型转换。没有风险
- 声明long类型变量时,可以出现省略后缀的情况。float则不同,因为默认常量变量是double,所以不知直接赋值给float
2、基本数据类型与String的运算
String类型:引用数据类型,用"0/1/多个字符"表示,声明格式:String str = “尚硅谷”;
- 当把存储范围大的值(常量值、变量的值、表达式计算的结果值)强制转换为存储范围小的变量时,可能会
任意八种基本数据类型的数据与String类型只能进行连接“+”运算
,且结果一定也是String类型(+有连接、运算之意)- String类型不能通过强制类型()转换,转为其他的类型。但是可以借助包装类的方法转(包装类中提供了这样的方法)
String str = "123";
int num = (int)str;//错误的
int num = Integer.parseInt(str);//正确的,后面才能讲到,借助包装类的方法才能转
2.4 计算机底层存储数据
2.4.1 计算机存储单位(二进制)
1、计算机存储单位:Byte、bit
- 位(bit):即比特,是数据存储的
最小
单位。二进制数系统中,每个0或1就是一个位 - 字节(Byte):是计算机用于
计量存储容量
的基本
单位。 - 转换关系:
- 8 bit = 1 Byte
- 1024 Byte = 1 KB
- 1024 KB = 1 MB
- 1024 MB = 1 GB
- 1024 GB = 1 TB
2、在计算机中如何使用二进制表示整数?
说明:计算机数据的存储使用二进制补码
形式存储,并且最高位是符号位
。正数0、负数1【注意与布尔类型boolean的false位0,true为1做一个区分】
- 正数:补码与反码、原码一样,称为
三码合一
- 负数:原码(最高位符号位为1)→补码(符号位不变,其余取反)→补码(反码+1)
例1:byte类型(1个字节,8位)
25 ==> 原码 0001 1001 ==> 反码 0001 1001 -->补码 0001 1001
-25 ==>原码 1001 1001 ==> 反码1110 0110 ==>补码 1110 0111
例2:整数类型
正数:25 00000000 00000000 000000000 00011001(原码)
正数:25 00000000 00000000 000000000 00011001(反码)
正数:25 00000000 00000000 000000000 00011001(补码)负数:-25 10000000 00000000 000000000 00011001(原码)
负数:-25 11111111 11111111 111111111 11100110(反码)
负数:-25 11111111 11111111 111111111 11100111(补码)
一个字节可以存储的整数范围是多少?
//1个字节:8位
0000 0001 ~ 0111 111 ==> 1~127
1000 0001 ~ 1111 1111 ==> -127 ~ -1
0000 0000 ==>0
1000 0000 ==> -128(特殊规定)=-127-1
2.4.2 进制的分类&换算
1、进制分类
- 十进制(decimal):数字组成:0-9;进位规则:满十进一
- 二进制(binary):数字组成:0-1;进位规则:满二进一,以
0b
或0B
开头 - 八进制(octal):数字组成:0-7;进位规则:满八进一,以数字
0
开头表示 - 十六进制:数字组成:0-9,a-f;进位规则:满十六进一,以
0x
或0X
开头表示。此处的 a-f 不区分大小写
2、进制换算
- 2→10:权相加法,最高位是符号位
- 10→2:
除2取余的逆
- 2→8、16&8、16→2:8进制是每3位、16进制是每4位为一组
总结:各个进制之间的转换
各个进制之间的对应:了解即可,重要的是会计算
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | a或A |
11 | 1011 | 13 | b或B |
12 | 1100 | 14 | c或C |
13 | 1101 | 15 | d或D |
14 | 1110 | 16 | e或E |
15 | 1111 | 17 | f或F |
16 | 10000 | 20 | 10 |
2.5 运算符
1、运算符定义:一种特殊的符号,用以表示数据的运算、赋值和比较等。
2、运算符的分类:
- 按照
功能
分为:算术运算符、赋值运算符、比较(或关系)运算符、逻辑运算符、位运算符、条件运算符、Lambda运算符
分类 | 运算符 |
---|---|
算术运算符(7个) | +、-、*、/、%、++、– |
赋值运算符(12个) | =、+=、-=、*=、/=、%=、>>=、<<=、>>>=、&=、|=、^=等 |
比较(或关系)运算符(6个) | >、>=、<、<=、==、!= |
逻辑运算符(6个) | &、|、^、!、&&、|| |
位运算符(7个) | &、|、^、~、<<、>>、>>> |
条件运算符(1个) | (条件表达式)?结果1:结果2 |
Lambda运算符(1个) | ->(第18章时讲解) |
- 按照
操作数个数
分为:一元运算符(单目运算符)、二元运算符(双目运算符)、三元运算符 (三目运算符)
分类 | 运算符 |
---|---|
一元运算符(单目运算符) | 正号(+)、负号(-)、++、–、!、~ |
二元运算符(双目运算符) | 除了一元和三元运算符剩下的都是二元运算符 |
三元运算符 (三目运算符) | (条件表达式)?结果1:结果2 |
总结:
+、-有加减、正负号之意,其中+还有连接之意
接下来是运算符分类的详细讲解
1、算术运算符
正负号:+、-
加减乘除取余:+、-、×、/、%,其中/(返回值浮点类型:完整;返回值整数:只取整数部分,即向0取整【注意与VB语言的区别】)
自增自减
注意:
+可以表示正号、加号、连接,有数值/字符表示加法,但凡有一个字符串(无论是否是数值型的字符串)都是连接;
-可以表示负号、减法
++:单独使用没有区别,符合使用时①变量前++
:变量先自增1,然后再运算;②变量后++
:变量先运算,然后再自增1。
2、赋值运算符
- 符号:=
- 当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。
- 支持
连续赋值
。
- 扩展赋值运算符: +=、 -=、*=、 /=、%=:先将符号左边的值和右边的值操作,再将结果赋值给左边的变量。
3、比较(关系)运算符:结果为true/false
- 比较运算符的结果都是boolean型,也就是要么是true,要么是false。
- < 、 > 、 >= 、 <= :只适用于基本数据类型(除boolean类型之外)
== 、 != :适用于基本数据类型和引用数据类型
instanceof:检查是否是类的对象(子类的对象也行):“Hello” instanceof String结果为true - 比较运算符“
==
”不能误写成“=
” ,因为在java中=表示赋值操作
4、逻辑运算符:操作的都是boolean类型的变量或常量,而且运算得结果也是boolean类型的值。
- & 和 &&:“且”,同真为真
- &:如果符号左边是false,则继续执行符号右边的操作
- &&:短路与,如果符号左边是false,则二者都执行符号右边的操作
- | 和 || :“或”,同假为假
- |:如果符号左边是true,则继续执行符号右边的操作
- ||:短路或,如果符号左边是true,则不再继续执行符号右边的操作
- ! :“非”
- ^ :异或,强调异,两边不同为true。
注意:逻辑运算符用于连接布尔型表达式,在Java中不可以写成 3 < x < 6,应该写成x > 3 & x < 6 。
5、位运算符:都是基于二进制的补码运算,计算用补码,看结果用原码
- <<、>>、>>>:<<左移就是移除最高位补低位0,>>右移移低位补高位(最高位是1补1,是0补0),>>>无符号右移,移低位补高位(无论高位是什么都用0补)
注意:没有<<<;<<左移相当于×2,>>右移相当于÷2(但是这里是向下取整),>>>无符号右移正数效果和>>一致,负数效果就不一样了 - &:同1为1
- |:同0为0
- ~:取反
- ^:异或,强调异
举例
-
左移:在一定范围内,数据每向左移动一位,相当于原数据2。(正数、负数都适用)
3<<4 类似于 32的4次幂 => 3*16 => 48
最高位一出去4位,低位用0补
-
-3<<4 类似于 -32的4次幂 => -316 => -48
先求出-3的补码,在用补码进行计算,计算后,结果再转回原码
-
右移>>:在一定范围内,数据每向右移动一位,相当于原数据/2(但是这里与运算符/有区别,/表示向0取整,而这里表示向下取整)。(正数、负数都适用)
69>>4 类似于 69/2的4次 = 69/16 =4
-
-69>>4 类似于 -69/2的4次 = -69/16 = -5,与/有区别,/表示向0取整,而这里是向下取整
-
无符号右移>>>:往右移动后,左边空出来的位直接补0。(正数、负数都适用)
69>>>4 类似于 69/2的4次 = 69/16 =4
-69>>>4 结果:268435451
问题:为什么用4字节来计算?
因为低于4个字节的都是一个槽位(slot,等于4个字节)。编译时不谈占几个字节。JVM分配内存空间,int即4个字节byte。
在内存中,byte\short\char\boolean\int\float : 占用1个slot
double\long :占用2个slot
6、条件表达式:条件表达式是boolean类型的结果,根据boolean的值选择表达式1或表达式2
格式:(条件表达式)? 表达式1:表达式2
都可以转为if-else结构
7、运算符优先级
在表达式运算中的运算符顺序。
- 不要过多的依赖运算的优先级来控制表达式的执行顺序,这样可读性太差,尽量
使用()来控制
表达式的执行顺序。 - 不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它
分成几步
来完成。例如:
(num1 + num2) * 2 > num3 && num2 > num3 ? num3 : num1 + num2;
优先级 | 运算符说明 | Java运算符 |
---|---|---|
1 | 括号 | () 、[] 、{} |
2 | 正负号 | + 、- |
3 | 单元运算符 | ++ 、-- 、~ 、! |
4 | 乘法、除法、求余 | * 、/ 、% |
5 | 加法、减法 | + 、- |
6 | 移位运算符 | << 、>> 、>>> |
7 | 关系运算符 | < 、<= 、>= 、> 、instanceof |
8 | 等价运算符 | == 、!= |
9 | 按位与 | & |
10 | 按位异或 | ^ |
11 | 按位或 | ` |
12 | 条件与 | && |
13 | 条件或 | ` |
14 | 三元运算符 | ? : |
15 | 赋值运算符 | = 、+= 、-= 、*= 、/= 、%= |
16 | 位赋值运算符 | &= 、` |
四、流程控制语句
程序设计中规定的三种
流程结构,即:
- 顺序结构
- 程序从上到下逐行地执行,中间没有任何判断和跳转。
- 分支结构
- 根据条件,选择性地执行某段代码。
- 有
if…else
和switch-case
两种分支语句。
- 循环结构
- 根据循环条件,重复性的执行某段代码。
- 有
for
、while
、do-while
三种循环语句。 - 补充:JDK5.0 提供了
foreach
循环,方便的遍历集合、数组元素。(第12章集合中讲解)
4.1 顺序结构
1、定义:是程序从上到下逐行
地执行。表达式语句都是顺序执行的。并且上一行对某个变量的修改对下一行会产生影响。
4.2 分支语句
4.2.1 if-else条件判断结构
1、基本语法:条件表达式必须是布尔表达式(关系表达式或逻辑表达式)或 布尔变量。
注意点:
- 当条件表达式之间是“
互斥
”关系时(即彼此没有交集),条件判断语句及执行语句间顺序无所谓。 - 当条件表达式之间是“
包含
”关系时,“小上大下 / 子上父下
”,否则范围小的条件表达式将不可能被执行。 - 语句块只有一条执行语句时,一对
{}可以省略
,但建议保留 - 当if-else结构是“多选一”时,最后的
else是可选的
,根据需要可以省略
结构1:单分支条件判断:if。执行流程如下
- 首先判断条件表达式看其结果是true还是false
- 如果是true就执行语句块
- 如果是false就不执行语句块
if(条件表达式){语句块;
}
结构2:双分支条件判断:if…else
- 首先判断条件表达式看其结果是true还是false
- 如果是true就执行语句块1
- 如果是false就执行语句块2
if(条件表达式) { 语句块1;
}else {语句块2;
}
结构3:多分支条件判断:if…else if…else:一旦条件表达式为true,则进入执行相应的语句块。执行完对应的语句块之后,就跳出当前结构。
- 首先判断关系表达式1看其结果是true还是false
- 如果是true就执行语句块1,然后结束当前多分支
- 如果是false就继续判断关系表达式2看其结果是true还是false
- 如果是true就执行语句块2,然后结束当前多分支
- 如果是false就继续判断关系表达式…看其结果是true还是false
…- 如果没有任何关系表达式为true,就执行语句块n+1,然后结束当前多分支。
if (条件表达式1) {语句块1;
} else if (条件表达式2) {语句块2;
}
...
}else if (条件表达式n) {语句块n;
} else {语句块n+1;
}
嵌套结构:在 if 的语句块中,或者是在else语句块中,又包含了另外一个条件判断(可以是单分支、双分支、多分支)
执行的特点:
(1)如果是嵌套在if语句块中的,只有当外部的if条件满足,才会去判断内部的条件
(2)如果是嵌套在else语句块中的,只有当外部的if条件不满足,进入else后,才会去判断内部的条件
4.2.2 switch-case选择结构
1、switch-case的使用注意点
- switch(表达式)中表达式的值必须是下述几种类型之一:byte,short,char,int,枚举 (jdk 5.0),String (jdk 7.0);
- case子句中的值必须是常量,不能是变量名或不确定的表达式值或范围;
- 同一个switch语句,所有case子句中的常量值互不相同;
- break语句用来在执行完一个case分支后使程序跳出switch语句块;
如果没有break,程序会顺序执行到switch结尾;【穿透现象】 - default子句是可选的。同时,位置也是灵活的。当没有匹配的case时,执行default语句。
switch-case的基本语法
- 第1步:根据switch中表达式的值,依次匹配各个case。如果表达式的值等于某个case中的常量值,则执行对应case中的执行语句。
- 第2步:执行完此case的执行语句以后,
- 情况1:如果遇到break,则执行break并跳出当前的switch-case结构
- 情况2:如果没有遇到break,则会继续执行当前case之后的其它case中的执行语句。—>case穿透
…- 直到遇到break关键字或执行完所有的case及default的执行语句,跳出当前的switch-case结构
switch(表达式){case 常量值1:语句块1;//break;case 常量值2:语句块2;//break; // ...[default:语句块n+1;break;]
}
2、利用case的穿透性
在switch语句中,如果case的后面不写break,将出现穿透现象,也就是一旦匹配成功,不会在判断下一个case的值,直接向后运行,直到遇到break或者整个switch语句结束,执行终止。
4.2.3 if-else比较switch-case
1、凡是使用switch-case的结构都可转换为if-else结构。反之,不成立。如果都能使用情况,建议switch-case。因为效率稍高。2、细节对比:
- if-else语句优势
- if语句的条件是一个布尔类型值,if条件表达式为true则进入分支,可以用于范围的判断,也可以用于等值的判断,
使用范围更广
。 - switch语句的条件是一个常量值(byte,short,int,char,枚举,String),只能判断某个变量或表达式的结果是否等于某个常量值,
使用场景较狭窄
。
- if语句的条件是一个布尔类型值,if条件表达式为true则进入分支,可以用于范围的判断,也可以用于等值的判断,
- switch语句优势
- 当条件是判断某个变量或表达式是否等于某个固定的常量值时,使用if和switch都可以,习惯上使用switch更多。因为
效率稍高
。当条件是区间范围的判断时,只能使用if语句。 - 使用switch可以利用
穿透性
,同时执行多个分支,而if…else没有穿透性。
- 当条件是判断某个变量或表达式是否等于某个固定的常量值时,使用if和switch都可以,习惯上使用switch更多。因为
4.3 循环语句
1、理解:循环语句具有在某些条件
满足的情况下,反复执行
特定代码的功能。
循环结构分类:for 循环、while 循环、do-while 循环
循环结构四要素
:初始化部分、循环条件部分、循环体部分、迭代部分
如何结束循环:满足循环条件、break
2、循环次数:do-while循环至少执行一次循环体语句;for和while循环先判断循环条件语句是否成立,然后决定是否执行循环体。
3、如何选择:
- 遍历有明显的循环次数(范围)的需求,选择for循环
- 遍历没有明显的循环次数(范围)的需求,选择while循环
- 如果循环体语句块至少执行一次,可以考虑使用do-while循环
- 本质上:三种循环之间完全可以互相转换,都能实现循环的功能
4.3.1 for循环
1、语法格式:①-②-③-④-②-③-④-②-③-④-…-②
- for(;;)中的两个;不能多也不能少
- ①初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔
- ②循环条件部分为boolean类型表达式,当值为false时,退出循环
- ④可以有多个变量更新,用逗号分隔
for (①初始化部分; ②循环条件部分; ④迭代部分){③循环体部分;
}
4.3.2 while循环
1、语法:①-②-③-④-②-③-④-②-③-④-…-②
- while(循环条件)中循环条件必须是boolean类型。
- 注意不要忘记声明④迭代部分。否则,循环将不能结束,变成死循环。
- for循环和while循环可以相互转换。二者没有性能上的差别。实际开发中,根据具体结构的情况,选择哪个格式更合适、美观。
- for循环与while循环的区别:初始化条件部分的作用域不同。
①初始化部分
while(②循环条件部分){③循环体部分;④迭代部分;
}
4.3.3 do-while循环
1、语法:①-③-④-②-③-④-②-③-④-…-②
- 结尾while(循环条件)中循环条件必须是boolean类型
- do{}while();最后有一个分号
- do-while结构的循环体语句是至少会执行一次,这个和for和while是不一样的
- 循环的三个结构for、while、do-while三者是可以相互转换的。
①初始化部分;
do{③循环体部分④迭代部分
}while(②循环条件部分);
4.3.4 特殊的循环(“无限”/嵌套)
1、“无限循环”:有时并不确定需要循环多少次,需要根据循环体内部某些条件,来控制循环的结束(使用break)。如果此循环结构不能终止,则构成了死循环
格式:while(true)
, for(;;)
2、嵌套循环:本质上就是把内层循环当成外层循环的循环体。只有当内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的外层循环。一般不会出现超过三层的嵌套循环。
执行特点:外层循环执行一次,内层循环执行一轮。
- 外层循环:循环结构A
- 内层循环:循环结构B
指一个循环结构A的循环体是另一个循环结构B。比如,for循环里面还有一个for循环,就是嵌套循环。其中,for ,while ,do-while均可以作为外层循环或内层循环。设外层循环次数为m
次,内层为n
次,则内层循环体实际上需要执行m*n`次。
两个for嵌套循环格式:① - ② - ③ - ④ - ⑤ - ⑥ - ④ - ⑤ - ⑥ - … - ④ - ⑦ - ② - ③ - ④ - ⑤ - ⑥ - ④…
for(初始化语句①; 循环条件语句②; 迭代语句⑦) {for(初始化语句③; 循环条件语句④; 迭代语句⑥) {循环体语句⑤;}
}
五、补充
5.1 关键字break&continue的使用
很多语言都有goto语句,goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它,但使程序容易出错。Java中的break和continue是不同于goto的。
1、break:一旦执行,就结束(或跳出)当前循环结构,此关键字的后面,不能声明语句
continue:一旦执行,就结束(或跳出)当次循环结构,此关键字的后面,不能声明语句
5.2 Scanner类
1、如何从键盘获取不同类型(基本数据类型、String类型)的变量:使用Scanner类。
2、键盘输入代码的四个步骤:
- 导包:
import java.util.Scanner;
- 创建Scanner类型的对象:
Scanner scan = new Scanner(System.in);
- 调用Scanner类的相关方法(
next() / nextXxx()
),来获取指定类型的变量 - 释放资源:
scan.close();
注意:需要根据相应的方法,来输入指定类型的值。如果输入的数据类型与要求的类型不匹配时,会报异常 导致程序终止。
没有专门针对char的,所以使用next().charAt()
5.3 获取随机数
如何产生一个指定范围的随机整数?
Math类的random()的调用,会返回一个[0,1)范围的一个double型值
如何获取
[a,b]
范围内的随机整数呢?(int)(Math.random() * (b - a + 1)) + a
获得[1,6]之间的整数
class MathRandomTest {public static void main(String[] args) {double value = Math.random();System.out.println(value);//[1,6]int number = (int)(Math.random() * 6) + 1; //System.out.println(number);}
}
5.4 关于字符集
计算机中储存的信息都是用二进制数
表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。
1、字符集
编码:按照某种规则,将字符存储到计算机中
解码:将存储在计算机中的二进制数按照某种规则解析显示出来
字符编码(Character Encoding): 就是一套自然语言的字符与二进制数之间的对应规则。
字符集:也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。
2、ASCII码
- ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码):上个世纪60年代,美国制定了一套字符编码,对
英语字符
与二进制位之间的关系,做了统一规定。这被称为ASCII码。 - ASCII码用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)。
- 基本的ASCII字符集,使用7位(bits)表示一个字符(最前面的1位统一规定为0),共
128个
字符。比如:空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。 - 缺点:不能表示所有字符。
3、ISO-8859-1字符集 - 拉丁码表,别名Latin-1,用于显示欧洲使用的语言,包括荷兰语、德语、意大利语、葡萄牙语等
- ISO-8859-1使用单字节编码,兼容ASCII编码
。
4、GBxxx字符集 - GB就是国标的意思,是为了
显示中文
而设计的一套字符集。 - GB2312:简体中文码表。一个小于127的字符的意义与原来相同,即向下兼容ASCII码。但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含
7000多个简体汉字
,此外数学符号、罗马希腊的字母、日文的假名们都编进去了,这就是常说的"全角"字符,而原来在127号以下的那些符号就叫"半角"字符了。 - GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了
双字节
编码方案,共收录了21003个
汉字,完全兼容GB2312标准,同时支持繁体汉字
以及日韩汉字等。 - GB18030:最新的中文码表。收录汉字
70244个
,采用多字节
编码,每个字可以由1个、2个或4个字节组成。支持中国国内少数民族的文字,同时支持繁体汉字以及日韩汉字等。
5、Unicode码
- Unicode编码为表达
任意语言的任意字符
而设计,也称为统一码、标准万国码。Unicode 将世界上所有的文字用2个字节
统一进行编码,为每个字符设定唯一的二进制编码,以满足跨语言、跨平台进行文本处理的要求。 - Unicode 的缺点:这里有三个问题:
- 第一,英文字母只用一个字节表示就够了,如果用更多的字节存储是
极大的浪费
。 - 第二,如何才能
区别Unicode和ASCII
?计算机怎么知道两个字节表示一个符号,而不是分别表示两个符号呢? - 第三,如果和GBK等双字节编码方式一样,用最高位是1或0表示两个字节和一个字节,就少了很多值无法用于表示字符,
不够表示所有字符
。
- 第一,英文字母只用一个字节表示就够了,如果用更多的字节存储是
- Unicode在很长一段时间内无法推广,直到互联网的出现,为解决Unicode如何在网络上传输的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现。具体来说,有三种编码方案,UTF-8、UTF-16和UTF-32。
6、UTF-8
-
Unicode是字符集,UTF-8、UTF-16、UTF-32是三种
将数字转换到程序数据
的编码方案。顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。其中,UTF-8 是在互联网上使用最广
的一种 Unicode 的实现方式。 -
互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。所以,我们开发Web应用,也要使用UTF-8编码。UTF-8 是一种
变长的编码方式
。它可以使用 1-4 个字节表示一个符号它使用一至四个字节为每个字符编码,编码规则:- 128个US-ASCII字符,只需一个字节编码。
- 拉丁文等字符,需要二个字节编码。
- 大部分常用字(含中文),使用三个字节编码。
- 其他极少使用的Unicode辅助字符,使用四字节编码。
-
举例
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制) |
---|---|
0000 0000-0000 007F | 0xxxxxxx(兼容原来的ASCII) |
0000 0080-0000 07FF | 110xxxxx 10xxxxxx |
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
7、小结
注意:在中文操作系统上,ANSI(美国国家标准学会、AMERICAN NATIONAL STANDARDS INSTITUTE: ANSI)编码即为GBK;在英文操作系统上,ANSI编码即为ISO-8859-1。
5.5 代码的整洁之道
六、企业真题
6.1 准备工作方面的题目
1、一个”.java”源文件中是否可以包括多个类?有什么限制(明*数据)
是!
一个源文件中可以声明多个类,但是最多只能有一个类使用public进行声明。
且要求声明为public的类的类名与源文件名相同。
2、Java 的优势
跨平台型、安全性高、简单性、高性能、面向对象性、健壮性
3、常用的几个命令行操作都有哪些?(至少4个)
略
4、Java 中是否存在内存溢出、内存泄漏?如何解决?举例说明
存在!
比如方法递归
5. 如何看待Java是一门半编译半解释型的语言
6.2 变量和数据类型
1、高效的方式计算2 * 8的值
使用 << ,左移表示*2几位幂次方
2、和&&的区别?
与、短路与,如果前面为true,后面还需要看,但是如果前面为false,&&就不需要看后面了
3、Java中的基本类型有哪些?String 是最基本的数据类型吗?
8种基本数据类型。(略)byte(1byte=8bit)、short、int、long;float、double(8)、char(unicode、ASCII、98表示ASCII会显示对应的字符)、boolean
String不是,属于引用数据类型。
4、Java中的基本数据类型包括哪些?
5、Java开发中计算金额时使用什么数据类型?
不能使用float或double,因为精度不高。BigDecimal
使用BigDecimal类替换,可以实现任意精度的数据的运算。
6、char型变量中能不能存储一个中文汉字,为什么?
可以的。char c1 = ‘中’;
char c2 = ‘a’。
因为char使用的是unicode字符集,包含了世界范围的所有的字符。
7、代码分析
short s1=1;
s1=s1+1; //有什么错? =右边是int类型。需要强转
short s1=1;
s1+=1; //有什么错? 没错,JVM会自动转换
8、int i=0; i=i++执行这两句化后变量 i 的值为
第二句:有一个操作栈,先取值后运算
(1)先取m的值“2”放操作数栈 (2)m再自增,m=3 (3)再把操作数栈中的"2"赋值给m,m=2
9、如何将两个变量的值互换
String s1 = "abc";
String s2 = "123";
String temp = s1;
s1 = s2;
s2 = temp;
10、 boolean 占几个字节
编译时不谈占几个字节。JVM分配内存空间,int即4个字节byte。
但是JVM在给boolean类型分配内存空间时,boolean类型的变量占据一个槽位(slot,等于4个字节)。
细节:true:1 false:0
低于4个字节的都是一个槽位!
拓展:在内存中,byte\short\char\boolean\int\float : 占用1个slot
double\long :占用2个slot
11、为什么Java中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之间的十进制小数。
所以在编程中,遇见小数判断相等情况,比如开发银行、交易等系统,可以采用四舍五入
或者“同乘同除
”等方式进行验证,避免上述问题。
6.3 流程控制语句
1、break和continue的作用
break:结束循环
continue:结束本次循环
2、if分支语句和switch分支语句的异同之处?&什么时候用语句if,什么时候选用语句switch?
- if-else语句优势
- if语句的条件是一个布尔类型值,if条件表达式为true则进入分支,可以用于范围的判断,也可以用于等值的判断,
使用范围更广
。 - switch语句的条件是一个常量值(byte,short,int,char,枚举,String),只能判断某个变量或表达式的结果是否等于某个常量值,
使用场景较狭窄
。
- if语句的条件是一个布尔类型值,if条件表达式为true则进入分支,可以用于范围的判断,也可以用于等值的判断,
- switch语句优势
- 当条件是判断某个变量或表达式是否等于某个固定的常量值时,使用if和switch都可以,习惯上使用switch更多。因为
效率稍高
。当条件是区间范围的判断时,只能使用if语句。 - 使用switch可以利用
穿透性
,同时执行多个分支,而if…else没有穿透性。
- 当条件是判断某个变量或表达式是否等于某个固定的常量值时,使用if和switch都可以,习惯上使用switch更多。因为
3、switch语句中忘写break会发生什么
case穿透
4、Java支持哪些类型循环(上海*睿)
for;while;do-while
增强for (或foreach),放到集合中讲解
5、hile和do while循环的区别(国*科技研究院)
do-while至少会执行一次。