1.数据类型

1.1什么是数据类型

百度百科:数据类型在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作。

1. 简单理解:  Java对数据进行了分类,存在不同的类型

2. 为什么需要数据分类:不同的数据类型占用的存储空间不一样,为了更好的利用计算机内存空间

在Java 的领域里,

1. 基本数据类型变量:  存的是数据值本身,

2. 引用数据类型变量:  存的是保存数据的内存空间地址。

学习数据类型基本认识:

1. Java中每个变量都有一种类型,类型限制了变量可以存放那些值的类型

示例:比如整数浮点数

2. 引用数据类型类(class ):一个类就是一个数据类型

计算机存储数据:存储在硬盘【磁盘】,硬盘中的方式都是用的二进制数据的方式进行存储

01010101010101010101010101010101

1.2基本数据类型(8种)

1.计算机中的存储单位

1024T

1T = 1024G

1G = 1024MB

1M = 1024KB

1KB=1024Byte

1Byte = 8 bit【1个bit就是一个二进制位】

2. 整型数据byte  short  int   long

1)为什么会有不同大小的类型,举个例子比如存5 这个数据怎么存的?

byte(8位,范围是-128到127)

short(16位)

int(32位)

long (64位)

2) 上面的byte short int long 最大长度可以通过jdk文档去找到 具体的范围。

3)如果值比long还大,怎么办?

Java提供了一个类:BigInteger:用于处理较大整数:目前知道就好不必深究

4) long赋值时,因为整数默认是int类型,要转换为long类型的值,后面加上l或L

5) 同一个整数可以使用不同的进制表示:(System.out.println(0b101)需jdk1.7才能按照十进制输出)

6) Java7 开始 支持数字之间用 _ 分割(12_34_56输出123456)

1. 浮点型float    double  其实就是小数

A.float(单精度32位)

直接给变量赋值时必须在浮点类型数据后面加上f 或F

[表示该数据是一个浮点类型数据]

B. double( 双精度64位)

单精度双精度区别:

1. 对于单精度浮点数,运行速度相比double更快,占内存更小,

2. 但是当数值非常大或者非常小的时候会变得不精确。

3.2.双精度比单精度表示的位数大精确的位数多,简单地说, float表示的小数点位数少。

默认浮点数的类型是double

表现形式:

常规3.14  3.14f

科学计数法

例如3.14e2  3.14*10^2     3.14e-2

注意:表的时候会有精度损失 [ 使用浮点数的时候需要注意 ]

例如double num= 1.0, 是一个无限接近1.0的一个值

示例Java代码:1.3*1.4

结论:浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。往往产生误差不是因为数的大小,而是因为数的精度。因此,产生的结果接近但不等于想要的结果。尤其在使用float 和 double 作精确运 算的时候要特别小心。

那怎么更精确的表示浮点数呢?

Java提供了一个类BigDecimal来表示更精准的浮点数:目前知道就好不必深究

1. 什么是字符:单引号引起来的一个符号就是字符数据例如:’A’

2. 存储单位16 位[0-65535]  [2个字节,16位]。字符常量使用单引号 ‘’包裹起来。

3. 表现形式:

1) ‘A’最常用,最直观的方式

2)  使用一个数字表示,对应有一个ASCII码表[ 字符编码 ]

例如:char c = 65;//表示‘A’ 这个字符

3)16进制表现形式

‘A’-》65(10进制)

'A'  -》0x41(16进制)怎么表示?

4) 特殊符号(需要使用转义符号转义)

\’   \”   \\   \r(回车)  \n(换行) \t(制表符Tab)

4. 字符数据可以当成一个整数来使用,

5.什么是asscii表,就像化学元素周

4)布尔类型boolean

值只有两个true false,不能使用 0 1表示

1.3引用类型

1.引用类型String

1)String是 java中已经设计好的一个类,表示的值是字符串,是字符串数据类型

[注意:Java中设计的类和我们自己设计的类的性质是一样的]

2) 常见形式:String s = “你好”;

3) 当String 和 + 一起使用的时候,这时候+ 是拼接字符串的功能

System.out.println(“你好”+2);//结果为    你好2

int a  = 5;
int b = 10
System.out.println(“a=”+a+”,b=”+b); //结果为a=5,b=10

2.一个类其实就是一种引用数据类型

1) 自己写的一个类也是一种数据类型,类型为类名

2) 误区:很多人一开始觉得Java中提供的类才是一种类型,而我们自己写觉得不是!

3) 我们自己写的类和Java已经写好的,性质一样:面向对象会详细讲解这块内容

2.数据转换

1. 基本数据和引用类型数据的区别

1.基本数据类型变量:  存的是值的本身

2.引用类型数据变量:  存的是对值的引用[ 地址值 ]

2.1自动转换

数据类型过长和溢出

byte b = 128;//超出byte范围
long intMax = int最大数(查jdk文档)
long  float  double只要两个操作数中有一个是上面类型的,另一个就会被转换成相应类型,并且结果也是该类型: 例如
int  num = 10;
double b = 10.01;
double  c = num + b;
System.out.println(c);

如果2个操作数(包括byte,short,char,int),都将会转换为int类型,并且结果也是int(自动向上转型)

short s = 10;
int num = 20;
int n = num + s;
System.out.println(n);
byte b=3;
b=(byte)(b*3);//必须声明byte。
System.out.println(b);

char类型向更高长度类型(例如整型)转换时,会转换为对应的ASCII码值,再做其他类型的自动转换

例如:

char  c = 'A';
int num = 10;
int a = c+num;
System.out.println(a);

需要注意的是:

1.char型具有两个字节,其数值范围是0 ~ 2^16-1,

2.short类型也具有两个字节,其值的范围是-2^15 ~ 2^15-1

这直接导致byte型不能自动类型提升到char,char和short直接也不会发生自动类型提升(因为值范围问题),同时,byte当然可以直接提升到short型。

所以,char 不能和byte short 相互自动转换

特例:只看类型不看值

示例1:

int a = 129;
byte b = (byte)a;//编译器只看容器不看值
System.out.println(b);//结果为-127

示例2:

byte  b  =  100;//可以自动转换
float   f = 1.3;//不能自动转换
int  a = 2147483647;
a = a+1;
System.out.println(a);  // 结果为  -2147483648

2.2强制转换

1.强制类型转换的语法

数据类型变量名= (数据类型)值;//值可能是更高的类型

2. 强制类型转换的注意事项

(1) 高转低会导致精度丢失,不同类型的强制转换,可能会导致精度的下降.

(2)实际开发中:应该要知道被强制转换的数据,是在一个已知的范围;

3.示例

比如说:double 转 float

示例一:

int i1=123;
int i2=456;
float f1 = (float) ((i1+i2)*1.2);//容量大的类型转换为容量小的类型时,要加上强制转换符

示例二:

short i=99;
char c=(char)i;
System.out.println(c);

示例三:

byte b1=1;
byte b2=2;
byte b3=(byte)(b1+b2); //byte,short,char在计算时首先转换为int,大容//量(int)转换为小容量的类型(byte)时要加强制转换

特例:

byte t = 127;//不报错
int a = 127;
//需要强制转换才不报错:编译器只看容器【只看类型】不看值
byte b = (byte)a;System.out.println(b); // 结果为 127