一、变量
变量是一个容器,用来装数据的。一个变量,常规来讲分为两个部分:
变量的名字:标识符
存储数据的空间:内存里面最小的存储单位是字节
在计算机世界里面,所有的数据,其实都是数字。为了方便使用,把连续的8位,作为一个字节进行处理(1 byte=8 bit)。字节是存储的最小单位。字节(Byte)每2的10次方就升级一个单位
1024 B = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
1024PB = 1ZB
不同的数据,需要使用不同的大小的空间来存储数据。
二、数据类型
为了得到一个合适大小的容器来装数据,就需要有不同的数据类型来进行处理。共分为两大类:
- 基本类型
八种
- 引用类型
无数
1.1基本类型
1.1.1四个整数
不能含有小数
byte: 8位,占一个字节空间
0是第一个正整数,byte的表示范围是 -128 ~ 127之间
short : 16位,两个字节
表示范围是 -32768 ~ 32767
int: 32位,四个字节
正负21亿
long: 64位,八个字节
-2^ 63 ~ 2^63-1
四种表示形式
十进制默认方式,所有不同进制的数据,直接输出的时候都是十进制输出
八进制数字前面0开头
十六进制0x开头,x大小写不区分
二进制 0B开头,b不区分大小写,从java 7开始支持
赋值规则
1.在使用整数的使用,不能赋予超出数据类型范围的值。
2.整数的默认类型是int,如果给byte、short直接赋予范围内容的整数,会自动转换为合适的类型。
3.如果给long赋予超过int类型的值,必须在数字后面加上L或者l。
Eg. long l1 = 22000000000L;
4.位数比较低的数值,可以直接赋予给位数比较高的变量。位数比较高的数值,赋予给位数比较低的变量,需要强制类型转换,并且可能发生溢出。
负数转换为二进制的规则
1.把数字部分转换成原码
2.把原码按位取反,得到反码
3.把反码加一得到补码
二进制转换为负数的规则
补码减一
反码取反
原码转换为十进制,前面加上负号
1.1.2两个浮点
可以有小数,浮点永远使用科学计数法表示数字
科学计数法
尾数 :不能被整除的部分(小数)
底数 :通常是10,表示10的多少次方
指数 :幂数,多少次方
100 = 0.1 * 10^3
float: 32位
最高位是符号位(第31位),0表示正数;1表示负数。
从23到30位,一共8位,是指数位。底数永远是十。
剩余的位数,就是尾数。
eg. 100的存储方式
double: 64位
double是浮点的默认值,可以满足大部分的使用情况。双精度浮点,精度比float大一倍还多。
最高位是符号位,指数位有11位, 52位尾数。
浮点数赋值规则
1.直接给浮点型变量赋值时,默认是double型
2.使用一个float类型的浮点数,需要在浮点数后面加上字母F或者f
Eg.
float f = 12.0F;
double d = 12.0;
两种表示形式
1.十进制小数的位数比较少的时候的默认形式
2.科学计数法 <尾数>E<指数>
1.0E-4 = 1.0 * 10^-4
三个特殊值
正无穷大 :正数除以0(整数不可以除以0!!),所有的正无穷大都相等。
负无穷大 :负数除以0,所有的负无穷大都相等,正负无穷大不相等,无法相加。
非数(不是数字) : 0除以0,所有的非数都不相等。
1.1.3字符
为了减少存储空间,提高程序的效率,科学家给每个字符一个编号。
这个编号在Java里面是一个只有正数的16位(两个字节)数字,每个编号对应具体的字符。
在java里面,char其实就是一个整数,并且没有负数的!范围0~65535之间。整数可以直接赋予给char,char也可以赋予给整数。
最早统一规范的字符编号是ASCII,这个编码规范里面只是规定了0~127之间的编号的使用,只有英文字符和标点符号,以及一些打印控制字符。
使用最多的ASCII是48开始的0、65开始的A、97开始的a。
除了英文之外的其他所有语言的文字,在早期的电脑里面都是没有的。后来其他的国家为了使用电脑,各自开发了自己的"字符编码"。
所有的字符编码规范互不兼容。
发送(保存)的时候使用一个编码规范进行发送和保存,那么接收(读取)的时候,必须使用相同的字符编码规范来操作。否则出现乱码。
编译使用UTF-8的编码保存的java文件,需要加上 -encoding UTF-8 参数。
Eg.Linux系统上编写的java代码,默认使用UTF-8编码,在Windows系统下编译会出现乱码,要使用如下命令行:
javac –encoding UTF-8 xxx.java
每个国家都有自己的字符编码规范,中文常用的规范:
gb2312 : 早期的中文字符编码,里面只有常用字符。
gbk : 兼容gb2312的,修正了gb2312里面的错误的地方,并且进行了扩展,支持生僻字、繁体字。
big5 : 繁体中文。
为了统一各国的编码,国际上推动Unicode字符集,包括目前地球上几乎所有的文字。
Unicode有很多的编码规范,包括UTF-8、UTF-16等。
建议以后在创建新的项目、写代码的时候统一把IDE(eclipse、NetBeans)工具的字符编码设置为UTF-8,这样比较通用一点。
不管有多少的字符集(字符编码),所有这些字符集必须要兼容ASCII,也就是0~127之间的字符,必须和ASCII重叠的。
四种表示形式
1.使用单引号包起来的一个字符
char c = '中';
2.直接给char类型的变量赋予一个整数代表ASCII表内的字符
char c = 97; // a
3.使用转义符
\
//这里直接得到一个单引号字符。
char c = '\'';
// 得到一个 \
char c = '\\';
4.使用十六进制Unicode
char c = '\uAAAA';
// 小写字母a(61是十六进制的97)
char c = '\u0061';
1.1.4布尔
boolean
只有两个固定的值 true和false
通常用于逻辑运算和比较运算。
三、数据类型转换
1.自动转换
低位给高位赋值,自动类型转换。所有的浮点,都比整数大得多!所以下列子左向右可以自动转换
byte -> short -> int -> long -> float -> double
char ↗
eg.
byte b1 = 120;
// 首先把b1的值复制一份,然后转换为int类型,赋予给i1变量
int i1 = b1;
// 也会把副本转换为long类型,然后赋予给long
long L1 = b1;
2.强制转换
必须在等号的右边,使用一个(),里面写上要转换的目标类型。所有自动类型转换方向相反的,就需要强制转换。
eg.
int i1 = 120;
//无法自动转换,必须加上(byte)进行强制转换
byte b1 = (byte)i1;
//可以,先把i1转换为byte,然后再自动把byte转换为short,不建议使用
short s1 = (byte)i1;
3.表达式类型自动提升
3.1. 任何位数低于int的变量,和数字进行数学运算和位运算,结果都是int类型。
eg.
byte b1 = 5;
// 错误:因为等号右边的结果是int类型
byte b2 = b1 + 5;
// 正确:把b1和5先进行数学运算,然后强制类型转换为byte,最后赋予给b3
byte b3 = (byte)(b1 + 5);
3.2.在同一个表达式中,如果同时存在高位和低位的变量,结果类型是高位的
eg.
int i1 = 50;
long L1 = 100;
//等号右边返回的结果类型是long类型的
long L2 = i1 + L1;
3.3.任何类型的数值和浮点进行运算,结果一定是浮点
long L3 = 500;
float d1 = 4.5F;
// 因为d1是float类型的浮点,和long类型的L3相加以后,结果是浮点
// 即使long的类型比float类型位数要高,但是浮点的范围更大
float f2 = L3 + d1;
3.4.任何类型的变量和String进行+操作,结果都是String
四、运算符
同一个计算式中运算顺序按照:括号,赋值,字符串连接运算符,数学运算符,比较运算符,逻辑运算符来进行。具体运算符的优先级参见下表
4.1赋值运算符
=
4.2字符串连接运算符
+
可以把字符串连接起来
eg.
String s1 = "abc";
String s2 = "def";
// s3 = "abcdef"
String s3 = s1 + s2;
System.out.println( s1 + s2 );// abcdef
int i1 = 123;
// 任何类型的数据,和String进行+操作,结果都是String类型
System.out.println( s1 + i1 ); // abc123
4.3数学运算符
操作数值型
+
-
*
/ : 除法 5 / 2 = 2
% : 求余数 5 % 2 = 1
在java里面,这些数学运算符,可以和=组成"扩展后的赋值运算符"
+=
-=
*=
/=
%=
自加、自减:运算符在变量的前面,先执行自加或自减,再使用变量;运算符在变量的后面,先使用变量的值,再执行自加或自减。
++
--
int i1 = 10;
// i1 = i1 + 1;
i1 ++;
System.out.println( i1 );//11
// i1 = i1 - 1;
i1 --;
System.out.println( i1 );//10
System.out.prinltn( i1++ );//10
4.4比较运算符
操作数值(byte、int...),返回boolean类型的值
>
<
==
!=
>=
<=
eg.
// b1 = false
boolean b1 = 5 > 10;
// b2 = true
boolean b2 = 5 < 10;
4.5逻辑运算符
操作boolean值,返回boolean类型的值
& : 有真必为真
| : 有假必为假
^ : 异或,运算符左右两边不同的时候,结果为true
! : 单目运算符,只有一个操作的数,运算的变量,只能在运算符的右边,对右边的值,进行取反。
!true = Not true = false
在使用&和|的时候,建议使用短路运算符(&&和||),可以提高性能,并且比较安全。
&& : 如果运算符的左边为false,那么右边的不会运算
|| : 如果运算符的左边为true,那么右边的不会运算
4.6位运算符
操作整数,直接操作变量的二进制数据
& : 与
| : 或
~ : 非
^ : 异或
>> : 右移一位,相当于除以2,符号位不变,左边补符号位
>>> : 右移一位,相当于除以2,符号位也一起移动
<< : 左移一位,相当于乘以2,右边补零
eg.
int i1 = 10;
i1 = i1 >> 2;//右移两位
System.out.println( i1 );//2
i1 = i1 << 2;
System.out.println( i1 );//8
重点
八种基本数据类型
逻辑运算符