目录
一、进制及其转换
1.1进制类型
十进制:人类使用
二进制:计算机使用
八进制和十六进制:为了更好的表示二进制(缩短二进制长度)
1.2计算机为什么使用二进制
- 物理上容易实现,可靠性强;
- 运算简单
- 便于进行逻辑运算。
二进制,是计算技术中广泛采用的一种数制,由德国数理哲学大师莱布尼茨于1679年发明。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”。
数字计算机只能识别和处理由‘0’.‘1’符号串组成的代码。其运算模式正是二进制。
二进制对应两种状态,广泛应用于电子科学。比如:可以对应电子器件的开关状态、对应信号电压状态(+5V等价于逻辑"1",0V等价于逻辑"0")、对应卡带是否打孔状态、电磁存储(磁体状态:南为0,北为1)等等。
二进制广泛应用于我们生活的方方面面。比如,广泛使用的摩尔斯电码,它由两种基本信号组成:短促的点信号“·”,读“滴”;保持一定时间的长信号“—”,读“嗒”。然后,组成了26个字母,从而拼写出相应的单词。
1.3进制转换
二进制转十进制
二进制转十进制采用“权相加法”。
十进制转二进制
十进制整数转换为二进制整数采用"除2取余,逆序排列"法。
1.4计算机数据存储单位
位 bit
最小值 0
最大值 1
表示的数的范围 0-1(21-1)
字节 byte=8bit
最小值 00000000
最大值 11111111
表示的数的范围 0-255(28-1)
字符
表示的数的范围0-65535(2^16-1)
KB、MB、GB、TB
1Byte=8bit
1KB = 1024Byte ≈103Byte
1MB = 1024KB ≈ 106Byte
1GB = 1024MB ≈ 109Byte
1TB = 1024GB ≈ 1012Byte
1.5计数范围
符号位
二进制数如何表示正数和负数呢?
使用最高位作为符号位,0代表正数,1代表负数;其余数位用作数值位,代表数值。
字节 byte表示的数的范围
无符号数:0-255(28-1) 256个数
有符号数:-128(-27)--127(27-1) 还是256个数
字符表示的数的范围
无符号数 0-65535(216-1) 65536个数
有符号数 -32768(-215)-----32767(215-1) 还是65536个数
1.6 字符集和字符编码
计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码";反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码。
字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。
常见的字符集和字符编码
ASCII (阿寺克)
- ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,到目前为止共定义了128个字符。每个字符用1个字节表示。
- 0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、DEL(删除)、BS(退格)等
- 32 空格
- 48~57为0到9十个阿拉伯数字。
- 65~90为26个大写英文字母
- 97~122号为26个小写英文字母
ISO-8859-1 ISO-8859-*
- Latin-1,是西欧常用字符,包括德法两国的字母
- 1个字节 8bit,兼容ASCII码
GB2312
- 大陆使用最早、最广的简体中文字符集;兼容ASCII编码
- 每个汉字用2个字节表示 16bit 65536
GBK
- GB2312的扩展,可以表示繁体中文
- 一个汉字用 2个字节表示
GB18030
- GBK的扩展,最新的规范,不仅可以表示汉字、还可以表示维吾尔文、藏文等多个少数民族的字符
- 一个字符用 2个字节表示
BIG5
- 台湾的大五码,表示繁体汉字 2个字节
Unicode ----UTF-8 UTF-16
- 统一码、万国码、单一码 通常认为一个字符占用2个字节
- 为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求国际通用字符集。
- 目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。然而目前只用了少数平面。第0平面(BMP)最为重要。
- Unicode 编码共有三种具体实现,分别为utf-8,utf-16,utf-32,其中utf-8占用一到四个字节,utf-16占用二或四个字节,utf-32占用四个字节
ANSI:
- 并不是某一种特定的字符编码,而是在不同的系统中,ANSI表示不同的编码。
- 在简体中文Windows操作系统中,ANSI 代表 GBK 编码;在繁体中文Windows操作系统中,ANSI代表Big5;在日文Windows操作系统中,ANSI 代表 Shift_JIS 编码。
二、标识符和变量
2.1 标识符
(只要需要我们命名的东西就是标识符)标识符是用来给变量、类、方法以及包进行命名的,如Welcome、main、System、age、name、gender等。
标识符需要遵守一定的规则:
- 标识符可以是字母、下划线“_”、美元符“$”和数字的任意组合,但是不能用数字开头。
- Java 标识符大小写敏感,且长度无限制。
- 标识符不可以是Java的关键字。
标识符的使用规范
|
Java不采用通常语言使用的ASCII字符集,而是采用Unicode这样标准的国际字符集。因此,这里字母的含义不仅仅是英文,还包括汉字等等。但是不建议大家使用汉字来定义标识符!
字母开头,数字放后面 别用空格 特殊符号只能用_$
类名首字母大小,其他的首字母小写
合法的标识符:
int a = 3; int _123 = 3; int $12aa = 3; int 变量1 = 55; //不建议使用中文命名的标识符 |
不合法的标识符:
int 1a = 3; //不能用数字开头 int a# = 3; //不能包含#这样的特殊字符 int int = 3; //不能使用关键字 |
2.2 关键字
Java关键字是Java语言保留供内部使用的,如class用于定义类。 关键字也可以称为保留字,它们的意思是一样的,我们不能使用关键字作为变量名或方法名。
Java中的关键字/保留字 | |||||
abstract | assert | boolean | break | byte | case |
catch | char | class | const | continue | default |
do | double | else | extends | final | finally |
float | for | goto | if | implements | import |
instanceof | int | interface | long | native | new |
null | package | private | protected | public | return |
short | static | strictfp | super | switch | synchronized |
this | throw | throws | transient | try | void |
volatile | while |
2.3 常量和变量
常量变量定义
在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量和常量。
变量举例:
在2D游戏程序中,需要代表人物的位置,则需要2个变量,一个是x坐标,一个是y坐标,在程序运行过程中,这两个变量的值会发生改变
常量举例
代表常数,便于程序的修改(例如:圆周率的值)
增强程序的可读性(例如:常量UP、DOWN、LEFT和RIGHT分辨代表上下左右,其数值分别是1、2、3和4)
在实际的程序中,可以根据数据在程序运行中是否发生改变,来选择应该是使用变量代表还是常量代表。
变量本质上就是代表一个”可操作的存储空间”,空间位置是确定的,但是里面放置什么值不确定。我们可通过变量名来访问“对应的存储空间”,从而操纵这个“存储空间”存储的值。
Java是一种强类型语言,每个变量都必须声明其数据类型。变量的数据类型决定了变量占据存储空间的大小。 比如,int a=3; 表示a变量的空间大小为4个字节。
变量作为程序中最基本的存储单元,其要素包括变量名,变量类型和变量值。变量在使用前必须对其声明, 只有在变量声明以后,才能为其分配相应长度的存储空间。
变量的声明
格式为:
type varName [=value][,varName[=value]...]; //[ ]中的内容为可选项,即可有可无 数据类型 变量名 [=初始值] [,变量名 [=初始值]…]; |
常量的声明
常量通常指一个固定的值,如:1、2、’a’、’b’、true、false、”helloWorld”等。在Java语言中,也可以利用关键字final来定义一个常量。 常量一旦被初始化后不能再更改其值。
声明格式为:
final type varName = value; |
为了更好的区分和表述,一般将1、2、3、’a’、’b’、true、false、”helloWorld”等称为字面常量,而使用final修饰的PI等称为符号常量。final修饰的变量就是常量,常量只能赋值一次 不能修改
常量和变量的命名规范:
- 所有变量、方法、类名:见名知义
- 类成员变量:首字母小写和驼峰原则: monthSalary
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线:MAX_VALUE
- 类名:首字母大写和驼峰原则: Man, GoodMan
- 方法名:首字母小写和驼峰原则: run(), runRun()
三、八大基本数据类型
3.1 数据类型
Java是一种强类型语言,每个变量都必须声明其数据类型。Java的数据类型可分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。
|
数据类型的分类 |
Java中定义了3类8种基本数据类型
- 数值型- byte、 short、int、 long、float、 double
- 字符型- char
- 布尔型-boolean
引用数据类型的大小统一为4个字节,记录的是其引用对象的地址!
3.2 整数数据类型
整型用于表示没有小数部分的数值,它允许是负数。整型的范围与运行Java代码的机器无关,这正是Java程序具有很强移植能力的原因之一。与此相反,C和C++程序需要针对不同的处理器选择最有效的整型。
整型数据类型 | ||
类型 | 占用存储空间 | 表数范围 |
byte 字节型 | 1字节 | -27 ~ 27-1(-128~127) |
short 短整数 | 2字节 | -215 ~ 215-1 (-32768~32767) |
int 整数型 | 4字节 | -231 ~ 231-1 (-2147483648~2147483647) 约21亿 |
long 长整形 | 8字节 | -263 ~ 263-1 |
Java 语言整型常量的四种表示形式
|
Java语言的整型常数默认为int型,声明long型常量可以后加‘ l ’或‘ L ’ 。
long类型常数的写法及变量的声明
long a = 55555555; //编译成功,在int表示的范围内(21亿内)。 long b = 55555555555;//不加L编译错误,已经超过int表示的范围。 |
报错:The literal 55555555555 of type int is out of range,所以我们需要修改代码为:
long b = 55555555555L; |
3.3 浮点数据类型
带小数的数据在Java中称为浮点型。浮点型可分为float类型和double类型。
浮点型数据类型 | ||
类型 | 占用存储空间 | 表数范围 |
float 单精度 | 4字节 | -3.403E38~3.403E38 |
double 双精度 | 8字节 | -1.798E308~1.798E308 |
float类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。而double表示这种类型的数值精度约是float类型的两倍,又被称作双精度类型,绝大部分应用程序都采用double类型。
Java浮点类型常量有两种表示形式
|
double f = 314e2; //314*10^2-->31400.0 double f2 = 314e-2; //314*10^(-2)-->3.14 |
float类型的数值有一个后缀F或者f ,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D或者d, 以明确其为double类型。
float类型常量的写法及变量的声明
float f = 3.14F;//float类型赋值时需要添加后缀F/f double d1= 3.14; double d2 = 3.14D; |
问题:float和int在内存中均占据4个字节,为什么数据范围不同
|
float f = 0.1f; double d = 1.0/10; System.out.println(f==d);//结果为false |
运行以上两个示例,发现示例2-13的结果是“false”,而示例2-14的输出结果是“d1==d2”。这是因为由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。 浮点数一般都存在舍入误差,很多数字无法精确表示(例如0.1),其结果只能是接近, 但不等于。二进制浮点数不能精确的表示0.1、0.01、0.001这样10的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。
雷区 不要使用浮点数进行比较!很多新人甚至很多理论不扎实的有工作经验的程序员也会犯这个错误!需要比较请使用BigDecimal类 |
3.4 字符数据类型
字符型在内存中占2个字节,在Java中使用单引号来表示字符常量。例如’A’是一个字符,它与”A”是不同的,”A”表示含有一个字符的字符串。
char 类型用来表示在Unicode编码表中的字符
char eChar = 'a'; char cChar ='中'; |
char cChar ='β'; |
Java 语言中还允许使用转义字符 ‘\’ 来将其后的字符转变为其它的含义。常用的转义字符及其含义和Unicode值如表2-6所示。
char c1 = '\n'; //代表换行符 |
转义字符 | ||
转义符 | 含义 | Unicode值 |
\b | 退格(backspace) | \u0008 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
\t | 制表符(tab) | \u0009 |
\“ | 双引号 | \u0022 |
\‘ | 单引号 | \u0027 |
\\ | 反斜杠 | \u005c |
Unicode具有从0到65535之间的编码,他们通常用从’\u0000’到’\uFFFF’之间的十六进制值来表示(前缀为u表示Unicode)
char c = '\u0061'; |
Char类型在内存中存储的其实就是该字符的Unicode编码,这是一个数字。其实是也可以这么赋值的。
char c2 = 'a'; char c2 = 97; |
注意事项 “a”是字符串String,不是字符char。String可以是0到多个字符组成的字符串。 String s=”asdfdasdfdasdfasdf”; |
3.5 布尔数据类型
boolean类型有两个常量值,true和false,不可以使用 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。boolean 类型用来判断逻辑条件,一般用于程序流程控制。
boolean flag = true; //或者flag=false; |
关于boolean类型几个字节的说明:
在《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8bit”。也就是说JVM规范指出boolean当做int处理,也就是4字节,boolean数组当做byte数组处理,这样我们可以得出boolean类型占了单独使用是4个字节,在数组中是确定的1个字节。
四、运算符
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操作变量。
运算符分类
算术运算符 | 二元运算符 | +,-,*,/,% |
一元运算符 | ++,-- | |
赋值运算符 | = | |
扩展运算符 | +=,-=,*=,/= | |
关系运算符 | >,<,>=,<=,==,!= instanceof | |
逻辑运算符 | &&,||,!,^ | |
条件运算符 | ? : | |
字符串连接符 | + |
相关概念辨析
- + 运算符 操作符 Operator
- 5+6 表达式 expression
- 5 6 操作数 Operand
- int m =5+6; 语句 Sentence
4.1.算术运算符
算术运算符中+,-,*,/,%属于二元运算符,二元运算符指的是需要两个操作数才能完成运算的运算符。其中的%是取模运算符,就是我们常说的求余数操作。
二元运算符的运算规则:
整数运算:
- 如果两个操作数有一个为long, 则结果也为long。
- 没有long时,结果为int。即使操作数全为short,byte,结果也是int。
浮点运算:
-
-
- 如果两个操作数有一个为double,则结果为double。
- 只有两个操作数都是float,则结果才为float。
-
取模运算:
- 其操作数可以为浮点数,一般使用整数,结果是“余数”,“余数”符号和左边操作数相同,如:7%3=1,-7%3=-1,7%-3=1。
算术运算符中++(自增),--(自减)属于一元运算符,该类运算符只需要一个操作数。
i++;和++i;
如果是一条单独的语句,没有差别,都是自增1;
如果不是一条单独的语句(语句的一部分)有差别
int n = 6 + m++; 先运算符再+1
int n = 6 + ++m; 先+1再运算
先算乘除,再算加减。算术运算符的优先级别是不同的:
++ -- 大于 * / % 大于 + -
可以使用小括号改变运算顺序
4.2.拓展运算符
赋值运算符可以说是Java中使用频率最高的运算符了,也是运算级别最低的运算符。它的运算顺序是自右向左。
除了基本赋值运算符外,还可以和算术运算符结合,组成扩展赋值运算符。
赋值及其扩展运算符 | ||
运算符 | 用法举例 | 等效的表达式 |
+= | a += b | a = a+b |
-= | a -= b | a = a-b |
*= | a *= b | a = a*b |
/= | a /= b | a = a/b |
%= | a %= b | a = a%b |
4.3.关系运算符
关系运算符用来进行比较运算,如表所示。关系运算的结果是布尔值:true/false;经常用在选择结构if、循环结构for while的条件表达式中,进行条件判断。
关系运算符 | ||
运算符 | 含义 | 示例 |
== | 等于 | a==b |
!= | 不等于 | a!=b |
> | 大于 | a>b |
< | 小于 | a<b |
>= | 大于或等于 | a>=b |
<= | 小于或等于 | a<=b |
注意事项
|
4.5.逻辑运算符
Java中的逻辑运算符如表所示。逻辑运算的操作数和运算结果都是boolean值。
生活案例:
- 用户登录成功:username正确 并且 password正确
- 用户登录失败
- username错误 或者 密码错误
- 除了登录成功之外的 除了(username正确 并且 password正确)
- 班级流动红旗颁奖
- 名次前三名 and 分数大于95分
- 名次前三名 or 分数大于95分
逻辑运算符 | ||
运算符 | 说明 | |
逻辑与 | &( 与) | 两个操作数为true,结果才是true,否则是false |
逻辑或 | |(或) | 两个操作数有一个是true,结果就是true |
短路与 | &&( 与) | 只要有一个为false,则直接返回false |
短路或 | ||(或) | 只要有一个为true, 则直接返回true |
逻辑非 | !(非) | 取反:!false为true,!true为false |
逻辑异或 | ^(异或) | 相同为false,不同为true |
短路与和短路或采用短路的方式。从左到右计算,如果只通过运算符左边的操作数就能够确定该逻辑表达式的值,则不会继续计算运算符右边的操作数,提高效率。
理解短路运算符生活案例
- 用户登录:用户名错误了,就没有必要判断密码了,肯定是登录失败
- 大明和二明都同意,妈妈才带他们去旅行。大明不去,二明不问也罢
优先级别:非>与>或,可以使用小括号改变运算顺序和提高可读性
4.6.运算符的优先级别
运算符的优先级
优先级 | 运算符 | 类 | 结合性 |
1 | () | 括号运算符 | 由左至右 |
2 | !、+(正号)、-(负号) | 一元运算符 | 由左至右 |
2 | ~ | 位逻辑运算符 | 由右至左 |
2 | ++、-- | 递增与递减运算符 | 由右至左 |
3 | *、/、% | 算术运算符 | 由左至右 |
4 | +、- | 算术运算符 | 由左至右 |
5 | <<、>> | 位左移、右移运算符 | 由左至右 |
6 | >、>=、<、<= | 关系运算符 | 由左至右 |
7 | ==、!= | 关系运算符 | 由左至右 |
8 | & | 位运算符、逻辑运算符 | 由左至右 |
9 | ^ | 位运算符、逻辑运算符 | 由左至右 |
10 | | | 位运算符、逻辑运算符 | 由左至右 |
11 | && | 逻辑运算符 | 由左至右 |
12 | || | 逻辑运算符 | 由左至右 |
13 | ? : | 条件运算符 | 由右至左 |
14 | =、+=、-=、*=、/=、%= | 赋值运算符、扩展运算符 | 由右至左 |
示例
boolean result = 1+2>3 || (12+2*5<50 && 1>2); |
|
4.7.条件运算符
java中唯一的三目运算
语法格式:
表达式?值1 :值2
x ? y : z |
其中 x 为 boolean 类型表达式,先计算 x 的值,若为true,则整个运算的结果为表达式 y 的值,否则整个运算结果为表达式 z 的值。
可以用来替代简单的if-else选择语句。
五、基本数据类型的类型转换
1.什么是类型转换
在(赋值或算术)运算时,要求数据类型相同,否则要进行类型转换
2.类型转换的类型
-
基本数据类型的类型转换:
基本数据类型可以分为数值类型(int short byte long float double char)和非数值类型(boolean)
类型转换只涉及数值类型,不涉及booleane类型
-
引用数据类型的类型转换:
父类和子类 Person Student Animal Dog 以后再讲
3.自动类型转换
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。如图所示,黑色的实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失。
|
自动类型转换 |
4.强制类型转换
强制类型转换,又被称为造型(cast),用于强制的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
语法格式:
(type)var |
运算符“()”中的type表示将值var想要转换成的目标数据类型
当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。
PS:不能在布尔类型和任何数值类型之间做强制类型转换!