java---数组(重点概念)
一、什么是数组
- 程序=算法+数据结构
- 数据结构:把数据按照某种特定的结构保存,设计一个合理的数据是解决问题的关键;
- 数组:是一种用于存储多个相同类型数据类型 的存储模型;
- 数组的特定结构:相同类型组成元素集合
- 通过氧元素的下标进行访问,切下标从0开始,最大元素下标为[数组长度-1];
二、数组的定义:
声明数组:
- 数据类型[] 变量名:int[] arr:定义了一个int类型的数组,数组名为arr,推荐使用这种
- 数据类型 变量名[]:int arr[]:定义了一个int类型的变量,变量名为arr数组
举例:
int [] i=new int[5];//长度为5; 含义: int:数组的元素类型必须为int i:数组的名称 new:创建了一个数组对象 5:数组的长度 1、初始值为int的默认值 2、元素为{0,0,0,0,0}
三、数组的初始化之动态初始化
1、数组初始化概述:
- java中的数组必须先初始化后,才能使用;
- 所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值
2、数组初始化方式:
- 动态初始化
- 静态初始化
3、动态初始化
- 就是初始化时只指定数组长度,由系统为数组分配初始值;
- 格式:
**数据类型[] 变量名 = new 数据类型[数组长度];** - int[] arr=new int[3];
4、三种初始化方式:
int[] i=new int[5];//长度为5;
int[] i=new int[]{0,1,2,3,4};//长度即为元素个数
int[] i={1,2,3,4,5};//直接初始化元素,长度为元素的个数 1、这种写法只能再声明时对其初始化不能用于赋值 2、int[] arr;arr={1,2,34,4};编译错误 3、对于数组的赋值只能对其元素进行赋值,不能对数组定义直接赋值 4、可以采用第二种方式先用new关键字创建空间,再赋值arr=new[]{1,2,34,4}
四、数组的访问
数组变量访问方式:数组名
数组内部保存的数据的访问方式:数组名[索引]
索引是数组中数据的编导方式
作用:索引用于访问数组中的数据使用,数组名[索引]等同于变量名,是一种特殊的变量名
特征:
- 索引从0开始;
- 索引是连续的;
- 索引逐一增加,每次加1
1、foreach:
for (类型名 变量名:数组名或集合名){ 循环体; }
2、引用类型:
- 引用类型变量:一段空间,对象的起始地址;
- 引用类型对象:一段空间,保存数据;
- 引用类型变量=new ***();
3、二维数组:
本质就是一维数组;
数组中的元素的类型是一维数组类型;
变量:类型名[] 变量名;
对象:new 类型名整形表式;
五、内存分配:
1、java中内存分配:
java程序在运行时,需要在内存中分配空间,为了提高运算效率,就对空间进行了不同区域的划分;
因为每一片区域都有特定的处理数据方式和内存管理方式
- 整形:初始值为0;
- 浮点数:初始值为0.0;
- 字符型:空字符;
- 布尔型:初始值为false;
- 引用数据类型:默认值为null
2、栈内存:存储局部变量
定义在方法中的变量,例如:arr,使用完毕,立即消失
3、堆内存:存储new出来的内容(实体,对象)
数组在初始化时,会为存储空间添加默认值
每一个new出来的东西都有一个地址值,使用完毕,会在垃圾回收器空闲时被回收
4、数组内存图(多个数组指向相同)
int[] arr=new int[3]; arr[0]=100; arr[1]=200; arr[2]=300; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); int[] arr2=arr; arr2[0]=111; arr2[1]=222; arr2[2]=333; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr2); System.out.println(arr2[0]); //结果: [I@1540e19d 100 200 300 [I@1540e19d 111 [I@1540e19d 111
六、数组初始化之静态初始化
- 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度;
- 格式:数据类型[] 变量名=new 数据类型[]{数据1,数据2,数据3,........}
- 简化格式:数据类型[] 变量名={数据1,数据2,数据3..........}
举例:
int[] arr={1,2,3,4}; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); } 结果: [I@1540e19d 1 2 3
七、数组操作的两个常见小问题:
1、索引越界:访问了数组中不存在的索引对于的元素,造成索引越界问题;
2、空指针异常:访问了数组已经不再指向堆内存的数据,造成空指针异常。
null:空值,引用数据类型的默认值,表示不指向任何有效对象
int[] arr=new int[3]; System.out.println(arr[3]);
异常:
ArrayIndexOutOfBoundsException:数组索引越界异常
NullPointerException:空指针异常
int[] arr=new int[3]; // System.out.println(arr[3]); arr=null; System.out.println(arr[0]);
八、数组常见操作:
1、获取数组元素的数量(.length):
int[] a=new int[]{4,6,7,8}; int len=a.length;//数组的length属性 System.out.println(len);//4
2、通过下标访问数组元素:
public class Numberjihe { public static void main(String[] args) { int[] b = { 4, 6, 9, 8, 7 };// b[0]----b[4] // 0,获取最后一位元素值 System.out.println(b[b.length - 1]);// 7 System.out.println("---------"); // 1、获取元素下标为奇数的元素 // 循环问题 条件:数组的长度 变量:第一个元素 改变条件:%2==1 for (int i = 0; i < b.length; i++) { if (i % 2 == 1) { System.out.println(b[i]); } } // 2、交换元素下标为2和3的元素位置 int temp = b[2]; b[2] = b[3]; b[3] = temp; System.out.println(b[2]); System.out.println(b[3]); } }
3、获取最值:
思路:
1、定义一个变量,用于保存最大值(或最小值);-------------------int max;
2、取数组中第一个数据作为变量的初始值;-----------------------------int max=arr[0];
3、与数组中剩余的数据逐个比对,每次比对将最大值保存到变量中;------
for(int x=1;x<arr.length;x++){
if(arr[x]>max){
max=arr[x];
}
}
4、循环结束后打印变量的值
System,out.println(max);
九、遍历数组元素:
1、基本for循环
public class Number3 { public static void main(String[] args) { int[] a2 = new [] { 3, 6, 7, 9 }; // 基本for循环 for (int i = 0; i < a2.length; i++) { System.out.println(a2[i] + ""); } // jdk1.8提供了增强for循环 for (int i : a2) { System.out.println(i + ""); } } }
2、增强for循环
// jdk1.8提供了增强for循环 for (int i : a2) { System.out.println(i + ""); }
十、数组的复制:
1、System.arrayCopy()方法:
public static void arrayCopy(Object src,int srcPos,Object dest,int desPos,int length)
- src:元数组
- srcPos:原数组的起始位置
- dest:目标数组
- destPos:目标数组的起始位置
- length:复制的长度
int[] c1 = {10,30,65,45}; int[] c2 = new int[4]; System.arraycopy(c1, 1, c2, 0, 3); System.out.println(Arrays.toString(c2));
如果目标数组小于需要copy的长度时会报出ArraysIndexOutOfBoundsException
2、Arrays.copyOf()方法:
java.util.Arrays类实现了数组复制的方法Arrays.copyOf(类型[] src,int length)
- src:原数组
- length:复制的长度
int[] c1 = {10,30,65,45}; System.out.println("s:" + c1.length); c1 = Arrays.copyOf(c1, 3); System.out.println(Arrays.toString(c1));//截取 System.out.println("t:" + c1.length);
结论:
- 当复制的长度小于新数组,则截取;
- 当复制的长度大于新数组,则扩容;
- copyof方法使用时原数组长度变化的原因:
- 原数组长度不变;
- 源码中可以看出创建一个新数组使用
十一、数组的排序:
1、数组的排序:
- 排序是最常见的算法之一;
- 排序:将数组元素按照从小到大或者从大到小的顺序排列
- 常见的排序算法:冒泡排序,选择排序,插入排序,希尔排序,快速排序,归并排序等等
2、冒泡排序:
算法核心:比较相邻两个元素,将较大的元素互换
System.out.println("请输入产生数组的长度:"); Scanner scanner = new Scanner(System.in); int length = scanner.nextInt(); System.out.println("请输入你要产生的数组元素的范围:"); int location = scanner.nextInt(); int[] arr = new int[length]; for (int i = 0; i < arr.length; i++) { Random random = new Random(); arr[i] = random.nextInt(location); } System.out.println("排序前:" + Arrays.toString(arr)); // 冒泡排序 for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[i]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } System.out.println("排序后:" + Arrays.toString(arr)); } }
System.out.println("排序前:" + Arrays.toString(arr)); //冒泡排序 Arrays.sort(arr); System.out.println("排序后:" + Arrays.toString(arr));
本文来自博客园,作者:LXXXXxZz,转载请注明原文链接:https://www.cnblogs.com/l11111/p/16004295.html