java 基础五 -- 数组
1 数组的定义
- 概念:同一种类型数据的集合,其实数组就是一个容器。
- 数组的好处:可以自动的给数组中的元素从0开始编号,方便操作这些元素。
- 格式1:
- 元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
- 格式2:
- 元素类型[] 数组名 = new 元素类型[]{元素1,元素2,……};
- 示例:
package java005; /** * 2017/9/3 * 说明:数组 */ public class ArrayDemo { public static void main(String[] args) { int [] arr = new int[5]; } }
- 示例:
package java005; /** * 2017/9/3 * 说明:数组 */ public class ArrayDemo { public static void main(String[] args) { int [] arr = new int[]{}; } }
- 示例:
package java005; /** * 2017/9/3 * 说明:数组 */ public class ArrayDemo { public static void main(String[] args) { int [] arr = new int[]{1,2,3}; } }
- 示例:
package java005; /** * 2017/9/3 * 说明:数组 */ public class ArrayDemo { public static void main(String[] args) { int [] arr = new int[5]; System.out.println(arr[0]); arr[1] = 59; for(int x = 0;x<arr.length;x++){ System.out.println(arr[x]); } } }
2 数组的内存分配及特点
- 内存的划分:
- 寄存器
- 本地方法区
- 方法区
- 堆内存
- 栈内存
- 栈内存:存储的都是局部变量,而且变量所属的作用域一旦结束,该变量就自动释放。
- 堆内存:存储的数组和对象(其实数组就是对象)。
- 每一个对象都有一个首地址值。
- 堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同。整数为0,小数是0.0,boolean类型是false,char类型是'\u0000'。
- 垃圾回收机制。
- 图解:int[] arr = new int[5];
- ①main方法进栈
-
- ②main方法进入到栈中,执行main方法中的代码,当执行到new int[5];的时候,在堆内存开辟了一段连续的空间,长度是5,并初始化堆中数组对象的默认值为对应类型的默认值,并分配堆中数组对象的内存地址。
-
- ③当将堆中地址赋值给左边的arr变量的时候,arr就指向了堆中的数组对象。
3 数组操作常见问题
- ArrayIndexOutOfBoundsException
package java005; /** * 2017/9/3 * 说明:数组 */ public class ArrayDemo { public static void main(String[] args) { int [] arr = new int[5]; System.out.println(arr[5]); } }
- NullPointerException
package java005; /** * 2017/9/3 * 说明:数组 */ public class ArrayDemo { public static void main(String[] args) { int [] arr = new int[5]; System.out.println(arr[arr.length-1]); arr = null; System.out.println(arr[arr.length-1]); } }
4 数组常见操作
4.1 遍历数组
package java005; /** * 2017/9/3 * 说明:数组 */ public class ArrayDemo { public static void main(String[] args) { int[] arr = new int[]{1,2,3,4,5,6,7,8,9,0}; for(int x = 0 ;x<arr.length;x++){ System.out.print(arr[x] +"\t"); } } }
4.2 最值
package java005; /** * 2017/9/3 * 说明:求最值 */ public class ArrayDemo2 { public static void main(String[] args) { int[] arr = new int[]{1,11,33,-1,-10}; int max = max(arr); int min = min(arr); System.out.println("最大值是:"+max); System.out.println("最小值是:"+min); } /** * 求一个数组的最大值 * @param arr * @return */ public static int max(int[] arr){ if(arr.length == 0){ throw new RuntimeException("数组不能为空"); } int max = arr[0]; for(int x =0;x<arr.length;x++){ if(max < arr[x]){ max = arr[x]; } } return max; } /** * 求一个数组的最小值 * @param arr * @return */ public static int min(int[] arr){ if(arr.length == 0){ throw new RuntimeException("数组不能为空"); } int min = arr[0]; for(int x =0;x<arr.length;x++){ if(min > arr[x]){ min = arr[x]; } } return min; } }
4.3 选择排序
package java005; /** * 2017/9/3 * 说明:选择排序 */ public class ArraySortDemo { public static void main(String[] args) { int[] arr = {34,19,11,103,56}; //排序前 printArray(arr); //排序 sortArray(arr); //排序后 printArray(arr); } /** * 打印数组 * @param arr */ public static void printArray(int[] arr){ System.out.print("["); for(int x = 0;x<arr.length;x++){ if(x == (arr.length -1)){ System.out.print(arr[x] +"]"); }else{ System.out.print(arr[x] +"、"); } } } /** * 对数组进行排序 * @param arr */ public static void sortArray(int[] arr){ for(int x = 0;x< arr.length-1;x++){ for(int y = x+1;y<arr.length;y++){ if(arr[x] > arr[y]){ int temp = arr[y]; arr[y] = arr[x]; arr[x] = temp; } } } } }
4.4 冒泡排序
package java005; /** * 2017/9/4 * 说明:冒泡排序 */ public class ArraySortDemo2 { public static void main(String[] args) { int[] arr = new int[]{34,19,11,109,3,56}; //排序前 printArray(arr); sortArray(arr); //排序后 printArray(arr); } /** * 输出数组中的每个元素 */ public static void printArray(int[] arr){ System.out.print("["); for (int x = 0;x<arr.length;x++){ if(x == arr.length-1){ System.out.println(arr[x] +"]"); }else{ System.out.print(arr[x]+"、"); } } } /** * 冒泡排序算法 * @param arr */ public static void sortArray(int[] arr){ for(int x =0;x<arr.length -1;x++){ for(int y = 0; y<arr.length -1 -x;y++){ if(arr[y] > arr[y+1]){ int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } } }
4.5 找出数组中指定数值的位置
4.5.1 普通查找法
package java005; /** * 2017/9/4 * 说明:冒泡排序 */ public class ArraySortDemo2 { public static void main(String[] args) { int[] arr = new int[]{34,19,11,109,3,56}; int index = commonFindElementIndexByValue(arr,109); System.out.println("索引值是:"+index); } public static int commonFindElementIndexByValue(int[] arr,int value){ if(arr == null || arr.length == 0){ return -1; } for(int x =0;x<arr.length;x++){ if(value == arr[x]){ return x; } } return -1; } }
4.5.2 二分查找法(折半查找法)--必须先排序
package java005; /** * 2017/9/4 * 说明:二分查找法 */ public class BinarySearchDemo { public static void main(String[] args) { int[] arr = new int[]{34,19,11,109,3,56}; sort(arr); int index = binarySearch(arr,56); System.out.print("index:"+index); } /** * 排序 * @param arr */ public static void sort(int[] arr){ for(int x =0;x<arr.length -1; x++){ for(int y = 0; y<arr.length -1 -x;y++){ if(arr[y] > arr[y+1]){ int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } } /** * 二分查找法 * @param arr * @param value * @return */ public static int binarySearch(int[] arr,int value){ if(arr == null || arr.length ==0){ return -1; } int min = 0; int max = arr.length-1; int mid = (min + max) / 2; while(arr[mid] != value){ if(value > arr[mid]){ min = mid +1 ; }else if(value < arr[mid]){ max = mid - 1; } if(min > max){ return -1; } mid = (min + max) / 2; } return mid; } }
- 二分查找法,是有弊端的,如果当前数组不是排序过的,那么返回的索引不是排序之前的索引值。
package java005; import javax.lang.model.element.VariableElement; /** * 2017/9/4 * 说明:二分查找法 */ public class BinarySearchDemo { public static void main(String[] args) { int[] arr = new int[]{34,19,11,109,3,56}; sort(arr); int index = binarySearch(arr,56); System.out.print("index:"+index); } /** * 排序 * @param arr */ public static void sort(int[] arr){ for(int x =0;x<arr.length -1; x++){ for(int y = 0; y<arr.length -1 -x;y++){ if(arr[y] > arr[y+1]){ int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } } /** * 二分查找法 * @param arr * @param value * @return */ public static int binarySearch(int[] arr,int value){ if(arr == null || arr.length ==0){ return -1; } int min = 0; int max = arr.length-1; int mid = 0; while(min < max){ mid = (min + max) >> 1; if(value > arr[mid]){ min = mid + 1; }else if(value < arr[mid]){ max = mid - 1; }else{ return mid; } } return -1; } }
4.6 将一个整数转换为16进制的数
- 在Java中,整数int是32位,而16进制的数,是从0到15,即每四个二进制就对应16进制,为啥?因为4个二进制最大为1111,对应的16进制是8+4+2+1=15。所以int类型的整数对应的16进制数是8位。
package java005; /** * 2017/9/5 * 说明: */ public class ConverterHex { public static void main(String[] args) { toHex(60); } public static void toHex(int num){ if(num == 0){ System.out.print("0"); return; } char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; char[] arr = new char[6]; int p = arr.length; while (num != 0){ int temp = num & 15; arr[--p] = chs[temp]; num = num >>>4; } for(int x = p;x<arr.length;x++){ System.out.print(arr[x]); } } }
5 数组中的数组(二维数组)
5.1 数组的定义
5.1.1 格式一
- int[][] arr = new int[3][2];
- 定义了名称为arr的二维数组。
- 二维数组中有3个一维数组。
- 每一个一维数组中有2个元素。
- 一维数组的名称分别为arr[0]、arr[1]和arr[2]。
- 给第一个一维数组中第一个元素赋值89,写法是arr[0][0]=89.
5.1.2 格式二
- int[][] arr = new int[3][];
- 二维数组中有3个一维数组。
- 每一个一维数组的默认初始化值是null。
- 可以对这三个一维数组分别进行初始化。
arr[0] = new int[3]; arr[1] = new int[9]; arr[x] = new int[50];
5.2 二维数组的示例
package java005; /** * 2017/9/5 * 说明: */ public class Array2Demo { public static void main(String[] args) { int[][] arr = new int[3][2]; arr[0][0] = 89; for(int x = 0;x<arr.length;x++){ for(int y = 0;y<arr[x].length;y++){ System.out.print(arr[x][y] +"\t"); } System.out.println(); } } }
5.3 二维数组的应用场景
-
某个公司需要统计销售人员每季度的销售额,那么其中销售甲的季度销售额用数组表示为;{30,59,28,17},那么乙同样可以用数组来表示销售乙的季度销售额{37,60,22,19},那么公司统计所有销售人员的销售额应该如下所示。
- int[][] arr = {{30,59,28,17},{37,60,22,19}};
- 虽然,上面的方式是可以满足我们的要求,但是我们并不清楚那个是甲的,那个是乙的,所以在java中使用Map集合来代替了二维数组在此场景下的应用。