一维数组 ——Java

 目录

前言

一、一维数组的声明及初始化

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.一维数组的声明

数组的声明方式有两种:
    1.数据类型[] 变量名;
    2.数据类型 变量名[];

代码示例如下:声明一个数据类型为String的一维数组,数组名为 names1

//方式1:
String[] names1;

//方式2:
String names2[];

(建议使用方式1,因为它将数据类型与变量名清晰地分开,后面的代码举例都使用方式1)

以上的代码语句,只声明了String类型的数组变量names1,并没有初始化数组。

2.一维数组的初始化

声明数组并不是真正的数组,需要使用new操作符将创建数组。

数组的初始化分为静态初始化和动态初始化。

2.1静态初始化

一开始只知道数组的元素,由系统自动分配数组的长度

代码示例如下:

/*
静态初始化
*/

//方式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"};

2.2动态初始化

一开始就知道数组的长度,可以使用动态初始化。

代码示例如下:

//动态初始化:一个长度为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]);
}

二、访问数组元素

1.添加元素

数组的元素的下标范围: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

2.遍历数组

2.1 for循环

//遍历 -- for循环
for (int i = 0; i < names.length; i++) {
    System.out.println(names[i]);
}

2.2 foreach 循环(增强for循环)

//遍历 -- foreach
for (String string : names) {
	System.out.println(string);
}

2.3 for循环 和 foreach 的使用经验

遍历时需要操作下标的功能,就使用for循环

遍历时无需操作下标的功能,就使用foreach

通常来说,foreach更加简洁、更不易出错,无需担心数组下标的问题

三、一维数组的拷贝

在Java中允许将一个数组变量拷贝到另一个数组变量。

1.浅拷贝

//原数组:
String[] names = {"元素0","元素1","元素2","元素3","元素4"};
	
//复制新数组
String[] namesCopy = names;

这种拷贝将names的内存地址交给namesCopy引用,也就是说两个数组(names和namesCopy)引用同一个数组。

2.深拷贝

//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.扩容数组——方式1

思路:在原有拷贝的基础上,增大新数组的容量(长度)。

/*
    将原数组扩容为原来的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。

2.扩容数组——方式2

值得了解的是,扩容和拷贝可以使用Arrays工具类中的copyOf方法,代码如下:

//1.原数组 
String[] names = {"元素0","元素1","元素2","元素3","元素4"};
			
//使用Arrays类中的copyOf方法(可通过API查询使用方法)
names = Arrays.copyOf(names, 6);

五、一维数组的删除

1.删除数组中元素——方式1

思路:利用数组的拷贝

//原数组   
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;

2.删除数组中元素——方式2

思路:将 要删除的元素 之后的所有元素整体向前迁移(覆盖)该元素。

//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文档进行学习探索。

你可能感兴趣的:(Java基础,java)