1.1 数据类型
1.1.1 概述
数据类型决定了数据的存储方式和运算方式
Java中的数据类型分为两个大类:
- 基本数据类型
- 引用类型
1.1.2 两种类型的差别
-
内存中的存储位置不同:基本类型存储在栈中;引用类型存储在堆中(java中虽然没有指针,但是引用可以看成一个特殊的指针,类比C++中引用的概念)
-
赋值的时候有差别:基本类型在赋值时复制的是值;引用类型复制的是引用,例如:
double d2 = d; //复制值 Person p2 = p; //复制引用
从上图可以看到,d2复制了d的值;而p2复制了p的引用,二者指向了同一个对象。
1.2 数组
1.2.1 数组概述
数组是多个相同类型数组的组合
一般来说,一维数组的声明方式如下:
- int[] a;
- double[] b;
- MyData[] c;
1.2.2 数组初始化
在Java中,数组定义 与 为数组元素分配空间 分开进行
例如:
int[] a = new int[5];
这是由于Java中数组是引用类型。
Java中声明数组时不能指定其长度,这是其与C/C++语言的一大区别。
例如:
int a[5]; //非法
静态初始化:
在定义数组的同时为数组元素分配空间并赋值
例如:
int[] a = {3, 9, 8}; 或者 int[] a = new int[]{3, 9, 8};
MyData[] datas =
{new MyData(22, 7, 1964),
new MyData(1, 1, 2000),
new MyData(22, 12,1964),};
默认初始化:
数组是引用类型,数组一经分配空间,其中每个元素也被按照成员变量同样的方式被隐式初始化(数值类型被初始化为0,引用类型初始化为null)。
例如:
int[] a = new int[5] //a[3] = 0
1.2.3 数组元素的引用
数组元素的引用方式与C/C++差不多。
数组元素的下标从0开始;长度为n的数组合法下标取值范围:0~n-1
每个数组都有一个属性length指明它的长度,例如:
int[] ages = new int[10];
for(int i = 0; i < ages.length; i++){
System.out.println(ages[i]);
}
1.2.4 for-each语句
Java中有一种增强的for循环语句,可以用来依次处理数组(或者任何其他元素集合)中的每个元素,而不必考虑指定索引值,使用示例如下:
int[] ages = new int[10];
for(int age : ages){
System.out.println(age);
}
需要注意的,这种语句是只读式遍历。
解释以下,这里的只读式遍历有两种情况:
如果遍历的是基本数据类型的数组,那么不能改变数组的值;
如果遍历的是引用数据类型的数组,那么可以改变对象的属性,但不能删除或添加对象。
可以类比C/C++中的值传递与指针传递的情况,值传递的时候你在函数内部改变形参不会影响实参,指针传递的时候可以改变指针指向的实参,但不能改变指针的指向,因为函数传参的本质是复制出一个参数的副本,对于副本的修改不会影响原来的参数。
1.2.5 复制数组
在Java中,允许将一个数组变量拷贝到另一个数组变量,这时,两个变量将引用同一个数组:
int[] ages = {12, 13, 14};
int[] ages2 = ages; //ages2和ages引用同一个数组
下图是拷贝的结果:
如果你希望将一个数组的所有值拷贝到一个新的数组中,就需要使用Arrays类中的copyOf方法:
int[] ages2 = Arrays.copyOf(ages, ages.length);
Arrays.copyOf的第二个参数是新数组的长度,这个方法可以用于增加数组的大小:
int[] ages2 = Arrays.copyOf(ages, 2 * ages.length);
新增的元素按照默认初始化。
注意区分=拷贝和Arrays.copyOf()拷贝的区别
1.2.6 多维数组
多维数组这里以二维数组为例,Java中的二维数组是数组的数组,我们可以采用如下的方式进行声明和初始化:
//第一种方式
int[][] t = new int[3][3];
//第二种方式
int[][] t = new int[3][];
t[0] = new int[2];
t[1] = new int[4];
t[2] = new int[3]; //java中的二维数组是数组的数组,其中数组的长度不必相同,这里与c++不同
//第三种方式
int[][] t =
{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
注意体会java中的多维数组与C/C++的区别,java中多维数组的声明和初始化应该按照从高维到低维的顺序进行,例如以下声明和定义就是非法的:
int[][] t1 = new int[][4] //非法,与C++不同