数组
基本概念
数组是数据的集合。若想定义n个int类型变量,传统的方法会是这样:
int a1 , a2 , a3 , ... , an;
这样也能打到定义多个变量的目的,但是这多个变量是相互独立的个体,本身并没有所谓关联性,当变量的数量足够多时,就会出现不便于管理的情况。这时就会利用到数组,数组本身也属于引用数据类型,定义语法如下:
数据类型 数组名称[] = new 数据类型[长度];
数据类型 [] 数组名称 = new 数据类型[长度];
创建数组后如何对数组的内容进行访问呢?
对数组内容的访问可以以“数组名称[索引/下标]”的方式进行访问,所有的下标均以0开始,若有一个长度为4的数组int An[] = new int[4],那么它的第一个元素就是An[0],第四个则是An[3]。首次定义数组时,其数据值均为对应数据类型的默认值,如int类型就是0。
接下来提供一个例子用于演示在java中对数组的定义与访问:
public class Test {
public static void main(String args[])
{
int An[] = new int[3];
An[0] = 0;
An[1] = 1;
An[2] = 2;
for (int i = 0;i<3;i++)
{
System.out.println(An[i]);
}
}
}
结果如下:
0
1
2
进程已结束,退出代码0
数组定义时还提供了静态初始化的操作,让数组定义时就设置好了相应的内容,例如上文的:
...
An[0] = 0;
An[1] = 1;
An[2] = 2;
...
就可以在定义时改成:
int An[] = {0,1,2};
//或者是
int An[] = new int[] {0,1,2};
当数组较多且长度不相同时该怎么办,总不能专门开个表格来记录对应数组的长度吧?根本没必要,Java提供了代表数组长度的属性length,使用这个属性的方法很简单,只需要写数组名称.length
即可。它的含义就是对应数组的长度,上文中的循环条件也可以改成:
public class Test {
public static void main(String args[])
{
...
for (int i = 0;i<An.length;i++)
{
System.out.println(An[i]);
}
}
}
效果是一样的,篇幅有限,就不做结果的演示了
顺带一提,当你访问时所用的下标超过了数组的长度,就会出现数组越界异常(Array Index Out Of Bounds Exception),所以可以用.length
对引用时的索引进行限制,防止出现异常。
数组的引用传递
数组本身属于引用数据类型,在对其进行操作的过程中依然可以进行内存的引用传递:
public class Test {
public static void main(String args[])
{
int An[] = new int[3];
int NTR[] = An;
An[0] = 0;
An[1] = 1;
An[2] = 2;
NTR[0] = 1;
for (int i = 0;i<An.length;i++)
{
System.out.println(An[i]);
}
}
}
运行结果:
1
1
2
进程已结束,退出代码0
可以看到,虽然我们没有对An[0]进行后续的修改,却通过先使NTR[]指向An[]对应的堆内存,然后在对NTR[0]进行修改,从而达到修改对应内存中第一个元素的目的
二维数组
当需要管理更为复杂的数据时,二维数组就可以派上用场了。
一维数组是一个索引对应一个数据,如前文的NTR[]就可以这样理解
索引 | 0 | 1 | 2 |
---|---|---|---|
数据 | 1 | 1 | 2 |
二维数组则是两个索引对应一个数据
索引 | 0 | 1 | 2 |
---|---|---|---|
0 | a[0][0] | a[1][0] | a[2][0] |
1 | a[0][1] | a[1][1] | a[2][1] |
2 | a[0][2] | a[1][2] | a[2][2] |
也可以简单理解成是“一维数组”的数组。
二维数组的定义有以下两种方法,跟之前的一维数组定义方法非常相似:
- 动态初始化:
数据类型 数组名称[][] = new 数据类型 [行][列]
- 静态初始化:
数据类型 数组名称[][] = new 数据类型 [][]{{多个值},{多个值},...}
二维数组元素的访问与一维数组一致,这里不做过多赘述。
String 类
String 类的基本概念
String是字符串的描述类型,在实际开发中用途非常广泛。String本身不是引用数据类型,但依旧可以对其进行直接赋值。
String 类的两种实例化方式
- 直接赋值:
String 变量名 = "字符串"
- 构造方法赋值:
String 名称 = new String("字符串")
字符串比较
在比较int类型数据时,我们通常会用表达式a == b
来判断两个数据是否相等
但在比较字符串时,如果使用==
来判断,会遇到一些问题,看下面的例子:
public class Test {
public static void main(String args[])
{
String str1 = "str";
String str2 = new String("str");
String str3 = str2;
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str2 == str3);
}
}
运行结果:
false
false
true
进程已结束,退出代码0
明明内容完全一致,但用==
对比之后的结果却是大相径庭,这是怎么回事呢?原因在于==
对比判断的是对应对象的地址值,而不是内容。如果想比较字符串的内容则需要String类下的equals方法。
equals方法的用法为:如有两个String类的对象str1、str2,则str1.equals(str2)
可以将str1、str2进行内容的比较