java数组
数组概念
1、数组是一种数据结构,用来装多种数据
2、属于引用类型数据
3、数组都有 length 属性用于获得该数组大小
4、数组都有默认值int数组的默认0 String的默认是null char的默认\u0000 boolean默认值false
5、数组只能装同一种类型数据
6、数组有下标(索引)从0开始
7、数组在内存空间是连续的内存地址
8、数组把第一个位置的地址,当做整个数组的地址
9、数组查找效率很快,因为内部结构的地址是连续的,并且第一个元素上的地址是整个数组的地址
10、不适合存储大量数据,因为很难找到一块连续大空间,不适合随机增删,因为所有元素都要移位
11、数组分为一维数组、二维数组、多维数组
12、数组定义完大小以后,不能改变。但是数组可以扩容(例如声明一个大数组,将小的放进去)
13、数组可以循环遍历
数据的组成结构
数据类型【】 数组名 = {赋值}
静态初始化:例如int[ ] num = {1,2,3}
动态初始化:例如int[ ] nums1 = new int[3];
数组的两种初始化方式
静态初始化:例如int[ ] num = {1,2,3}
动态初始化:例如int[ ] nums1 = new int[3];
nums1 [0] = 1;
nums1 [1] = 2;
nums1 [2] = 3;
当我们知道具体值的时候,用静态。不知道用动态,但是要预估大小
数组赋值遍历与输出
数组的遍历:
数组遍历的方法:
将引用数据类型的数据依次赋值给变量j
数组的赋值:
数组的输出:
要是对算数组内的值做运算可以用增强for循环,因为不需要考虑索引问题
Main方法里面的数组
public static void main(String[] args){
}
在运行main方法时可以给其传参,比如有需求调用main方法时要传入参数
数组参数传递
参数传递都是把值传过去,不同于基本类型的参数传递(成员,局部)传值,引用数据类型值是存在堆里的,转递参数时会把地址信息传过去,所以改值就是直接改了
数组扩容
1、当小数组的空间满了后可定义一个大的数组将值赋过去
例如:
2、或者用内置api:arraycopy()方法
/*形参:
*src :要烤贝的数组
*srcPos :起始位置
*dest :目标数组
*destPos:目标数组的起始位置
* Length:拷贝个数.
*/
System.arraycopy();
二维数组
定义写法:
int [][]
例如://静态初始化
int[][ ] nums1 = {{1,2},{2,3}};
//动态初始化
/*
2代表二维数组里面有两个一维数组
3代表一维数组有三个值
*/
int[][ ] nums2 = new int[2][3];
new一个对象就相当于在堆中开辟了一块内存空间,并把地址指向对象名
二维数组赋值
第一个0----二维数组里面第一个元素
第二个0----一维数组里面第一个元素
nums2[0][0] = 1;
使用循环取值:
使用循环取值:
只要是引用类型数据,那么默认一定是null,null调用方法时会报空指针异常
使用增强for取二维数组值
// arr值的是二维数组每一个一维数组
//k指的是一维数组里面具体的值
二维数组注意事项
定义不报错,但是你赋值的需要小心
String[][] strs = new String[3][];
strs[0] = new string[10];
操作数组的Arrays工具类
toString方法:返回指定数组内容的字符串表示形式。
例如:
int[ ] nums = new int[ 10];
System.out.print1n(Arrays.tostring(nums);
fill方法:对指定数组传值
例如:
Arrays.fill( num1,20) ;
binarySearch方法:使用二分法查找有序数组的指定值的索引
int[ ] num2 = {20,23,30,40,50,88,99};
int index = Arrays.binarySearch( num2,key:88);
system.out.println(index);
注意:当要查找的值不在数组内的话
返回-(该值插入点的索引+1)
int index = Arrays.binarySearch( num2,100); //-8
sort方法:对数组排序
equals方法:比较数组内的内容
引用数据类型直接比较是比较的内存地址
数组相关算法
冒泡排序
原理:就是找最大的值