一、数组
- 一组数的容器。
- 数组对每一个存入的数字都会自动编号,编号从0开始。——下标
二、数组的定义格式
- Type[] name = new Type[size]
数组的大小一旦被定义,不可改变。
在程序中第一次给变量赋值—–变量的初始化。
直接打印数组,打印出的是数组的地址。
打印的内容:[ I @ df6d9f8
[ 表示对象的类型是数组
I 如果这个对象是一个数组或者集合,那么这意味表示数组或集合中元素的类型
@ 表后边是地址
454f5gf5g 表示对象咋内存中地址对应hash码的十六进制的表现形式。 - int[] arr = new int[]{1,2,4,5,6}; — 定义好之后,初始元素已经一一赋值。
- int arr[] = {1,3,4,5,6,8}; —– 不支持先定义变量,在初始化变量。
new 用于创建一个新的对象
int arr[] = {1,2} — 在创建 的时候动态的获取数组的大小,然后才能分配内存空间
int arr[]; arr[] = {1,2} 不可行,系统不知道数组的大小。
三、数组的应用
- 获取数组中的元素 — 数组名[下标]
- 获取数组中的长度 — 数组名.length length是一个属性,不是一个方法!
- 遍历数组 — 获取数组中所有的元素—for、增强for
注意:增强for不能改变原来数组中的元素。
对于基本类型而言,传值传的实际的数据,;对于引用类型数据传值传的是地址。 - 获取数组中最大|小值
对数组进行排序
* 冒泡排序:
思路:相邻两个数两两比较,交换位置。
一共比较length-1轮
第i轮比较j次,i+j=length
j还要控制每次开始比较的下标public static void main(String[] args) { int arr[]={1,5,8,6,4,3,2}; for(int i = 1;i<arr.length;i++){ for(int j = 0;j<(arr.length-i);j++){ if(arr[j]>arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } for(int i : arr){ System.out.println(i); } }
选择排序
思路:第一位依次和后面的元素进行比较交换
一共比较length-1轮
第i轮比较j次,i+j=lengthpublic static void main(String[] args) { int arr[]={1,5,8,6,4,3,2}; for(int i=0;i<arr.length;i++){ for( int j= i;j<arr.length;j++){ if(arr[i]>arr[j]){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } for(int i : arr){ System.out.println(i); } }
java.util.Arrays
Arrays.sort(数组);//只能升序排序,从小到大。
String s = Arrays.toString(arr); //将数组中的元素依次拿出来拼接成一个字符串。
快速排序、希尔排序、堆排序。。。
查找数组中的元素
针对无序数组,for循环遍历
针对有序数组,用折半查找。/** * 针对有序数组的元素查找 * 折半查找 * */ public class Demo_23 { public static void main(String[] args) { int arr[]={0,1,2,3,4,5,6,7,8,9}; int num = 5; int min = 0; int max = arr.length-1; int mid = (min+max)/2; boolean flag = false; while(min<=max){ if(num == arr[mid]){ flag = true; break; } if(arr[mid]>num){ max = mid-1; }else{ min = mid+1; } mid = (min + max)/2; } if(flag){ System.out.println("在数组中第"+mid+"位"); }else{ System.out.println("好像没有这个数!"); } }
- 数组的反转
(1)利用新的数组
(2)数组元素首尾交换
思路:利用两个变量同时控制数组的两端,进行交换。 - 数组的扩容(复制)
System.arrayCopy(要复制哪个数组,要复制数组的起始位置,被复制到的数组,新数组中放置的起始位置,要复制元素的个数);
扩/缩容的本质还是数组的复制
数组 = Arrays.copyOf(数组,长度);
表面上看起来只对数组的长度做了改变,实际上已经不是原来的数组了。
数据类型在java底层通过泛型动态获取。
四、二维数组
- 是一组数组的容器—数组的数组
- 定义格式:数据类型[][] 数组名 = new 数据类型[二维数组的大小][所包含的一维数组的大小];
- int[][] name = new int[3][5]
这是一个包含3个一维数组的二维数组,每个一维数组有5个元素。
arr[0][0]—- 获取具体的元素 - 数据类型[][] name = new 数据类型[二维数组大小][];
二维数组中包含的一维数组可以动态设置,而不再二维数组定义时统一指定。 - 数据类型[][] name = {
{元素1},
{元素1,元素2},
}
- int[][] name = new int[3][5]
- 面试题:
1. 对于数组int[] x, y[]均以初始化,下列正确的是:B,C
A y = x; B y[0] = x; C y[0][0] = x[0]; D y[0] = x[0] E y = x[0]
注意:[] 在变量名之前是紧跟数据类型的,那么后面跟的每个变量只少是一个一维数组;[]在变量名之后是仅属于变量的。 - 遍历二维数组 — 需要两个循环