第二章 数据类型
文章目录
2.1 关键字和标识符
2.1.1 关键字
关键字:被JAVA语言赋予特定含义的单词。
Ps:关键字全部是小写的。
2.1.2 标识符
标识符:给类、变量和方法起名字的符号
标识符的定义规则:
- 由数字、字母、下划线和美元符号($)组成
- 不能以数字开头
- 不能是关键字
- 区分大小写
2.2 基本数据类型
Java语言是强类型语言,对于每一种数据都给出了明确的数据类型,不同的数据类型也分配了不同的内存空间,所以它们表示的数据大小也是不一样的。
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
整型 | byte | 1 | -128~127 |
short | 2 | -32768~32767 | |
int | 4 | -2的31次方到2的31次方-1 | |
long | 8 | -2的63次方到2的63次方-1 | |
浮点数 | float | 4 | 负数:-3.402823E+38到-1.401298E-45 正数:1.401298E-45到3.402823E+38 |
double | 8 | 负数:-1.797693E+308到-4.9000000E-324 正数:4.9000000E-324到1.797693E+308 | |
字符 | char | 2 | 0~65535 |
布尔 | boolean | 1 | true,false |
2.3 常量和变量
2.3.1 常量
常量:在程序运行过程中,其值不可以发生改变的量。
常量类型 | 说明 | 举例 |
---|---|---|
字符串常量 | 用双引号括起来的内容 | “Hello World” |
整数常量 | 不带小数的数字 | 11,-22 |
小数常量 | 带小数的数字 | 5.20,13.14 |
字符常量 | 用单引号括起来的内容 | ‘0’,‘a’,‘我’ |
布尔常量 | 布尔值(表示真假值) | 只有两个值:true,false |
空常量 | 一个特殊的值,空值 | 值是:null |
Ps:空常量null不能直接输出。
2.3.2 变量
变量:在程序运行过程中,其值可以发生改变的量。
变量的定义:数据类型 变量名=变量值;
Ps:
① 变量名不能重复
② 在main数中的变量不赋值不能直接使用。在Class中的成员变量会自动初始化,在方法体中的局部变量不会初始化不能直接使用。(在编程的时候还是要养成好的习惯,明确为变量设置初始值,防止程序出现意外的错误)
③ long类型的变量定义的时候,为了防止整数过大,后面应加L。(当一个整数赋值给某个整数类型的变量,这个整数默认为int类型)
④ float类型的变量定义的时候,为了防止类型不兼容,后面应加F。(当一个小数赋值给某个浮点型类型的变量,这个小数默认为double类型)
2.4 常见的命名约定
2.4.1 小驼峰命名法
约定1:标识符是一个单词的时候,首字符是小写。
范例1:name
约定2:标识符由多个单词组成时,首字符小写后面单词首字母大写。
范例2:firstName
应用场景:变量名、方法名
2.4.2 大驼峰命名法
约定1:标识符是一个单词的时候,首字符是大写。
范例1:People
约定2:标识符由多个单词组成时,首字符小写后面单词首字母大写。
范例2:GoodPeople
应用场景:类名
2.5 类型转换
2.5.1 自动类型转换
把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量,类型会自动转换。
范例:double num=10.5F;
2.5.2 强制类型转换
把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量,类型要强制转换。
范例:float num=(float)10.5;
2.6 从命令行输入与输出数据
2.6.1 输入基本型数据
Scanner使用的基本步骤:
①导包
import java.util.Scanner;
导包的动作必须出现在类定义的上边
②创建对象
Scanner reader=new Scanner(System.in);
上面这个格式里面,只有reader是变量名,可以变,其他的都不允许变
③接收数据
int i=reader.nextInt();
reader对象调用方法nextBoolean( )、nextByte( )、nextShort( )、nextInt( )、nextLong( )、nextFloat( )、nextDouble( )读取用户在命令行(例如,DOS窗口)输入的各种基本类型数据。
2.6.2 输出基本型数据
System.out.println()或System.out.print( )可输出串值、表达式的值,二者的区别是前者输出数据后换行,后者不换行。在Java中,允许使用并置符号"+“将变量、表达式或者常数值与一个字符串并置在一起输出,例如:
System.out.println(m+“个数的和为”+sum);
Ps:当输出字符串常量时,不可以出现"回车”。例如下面无法通过编译:
System.out.println(“你好,
很高兴认识你”);
应改为正确写法:
System.out.println(“你好,+
很高兴认识你”);
2.7 数组
数组是相同类型的变量按顺序组成的一种复合数据类型,这些相同类型的变量称为数组的元素或者单元。数组通过数组名加索引来使用数组的元素,索引从0开始。
2.7.1 声明数组
声明一维数组由以下两种格式:
数组的元素类型 数组名字[ ];
数组的元素类型[ ] 数组名字;
声明二维数组由以下两种格式:
数组的元素类型 数组名字[ ][ ];
数组的元素类型[ ] [ ]数组名字;
例如:
float boy[ ];
char cat[ ][ ];
Ps:①数组的元素类型可以是Java中的任何一种类型,包括类。
②与C/C++不同,Java不允许在声明数组中的方括号内指定数组元素的个数。若声明:int a[12];将导致语法错误。
2.7.2 创建数组
声明数组仅仅是给出了数组名字和元素的数据类型,要想真正使用数组还必须为它分配内存空间,即创建数组。
为一维数组分配内存空间的格式如下:
数组名字 = new 数组元素的类型[ 数组元素的个数 ];
例如:boy=new floa[4];
申明数组可以和创建数组一起完成,例如:
float boy[ ]=new float[4];
为二维数组分配内存空间的格式如下:
int two[ ][ ]=new int[3][4];
Ps:①构成二位数组的一位数组不必有相同的长度,在创建二维数组时可以分别指定构成二维数组的一维数组的长度,例如:
int a[ ][ ]=new int[3][ ];这个二维数组还没分配内存空间所以不能使用,必须创建它的一维数组。
②和C语言不同的是,Java允许使用int型变量的值指定数字元素的个数。例如:
int size=30; double num[ ]=new double[size];
2.7.3 数组的初始化
①创建数组后,系统会给每个未初始化的数组元素一个默认的值。
- 整数:默认值0
- 浮点数:默认值0.0
- 布尔值:默认值false
- 字符:默认值是空字符
- 引用数据类型:默认值是null
②创建数组时,也可以手动给数组元素初始化,初始化时指定每个数组元素的初始值,由系统决定数组长度。
- 格式:数据类型[ ] 变量名=new 数据类型[ ]{数据1,数据2,数据3,…};
- 范例: int[ ] arr =new 数据类型[ ]{1,2,3};
- 简化格式: 数据类型[ ] 变量名 ={数据1,数据2,数据3,…};
- 范例: int[ ] arr ={1,2,3};
2.7.4 数组中的内存分配
- 栈内存:存储函数参数、局部变量、临时变量等等。定义在方法中的变量,使用完毕,会立即消失。
- 堆内存:存储new出来的内容(实体,对象)。每一个new出来的东西都有一个地址值。使用完毕,会在垃圾回收器空闲时被回收。
创建数组的步骤:
第一步:声明数组,为数组创建一个引用,即在栈中开辟一个地址空间。
第二步:创建数组,即在堆中开辟一系统连续的地址,具体的大小根据类型还有数组长度。
(数组的引用保存在栈中,同时实例的时候在堆中开辟连续空间,栈中的空间指向堆的首地址)
2.7.5 数组操作的两个常见小问题
- 索引越界:访问了数组找那个不存在的索引对应的元素,造成索引越界问题。
- 空指针异常:访问的数组已经不再指向堆内存的数据,造成空指针异常。
(null:空值,引用数据类型的默认值,表示不指向任何有效对象)
2.7.6 length的使用
数组的元素个数称为数组的长度。对于一维数组,"数组名字.length"的值就是数组元素的个数;对于二维数组,"数组名字.length"的值是它含有的一维数组的个数。
2.7.7 复制数组
如果两个类型相同的数组具有相同的引用,那么他们就有完全相同的内存单元,即数组 b=数组 a。
有时想把一个数组中的元素的值复制到另一个数组的元素中,后者元素值的改变不会影响到原数组元素的值,反之亦如此。如果实现这样的目的,显然不能用赋值的方法。在这里介绍Java提供的更简练的数组之间的快速复制,即让System类调用以下方法。
1.arraycopy方法
public static void arraycopy(sourceArray,int index1,copyArray,int index2,int length);
- sourceArray:原数组的引用
- index1:原数组的索引值
- copyArray:被复制数组的引用
- index2:被复制数组的索引值
- length:要复制的数组元素长度
将数组sourceArray从索引 index1开始的length个元素中的数据复制到数组copyArray中的index2位置。
Ps:①arraycopy方法必须实现创建参数copyArray指定的数组。
②如果数组copyArray不能存放下复制的数据,程序的运行将发生异常。
2.arrayOf 和 arrayOfRange方法
arrayOf 方法:public static double[ ] copyOf(double[ ] original,int newlength);
将参数original指定的数组中从索引0开始的newLength个元素复制到一个新的数组中,并返回这个新数组,并且数组的长度为newLength。
Ps:①改变数组的类型,把double换成float、int或char。
②如果newlength的值大于大于original的长度,则copyOf方法返回的新数组的第newLength索引后的元素取默认值。
arrayOfRange方法:public static double[ ] copyOfRange(double[ ] original,int from,int to);
将original指定的数组中从索引from至to-1的元素复制到一个新数组中,并返回这个新数组,即新数组的长度为to-from。
Ps:①可改变数组的类型,把double换成float、int或char。
②如果to的值大于original的长度,则copyOfRange方法返回的新数组的第original.length-from索引开始的元素取默认值。
2.7.8 排序与使用二分法查找
可以使用循环实现对数组的排序,也可以使用循环查找一个数据是否在一个排序的数组中。这里省略了数组的排序算法,用Arrays类调用方法实现对数组的快速排序。使用数组的类方法前,需要导入所在的包。
1.Array类调用方法:
public static void sort(double a[ ]);
可以把参数a指定的double类型数组按升序排序
2.Array类调用方法:
public static void sort(double a[ ],int start,int end);
可以把参数a指定的double类型数组中索引start至end-1的元素的值按升序排序
3.Array类调用方法(二分法):
public static int binarySearch(double a[ ],double number);
如果number与数组中某个元素值相同,那么binarySearch方法返回该元素的索引,否则返回一个负数。
Ps:binarySearch方法中的数组a必须事先排序好。
PS:如有错误,欢迎评论区指出。