一、数组的定义
数组(Array):多个相同类型的数据按照一定的顺序排列的集合。(数据容器)
1、数组的基本特性:
①、数组是引用数据类型,元素可以是任何数据类型,每个数据元素存放一个数据,可通过索引访问数据元素、赋值取出等。下标从0开始。
②、创建数组时会在内存开辟一整块连续的空间,而数组的引用则是这块连续空间的首地址。所以一旦初始化完成,数组在内存所占用的空间就被固定,所以数组长度不可变。
2、数组的声明与初始化
①、声明
元素的数据类型[] 数组的名称;
int[] age;
②、初始化
(1)、静态初始化:定义数组的同时分配内存并赋值,只给顶元素值,不指定数组长度
数据类型[] 数组名 = {元素1,元素2,元素3...};
int[] array={1,2,3...}
(2)、动态初始化:只指定数组长度,由系统分配元素初始值(默认值)
数据类型 [ ] 数组名称 = new 数据类型 [数组长度]
int[] array=new int[10];
(3)、错误写法:
//未指定数组长度
int [] arr1=new int[];
//数组前面[]不能写长度
int [5] arr2=new int[5];
//静态初始化不能写长度
int [] arr3=new int[3]{1,2,3};
3、数组元素访问与遍历
①、访问数组元素并赋值
//声明一个长度为3的数组
int[] arr=new int[3];
//给arr第1个元素赋值1
arr[0]=1;
//给arr第2个元素赋值2
arr[1]=2;
//给arr第3个元素赋值3
arr[2]=3;
长度(length)为3的数组,下标为arr[0]、arr[1]、arr[2]
②、数组的遍历
数组的长度:数组名.length
数组的索引范围:[0,length-1]
//声明一个元素为1,2,3的int型数组
int[] arr=new int[]{1,2,3};
//遍历arr数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
// 使用增强for循环foreach进行遍历
for (int i : arr) {
System.out.println(i);
}
//使用Arrays.toSting(数组名)进行遍历
System.out.println(Arrays.toString(arr));
4、数组的内存图分析
public static void main(String[] args) {
int[] arr = new int[3];
int[] arr2 = new int[2];
System.out.println(arr);
System.out.println(arr2);
}
5、数组的使用
①、冒泡排序
public class ArrayTest {
public static void main(String[] args) {
int[] arr=new int[]{56,12,32,98,78,45,-45,3,55,-16};
for (int i = 0; i < arr.length; i++) {
for (int j=0;j<arr.length-1-i;j++){
if (arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t");
}
}
}
②、查找
public class ArrayTest {
public static void main(String[] args) {
String[] str=new String[]{"AA","BB","CC","DD","EE","FF","GG"};
String dest="BB";
boolean isFlag=true;
for (int i = 0; i < str.length; i++) {
if (dest.equals(str[i])){
System.out.println("找到了元素,位置在"+(i+1));
isFlag=false;
break;
}
}
if (isFlag) {
System.out.println("对不起,没有找到");
}
}
}
③、数组反转
public class ArrayTest {
public static void main(String[] args) {
String[] str=new String[]{"AA","BB","CC","DD","EE","FF","GG"};
System.out.println("反转前:");
for (int i = 0; i < str.length; i++) {
System.out.print(str[i]+"\t");
}
for(int i=0;i<str.length/2;i++){
String temp=str[i];
str[i]=str[str.length-i-1];
str[str.length-i-1]=temp;
}
System.out.println();
System.out.println("反转后:");
for (int i = 0; i < str.length; i++) {
System.out.print(str[i]+"\t");
}
}
}
6、数组的工具类
java.util.Arrays工具类
- static int binarySearch(int[] a, int key) :要求数组有序,在数组中查找key是否存在,如果存在返回第一次找到的下标,不存在返回负数
- static int[] copyOf(int[] original, int newLength) :根据original原数组复制一个长度为newLength的新数组,并返回新数组
- static int[] copyOfRange(int[] original, int from, int to) :复制original原数组的[from,to)构成新数组,并返回新数组
- static boolean equals(int[] a, int[] a2) :比较两个数组的长度、元素是否完全相同
- static void fill(int[] a, int val) :用val填充整个a数组
- static void fill(int[] a, int fromIndex, int toIndex, int val):将a数组[fromIndex,toIndex)部分填充为val
- static void sort(int[] a) :将a数组按照从小到大进行排序
- static void sort(int[] a, int fromIndex, int toIndex) :将a数组的[fromIndex, toIndex)部分按照升序排列
- static String toString(int[] a) :把a数组的元素,拼接为一个字符串,形式为:[元素1,元素2,元素3。。。]
import java.util.Arrays;
import java.util.Random;
public class Test {
public static void main(String[] args) {
int[] arr = new int[5];
//1、打印数组,输出地址值
System.out.println(arr); // [I@2ac1fdc4
//2、toString;数组内容转为字符串
System.out.println("arr数组初始状态:" + Arrays.toString(arr));
//3、fill 数组填充3
Arrays.fill(arr, 3);
System.out.println("arr数组现在状态:" + Arrays.toString(arr));
//赋值操作
Random rand = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = rand.nextInt(100);//赋值为100以内的随机整数
}
System.out.println("arr数组现在状态:" + Arrays.toString(arr));
//4、copyOf 复制一个长度为10的新数组
int[] arr2 = Arrays.copyOf(arr, 10);
System.out.println("新数组:" + Arrays.toString(arr2));
//5、equals
System.out.println("两个数组的比较结果:" + Arrays.equals(arr, arr2));
//6、sort 排序,从小到大
Arrays.sort(arr);
System.out.println("arr数组现在状态:" + Arrays.toString(arr));
}
}