编程基础与二进制
一、八大基本数据类型
- 整数类型: byte/short/int/long, 分别有不同的取值范围
- 小数类型:float/double ,分别有不同的取值范围和精度
- 字符类型:char,表示单个字符
- 真假类型(布尔类型):boolean,表示真假
1、基本的数据类型都有对应的数组类型
2、在java中除了基本数据类型以外,其他的都是对象类型
在计算机底层中,计算机是以01形式存储的,那么计算机是用什么来表示01的呢?他是用电容来表示01的,如图1-1-1所示,利用电容来存储电流,高电平为1,电平为0,存储体是无数个图1-1-1所示的电容器所组成,可组成如图1-1-2所示,一个字节由 8 个位构成。
所谓字节,原意就是用来表示一个完整的字符的。最初的计算机性能和存储容量都比较差,所以普遍采用4位BCD编码(这个编码出现比计算机还早,最早是用在打孔卡上的)。BCD编码表示数字还可以,但表示字母或符号就很不好用,需要用多个编码来表示。后来又演变出6位的BCD编码(BCDIC),以及至今仍在广泛使用的7位ASCII编码。不过最终决定字节大小的,是大名鼎鼎的System/360。当时IBM为System/360设计了一套8位EBCDIC编码,涵盖了数字、大小写字母和大部分常用符号,同时又兼容广泛用于打孔卡的6位BCDIC编码。System/360很成功,也奠定了字符存储单位采用8位长度的基础,这就是1字节=8位的由来。
二进制编码的十进制数,简称BCD码(Binarycoded Decimal)。这种方法是用4位二进制码的组合代表十进制数的0,1,2,3,4,5,6 ,7,8,9 十个数符。4位二进制数码有16种组合,原则上可任选其中的10种作为代码,分别代表十进制中的0,1,2,3,4,5,6,7,8,9 这十个数符。最常用的BCD码称为8421BCD码,8.4.2.1 分别是4位二进数的位取值。
(1)整数类型:byte (1字节)/short (2字节)/int (4字节)/long (8字节)
定义整数类型:
byte a=23;
short b=23232;
int c=1212;
int d=121;
在给long类型赋值时,如果常量超过了int的范围,需要在常量后面加大写或小写字母L,即L或l,例如: (之所以需要加L或l,因为数字类型默认是int类型)
long a=3232333433L;
(2)小数类型:float (4字节)/double (8字节)
在计算机中小数一般是以浮点数进行存储,与整数存储形式不一样,所以有可能在定义类型时产生精度丢失的情况。 (小数常量默认是double类型)
float a=3323;
float b=33.3;
double c=2323.2f;
double d=33333333333333L;
在整数和浮点数之间可以相互转换(如下图所示),但在转换的过程中,由于所占的内存空间不一样,容易造成精度丢失等问题。
(3)真假类型
真假(boolean)类型很简单,直接使用true或false赋值,分别表示真假,例如:
boolean b=true;
b=false;
(4)字符类型
字符类型char用于表示一个字符,这个字符可以是中文字符也可以是英文字符,char占用的内存空间是2字节,在赋值时要用单引号’'括起来,不要使用双引号,例如:
char a='柯';
char b='k';
对于数据类型,这博主有详细的解释,可能会更容易理解
为什么要有数据类型?又有哪些数据类型?
二、数组
数组一旦分配了内存空间了以后,数组的内存空间大小就不可变了,如果想要更大的内存空间就要另外重新分配一个新的更大的数组内存空间。
基本类型的数组有三种赋值形式,如下所示:
int[] arr={1,2,3};
int[] arr2=new int[]{1,2,3};
int[] arr3=new int[3];
第1种和第2种都是预先知道数组的内容,而第3种是先分配长度,然后再给每个元素赋值。第3种形式中,即使没有给每个元素赋值,每个元素也有一个默认值(数值类型的默认值为0,boolean类型的默认值为false,char字符的默认类型为空字符)
数组类型和基本类型是有明显不同的,一个基本类型变量,内存中只会有一块对应的内存空间。但数组有两块:一块用于存储数组内容本身,另一块用于存储内容的位置。用一个例子来说明,有一个int变量a,以及一个int数组变量arr,其代码、变量对应的内存地址和内存内容如下表1-3所示。
基本类型a的内存地址是1000,这个位置存储的就是它的值100。数组类型arr的内存地址是2000,这个位置存储的值是一个位置3000,3000开始的位置存储的才是实际的数据“1,2,3”。
为什么数组要用两块空间? 不能只用一块空间吗? 我们来看下面这段代码:
int[] arrA={1,2,3};
int[] arrB={1,2,3,4};
arrA=arrB;
这段代码中,arrA初始的长度是3,arrB的长度是4,后来将arrB的值赋给了arrA。如果arrA对应的内存空间是直接存储的数组内容,那么它将没有足够的空间去容纳arrB的所有元素。
用两块空间存储就简单得多,arrA存储的值就变成了和arrB的一样,存储的都是数组内容{4,5,6}的地址,此后访问arrA就和arrB是一样的了,而arrA和arrB的内存空间由于不再被引用会进行垃圾回收。如下图所示:
由上也可以看出,给数组变量赋值和给数组中元素赋值是两回事,给数组中元素赋值是改变数组内容,而给数组变量赋值则会让变量指向一个不同的位置。