目录
前言
一、一维数组的声明及初始化
1.一维数组的声明
2.一维数组的初始化
2.1静态初始化
2.2动态初始化
二、访问数组元素
1.添加元素
2.遍历数组
2.1 for循环
2.2 foreach 循环(增强for循环)
2.3 for循环 和 foreach 的使用经验
三、一维数组的拷贝
1.浅拷贝
2.深拷贝
四、一维数组的扩容
1.扩容数组——方式1
2.扩容数组——方式2
五、一维数组的删除
1.删除数组中元素——方式1
2.删除数组中元素——方式2
总结
数组是一种数据结构,是存放一组相同数据类型的数据的容器,可以通过操作数组对数据进行增删改查。数组是引用数据类型,初始化后开辟的空间在内存中是连续的,并且数组一旦初始化后,长度是不可改变的(数组不可直接扩容或者删除),不过可以改变数组中的元素。元素是存入数组的数据,元素在数组中的下标从0开始。
提示:以下是本篇文章正文内容,下面案例可供参考
数组的声明方式有两种:
1.数据类型[] 变量名;
2.数据类型 变量名[];
代码示例如下:声明一个数据类型为String的一维数组,数组名为 names1
//方式1:
String[] names1;
//方式2:
String names2[];
(建议使用方式1,因为它将数据类型与变量名清晰地分开,后面的代码举例都使用方式1)
以上的代码语句,只声明了String类型的数组变量names1,并没有初始化数组。
声明数组并不是真正的数组,需要使用new操作符将创建数组。
数组的初始化分为静态初始化和动态初始化。
一开始只知道数组的元素,由系统自动分配数组的长度
代码示例如下:
/*
静态初始化
*/
//方式1:
String[] names1 = new String[] {"元素0","元素1","元素2","元素3","元素4"};
//方式2: 先声明,再初始化
String[] names2;
names = new String[] {"元素0","元素1","元素2","元素3","元素4"};
//方式3:(写法简洁)
String[] names3 = {"元素0","元素1","元素2","元素3","元素4"};
一开始就知道数组的长度,可以使用动态初始化。
代码示例如下:
//动态初始化:一个长度为5的String类型的数组,可以存放5个字符串
String[] names = new String[5];
动态初始化系统会为这个新创建的数组赋予默认值:
整数类型:0
浮点类型:0.0
字符类型:" "(空格)
引用数据类型:null
boolean:false
//可使用for循环遍历数组验证系统赋予默认值
for (int i = 0; i < 5; i++) {
System.out.println(names[i]);
}
数组的元素的下标范围:0~数组长度-1
不符合数组下标范围的操作会产生数组下标越界异常——ArrayIndexOutOfBoundsException。
代码示例如下:
//动态初始化:
String[] names = new String[5];
//计算数组的长度
int length = names.length;
System.out.println("数组长度:" + length);//数组长度:5
//通过下标设置元素
names[0] = "元素1";
names[1] = "元素2";
names[2] = "元素3";
names[3] = "元素4";
names[4] = "元素5";
//通过下标获取元素
String n = names[1];
System.out.println(n);//元素2
//遍历 -- for循环
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
//遍历 -- foreach
for (String string : names) {
System.out.println(string);
}
遍历时需要操作下标的功能,就使用for循环
遍历时无需操作下标的功能,就使用foreach
通常来说,foreach更加简洁、更不易出错,无需担心数组下标的问题
在Java中允许将一个数组变量拷贝到另一个数组变量。
//原数组:
String[] names = {"元素0","元素1","元素2","元素3","元素4"};
//复制新数组
String[] namesCopy = names;
这种拷贝将names的内存地址交给namesCopy引用,也就是说两个数组(names和namesCopy)引用同一个数组。
//1.原数组:静态初始化
String[] names = {"元素0","元素1","元素2","元素3","元素4"};
//2.新数组:动态初始化
String[] namesCopy = new String[names.length];
//3.将原数组中数据内容逐个放置到新数组中
for (int i = 0; i < namesCopy.length; i++) {
namesCopy[i] = names[i];
}
这种拷贝创建初始化了一个新的数组namesCopy,两个数组变量引用两个内存地址不同的数组。
思路:在原有拷贝的基础上,增大新数组的容量(长度)。
/*
将原数组扩容为原来的1.5倍
*/
//1.原数组
String[] names = {"元素0","元素1","元素2","元素3","元素4"};
//2.定义新数组容量(原数组的1.5倍)
int oldCapacity = names.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
//3.动态初始化新数组
String[] namesCopy = new String[newCapacity];
//4.复制原数组中数据到新数组
for (int i = 0; i < names.length; i++) {
namesCopy[i] = names[i];
}
//5.将新数组引用赋给原数组
names = namesCopy;
扩容后多余的数组容量中存放的是该数组类型的系统默认值,例如String类型系统默认值为null。
值得了解的是,扩容和拷贝可以使用Arrays工具类中的copyOf方法,代码如下:
//1.原数组
String[] names = {"元素0","元素1","元素2","元素3","元素4"};
//使用Arrays类中的copyOf方法(可通过API查询使用方法)
names = Arrays.copyOf(names, 6);
思路:利用数组的拷贝
//原数组
String[] names = {"元素0","元素1","元素2","元素3","元素4"};
//动态初始化新数组
String[] newNames = new String[names.length-1];
//遍历数组,将原数组复制到新数组中
int index = 0;
for (String element : names) {
if(!element.equals("元素2")) {
newNames[index] = element;
index++;
}
}
//将新数组的引用赋给原数组
names = newNames;
思路:将 要删除的元素 之后的所有元素整体向前迁移(覆盖)该元素。
//1.原数组
String[] names = {"元素0","元素1","元素2","元素3","元素4"};
//2.数据向前迁移一个(覆盖)
for (int i = 2; i < names.length-1; i++) {
names[i] = names[i+1];
}
//3.将最后一个元素设置为null
names[names.length-1] = null;
以上就是今天要讲的内容,本文仅仅简单介绍了一维数组,更多操作数组的方法可以通过查询API文档进行学习探索。