数组的特点
1.定长。 容量固定。 数组创建之后,长度不能改变
2.存储的数据类型必须一致
3.在空间中连续
4.数组是引用数据类型,存在堆栈的地址引用关系
数组的语法
创建数组的语法:
数组类型【】 数组名 = new 数组类型【】;
数组类型 数组名【】 = new 数组类型【】;
使用的语法:
数组名【index】,操作数组
index,因为一个数组存储了多个数组(也叫元素),每个元素都有一个下标,也叫索引index。
数组的下标不能超过这个范围。否则会下标越界:java.lang.ArrayIndexOutOfBoundsException
内存分析
内存:存储数据
栈:存储的是基本数据数据类型的变量,以及引用数据类型的引用。
特点: 函数中所占用的空间,执行后就会立刻销毁。
堆:存放的是new出来的东西
特点:执行之后,堆里面存储的内容(对象等),会被标记为垃圾,但是不会立即被销毁,而是等待系统的垃圾回收机制来自动回收(Gc)
jvm GC (Grabage collection)
数组的遍历
for each 循环 增强for循环
在jdk1.5之后的版本出现的
特定的用法:用于获取集合/数组中的元素
for(数据类型 变量名 :数组名)
{
System.out.println(变量名);
}
工作原理:定义了一个变量 然后依次赋值给变量
注意点:for each 只能获取数组的数据 不能给数组进行赋值
for each在代码的层面 不能操作下标
数组的默认值
在没有给数组赋值的时候,依旧可以访问
整数:0
小数:0.0
字符:\u0000
布尔:false
其他:null
创建数组的其他语法
/*
动态创建数组:先创建数组,然后再根据下标一个一个存储数据。
A:先声明,再创建(分配内存空间)
数据类型 [] 数组名;
数组名 = new 数据类型[长度];
B:声明并创建
数据类型 [] 数组名 = new 数据类型[长度];
数据类型 数组名[] = new 数据类型[长度];
//静态创建数组:声明,创建,赋值一起写完。
C:声明,创建,并赋值
数据类型[] 数组名 = {数值1,数值2,数值3,数值4.。。。};
//=左边声明数组,=右边,会先根据{}中数据的个数,然后再将{}中数据,按照顺序存储进去。
完成了几件事:
1.先声明:int[] c
2.根据{}中数组值的个数,开辟堆内存
3.将{}中的数组值,依次按照顺序存入数组中
D:声明,创建,并赋值
数据类型[] 数组名 = new 数据类型[]{数值1,数值2,数值3,数值4.。。。}
*/
数组的地址转移
Java中的数据分为两大类:
基本数据类型是在栈中操作的,传递的是值本身
引用数据类型是在在中存放引用地址,指向堆中的一个连续的空间
数组赋值是将引用地址赋值给其他变量,然后指向堆中的一个连续的空间
示例代码:
class Test4ArrayAddress
{
public static void main(String[] args)
{
/*
数组:引用类型的数据
数组名,存储是引用地址。
*/
int[] a = new int[3];
System.out.println(a.length);//3
System.out.println(a);//a数组的地址
System.out.println(a[0]);//0
a[0] = 1;
a[1] = 2;
a[2] = 3;
int[] b = {4,5,6,7};
System.out.println(b.length);//4
System.out.println(b);//b的地址
System.out.println(b[0]);//4
int[] c = a;//将a的值赋值给c,就是将a存储的数组的地址赋值给c
//a和c存储的地址相同,那么就指向了同一个数组
System.out.println(c.length);//3
System.out.println(c);//a的地址
System.out.println(c[0]);//1
c[0] = 100;
System.out.println(a[0]);
System.out.println(b[0]);
System.out.println(c[0]);
b = c;
b[1] = 200;
System.out.println(a[1]);//200
System.out.println(b[1]);//200
System.out.println(c[1]);//200
System.out.println("Hello World!");
}
}
数组作为参数
数组是引用类型,传递的是地址,就是数组作为参数也会指向这块内存。当方法结束后,数组作为参数也就销毁了。
可变参数
一个参数可以接受 1- n 个类型固定的参数,相当于一个数组
语法:数据类型 。。。 参数名,可变参数在方法中当数组使用
注意点:
1.如果参数列表中除了可变参数还有其他参数,那么可变参数需要放在参数列表的最后
2.一个方法最多只有一个可变参数
数组的排序
1.冒泡排序
for(int i = 0; i < arr.length -1; i++)
{
for(int j = 0; j< arr.length - 1 -i; j++){
if(arr[i] > arr[i+1])
{
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
2.选择排序
选择排序是用固定值依次和后面的值进行比较
第一次比较
int i = 0;
for(int j = 1;j < arr.length;j++)
{
if(arr[i] > arr[j])
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
每次比较规定值的下标后移一个
最终
package com.qf.array.homework;
public class HomeWork1 {
/*
* 选择排序
*/
public static void main(String[] args) {
int[] arr = {3,5,2,1,4};
for(int i = 0; i < arr.length -1; i++)
{
for(int j = i+1; j < arr.length; j++)
{
if(arr[i] > arr[j])
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
for(int e:arr)
{
System.out.print(e+" ");
}
}
}
3.jdk排序
Arrays.sort(数组名)返回值为空 参数为数组名
数组的复制
1.定义一个长度大于或者等于原数组的新数组,然后循环遍历赋值进去
2.使用java.util.Arrays.copyof(原数组,新数组长度)方法 ,返回一个新的数组
3.定义一个新的数组,长度等于或者大于原数组
然后使用System.arraycopy(原数组,起始长度,新数组,起始长度,截取数据的长度)
二维数组
二维数组就是一维数组中存储一维数组的地址
定义方法
1.int arr[][] = new int[3][3];
2.int arr[][] = new int[3][];
3int arr[] = {{}{}{}};
遍历
for(int i = 0; i < arr.length; i++)
{
for(int j = 0; j < arr[i].length; j++)
{
System.out.println(arr[i][j]);
}
}