数据、运算符
1.数据
- 数据的表示
- 数据类型
-基本数据类型
-引用数据类型 - 数据类型转换
-自动类型转换
-强制类型转换
1.1 数据的表示
- 数字、图像、声音、字符……任何的数据形式,其最终都是以二进制bit码存储于计算机中的;
- 数据的表示形式除了二进制,还有八进制、十进制、十六进制等。
System.out.println(16);//十进制的16
System.out.println(0b10000);//二进制的16,前加"0b",表示二进制
System.out.println(020);//八进制的16,前加0
System.out.println(0x10);//十六进制的16,前加0x
-
注意:计算机中的最小存储单元是字节(Byte),等于8bit,不是bit!!
-
各进制间的转换;
-
字符在计算中的存储原理:将字符同二进制对应的ASCII编码表等对应关系表。汉字不在ASCII码表中;
-
图像数据存储原理:图像由许多固定大小的像素组成,每个像素存储有灰度或RGB(Red\Green\Blue)值;举例:
RGB(0,0,0) 表示黑色 RGB(255,255,255) 表示白色 RGB(255,255,0) 表示红色与绿色混合成的黄色
1.2 数据类型
定义变量时,我们都需要指定声明数据类型,数据类型就是用来规定变量存储什么类型的数据的。
数据类型可以分为两大类:基本数据类型、引用数据类型
-
基本数据类型
基本数据类型的数据存储在栈内存中,它又被分为了四类八种:
数据类型 | 种类 | 内存占用(Byte) | 数值范围 | 默认值 |
---|---|---|---|---|
整型 | byte | 1 | -128~127 | 0 |
整型 | short | 2 | -23760~32767 | 0 |
整型 | int(默认) | 4 | -2^31 ~ (2^31) - 1 | 0 |
整型 | long | 8 | -2^63 ~ (2^63) - 1 | 0L |
浮点型 | float | 4 | 3.402823e+38~1.401298e-45 | 0.0f |
浮点型 | double (默认) | 8 | 1.797693e+308~4.9000000e-324 | 0.0d |
字符型 | char | 2 | 0~65535 | \u0000 |
布尔型 | boolean | 1 | true/false | false |
-
引用数据类型
引用数据类型的数据存储在堆内存中,它分为三种:类、接口、数组
- 类引用:任何类的对象都是引用数据类型,Object类是所有类的超类(父类),
任何类的对象都可以通过Object创建:
Object i = new Integer(1);
*String也是类,属于类引用。 - 接口引用:如List、Map<K,V>;
- 数组引用:数组变量本身在栈内存中,其中存储着指向堆内存一连续的、数据类型相同的内存块的首地址,数组各元素的值就存储在堆内存的连续内存块中。其它引用也类似。
- 类引用:任何类的对象都是引用数据类型,Object类是所有类的超类(父类),
1.3数据类型转换
-
自动类型转换
数据范围小的变量,可以直接赋值给数据范围大的变量 转换原理:在小的变量的二进制形式前直接补零。 注意:各种类型的数据的默认类型,如两个Byte类型数据的运算结果会自动转为int类型。
-
强制类型转换
可以强行将数据类型范围更大的数据赋值给数据范围更小的变量中: double y = 33.0; int a = (int)y;//强制将double类型的y的值转为int类型赋值给a 强制转换原理:直接丢掉二进制形式数据的前几个字节,固有数据丢失风险。
2.运算符
- 分类
- 基本算数运算符
+、-、*、/、% - 自增自减运算符(在数值前面则先自增自减再运算,在数值后面则先拿原本的值运算再自增自减)
++、– - 赋值运算符
=、+=、*=、/=、%= - 关系运算符
‘>’、>=、<、<=、==、!= - 逻辑运算符
!、&、|、^、&&、|| - 三元运算符
关系表达式? 值1 :值2;//关系表达式为true取值1
- 基本算数运算符
*注意:&&和II被称作短路与和短路或,与&和|的区别是,只计算左边能判断结果的情况下不会再运算右边,固一般使用&&和||。
^
- 优先级
实际敲代码不用都记得,而且常用小括号控制以达到自己想要的优先级,但是考试笔试测试什么的经常给一堆奇奇怪怪就不用小括号的表达式问你结果是什么。
这里扒拉薅一个优先级图,总之就是先算优先级高的,注意&&优先级比||高哦。
(图片来源:http://www.pukuimin.top/post/353.html)
3.特例
上面简单说明了,这里给几个特例,都清楚就够用了。应该。
//特例1:
double y = 11/3;//y==3.0,这里是因为'/'运算符优先级比赋值运算符高,两个int先相除得3
//特例2:
byte a = 5;
byte b = 5;
byte c = a + b;/*报错,因为a+b运算后默认转为int类型了,不能直接再赋值给byte类型的c*/
//特例3
boolean z = 10<3 || 7>6 && 8>7;//z==false,先算逻辑运算符,然后&&,然后||,再赋值
int d = 10;
//特例4:
int s = d++ + ++d - --a - ++a + 1 + d--
// s = 10 + 12 - 4 - 5 + 1 + 12
//最后s值为26,a值为5,d值为11