Java数据类型

133 阅读7分钟

数据类型

强类型语言

强类型语言是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型了,强类型语言包括Java、.net 、Python、C++等语言。

弱类型语言

弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过显性强制转换。弱类型语言包括vb 、PHP、javascript等语言。

Java的数据类型分为两大类

基本数据类型(primitive type)

1、整型(byteshortintlong)

虽然byte、short、int、long 数据类型都是表示整数的,但是它们的取值范围可不一样。

//整数
byte num1 = 10;
short num2 = 100;
//最常用
int num3 = 1000;  
//long 类型需要在数据后加个l或L
long num4 = 10000L;

2、浮点型(floatdouble)

float 和 double 都是表示浮点型的数据类型,它们之间的区别在于精确度的不同。

//小数:浮点数
//float类型要在数字后面加个f或F
float num5 = 3.14F;
double num6 = 3.1415926;

3、字符型(char)

//字符,字符使用单引号
char name = 'A'

4、布尔型(boolean)

//布尔值:是true非false
boolean flag = true;
//boolean flag = false;

引用数据类型(reference type)

二、八种基本数据类型

数据类型说明占用字节默认值封装器类取值范围
byte字节型10Byte(-2^7) 到 (2^7-1)
short短整型20Short(-2^15) 到 (2^15-1)
int整型40Integer(-2^31) 到 (2^31-1)
long长整型80LLong(-2^63) 到 (2^63-1)
float单精度浮点型40.0fFloat(3.402823e+38)到(1.401298e-45)
double双精度浮点型80.0dDouble(1.797693e+308)到(4.9000000e-324)
char字符型2\u0000(空格)Character0~65535 (‘ /u0000’ ~’uFFFF‘)
boolean布尔型1 /8falseBooleantrue 、false

字节

  • 位(bit):是计算机内部数据存储的最小单位

  • 字节(byte):是计算机中数据处理的基本单位,习惯上用大写B来表示

  • 1B(byte,字节) = 8bit(位)

  • 字符:是指计算机中使用的字母、数字、字和符号

  • 1bit 表示1位

  • 1Byte表示一个字节 1B=8b

  • 1024B=1KB

  • 1024KB=1MB

  • 1024MB=1GB

进制的表示

日常生活中有很多进制的例子,例如:

  • 一分钟六十秒,逢六十进一,就是六十进制;
  • 一天二十四小时,逢二十四进一,就是二十四进制;
  • 一星期七天,逢七进一,就是七进制;
  • 一年十二个月,逢十二进一,就是十二进制;
  • 小学数学是逢十进一,就是十进制;
  • 而计算机中的数据只有 0 和 1,逢二进一,就是二进制。

人类为什么最习惯用十进制

人类为什么最习惯用逢十进一的十进制?对于世界上大部分的国家,即便之前因为交通不发达,他们彼此之间并不知道在世界的某一个角落还有另一个民族的存在,但是他们使用的都是十进制!这是为什么?

原因很简单,就是因为我们都有十个手指!进制的起源是用于记数的,人类刚开始都是用手指计数的。即使是现在的小朋友算数也还是喜欢用手指,所以人类最习惯用十进制。

计算机为什么用的是二进制

那么为什么计算机使用的是二进制呢?

因为二进制从硬件上比较容易实现。任何事物最少也有两种不同的状态,所以区分成两种状态比较容易。但是要将一个硬件硬生生地区分成十种不同的状态,这个就太难、太复杂了。

所以进制就是逢几进一,r 进制就是逢 r 进一。计算机只能识别二进制,人类最习惯使用的是十进制,而为了实际需要,又建立了八进制和十六进制。八进制就是逢八进一,十六进制就是逢十六进一。

二进制

二进制为逢二进一,它只有 0 和 1 两个基数。逢二进一的意思就是:

  • 1 再加 1 就变成 10,即向前进了一位,原来的 1 变成 0;
  • 再加 1 就是 11;
  • 再加 1 又逢二,再往前进一位,进一位后第二个 1 又逢二再进位,就是 100 了;
  • 再加 1 变成 101,再加 1 变成 110,再加 1 变成 111,再加 1 变成 1000……

二进制和十进制有一个对应的关系

十进制012345678
二进制0110111001011101111000

无论是十进制、二进制、八进制还是十六进制,都只是计数的一种方式,只不过它们用的是不同的进制,所以表现形式不一样,但本质上都是同一个数字。理解了上面内容,后面很多知识就很容易理解了。

八进制就是逢八进一,它只有 0、1、2、3、4、5、6、7 这八个基数。

十六进制肯定有十六个基数。它的基数除了十进制的 09 之外,还有字母 AF,总共加起来是十六个。注意,字母不区分大小写。十六进制是逢十六进一,F 是十五,加 1 就变成十六了,逢十六就进一,即 0x10。

下面是常用进制对照表,大家可以看一下。

十进制二进制八进制十六进制
0000
1111
21022
31133
410044
510155
611066
711177
81000108
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F

在Java代码中的表示

int i = 10; //十进制的数字10 逢十进一
int i2 = 010; //八进制的8 逢八进一
int i3 = 0x10; //十六进制的16 逢十六进一

浮点数扩展

float f = 0.1f; //0.1
double d = 1.0/10; //0.1

/*
== 是判断两个基本类型是否相等
按理来说:f和d两个值是相等的
但是,输入结果却是false,说明两个值不相等
*/
System.out.println(f == d);



float f1 = 213213213123312f;
float f2 = f1 + 1;
/*
按理来说:f1和f2两个值是不相等相等的
但是,输入结果却是true,说明两个值相等
*/
System.out.println(f1 == f2);

float 是有限的,也是离散的,接近但不等于

字符扩展

char c1 = 'a';
char c2 = '中';

//输出字符:a
System.out.println(c1);
/* 
(int)c1 表示数据强制转换,把字符类型转换为整型int
输出结果:97
*/
System.out.println((int)c1);

//输出字符:中
System.out.println(c2);
//输出结果:20013
System.out.println((int)c2);



char c3 = '\u0061';
//输出结果:a
System.out.println(c3);

所有的字符本质还是数字

编码Unicode表中会表示有数字和字符的对应关系

转移字符

转义字符意义ASCII码值(十进制)
\a响铃(BEL)007
\b退格(BS) ,将当前位置移到前一列008
\f换页(FF),将当前位置移到下页开头012
\n换行(LF) ,将当前位置移到下一行开头010
\r回车(CR) ,将当前位置移到本行开头013
\t水平制表(HT) (跳到下一个TAB位置)009
\v垂直制表(VT)011
\代表一个反斜线字符'''092
'代表一个单引号(撇号)字符039
"代表一个双引号字符034
?代表一个问号063
\0空字符(NUL)000
\ddd1到3位八进制数所代表的任意字符三位八进制
\xhh十六进制所代表的任意字符十六进制

注意:

1. 区分,斜杠:"/" 与 反斜杠:"" ,此处不可互换