数组在Java中的内存方式:
栈:
- 存放基本变量类型(会包含这个基本类型的具体数值)
理解:
就是int,float,double,等等都是在栈里面创建变量和存数据的。
- 引用对象的变量(会存放这个引用在堆里面的具体地址)
理解:
假如new了一个对象**“int[] array = new int[10]”那么array这个引用地址就是存在栈里面的,而这个array相当于一个引用堆里面数据和对象的地址**。
堆:
- 存放new的对象和数组
- 可以被所有的线程共享,不会存放别的对象引用
理解(栈和堆):
类似数组和类都是在栈里面创建对象名的引用地址,但是开辟空间,存数据的地方是在堆里面,要是用数据就要通过栈的array这个引用地址,调用存在堆的对象名和数据。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iPThU1Pz-1586702559570)(C:\Users\Administrator\Desktop\2020-03-29_144325.png)]
方法区:
- 可以被所有的线程共享
- 包含了所有的class和static变量
数组基本特点:
- 长度是确定的,数组一旦被创建,他的大小就是不可以改变的
- 其元素必须是相同类型,不允许出现混合类型
- 数组中的元素可以是任何数据类型,包括基本和引用类型
- 数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量
- 数组本身就是对象,Java中对象都是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
报错类型:
ArrayIndexOutOfBounds:数组下标超出边界
数组中的For-Each循环:
**缺点:**里面的下标是取不到的
**快捷键:**数组名.for
语法:
int[] num = new int[]{1,2,3,4,5,6,7,8,9,};
for (int i : num) {
System.out.println(i);
}
结果:
1,2,3,4,5,6,7,8,9,
多维数组:
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的
二维数组,其实每一个元素都是一个一维数组。
二维数组:
语法:
int a[][] = new int[][]{{1,2},{2,3},{3,4}};
解析:
上面的二维数组,三个{}前面的1,2,3分别的a数组的第一个数组的元素,三个{}后面的2,3,4分别的a数组的第二个数组的元素(就是说在一维数组的每个元素上再开辟一个数组)
Arrays类:
在使用的时候可以直接使用类名Arrays进行调用,可以通过使用对象来调用
Arrays.fill()
//给数组赋值(填充效果)
int[] a =new int[10];
Arrays.fill(a,1);
System.out.println(Arrays.toString(a));
结果:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
Arrays.sort()
//给数组排序(升序):
int[] a =new int[]{10,9,8,7,2,4,5,1,3,6};
Arrays.sort(a);
System.out.println(Arrays.toString(a));
结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Arrays.equals()
//比较数组(比较数组中的元素是否相等):
int[] a =new int[]{10,9};//与b数组的元素有一个不相同,就是false
int[] b =new int[]{10,8};
boolean c= Arrays.equals(a,b);
System.out.println(c);
结果:
false
Arrays.binarySearch()
//查找数组元素(对排序好的数组进行二分查找法操作):
int[] a =new int[]{11,12,13,14,151,180};
System.out.println(Arrays.binarySearch(a,180));
结果:
5
要输出时,使用**Arrays.toString(a)**来换成字符串形式输出
冒泡排序:
一轮轮的进行两两比较,如果前面的比后面的大,就会交换位置,如果相同和前面的比后面的小,就不换位置。
public static void main(String[] args) {
int[] a = new int[]{2,5,1,55,23,45,88,95,8,47,25};
// sort(a);
System.out.println(Arrays.toString(sort(a)));
}
public static int[] sort(int[] a){
/**
* 1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置
* 2.每一次比较都会产生出一个最大的,或者最小的数字
* 3.下一轮则可以少一次排序
* 4.依次循环,直到知道结束
*/
int temp = 0;
//外层循环,判断需要循环的次数
for (int i = 0; i < a.length-1; i++) {
//内层循环,判断比较两个数,因为没判断一次就会出一个结果,所以
//j<a.length-1-i
for (int j = 0; j <a.length-1-i; j++) {
if (a[j]>a[j+1]){
temp= a[j];
a[j] = a[j+1];
a[j+1] =temp;
}
}
}
return a;
}
稀疏数组:
if (a[j]>a[j+1]){
temp= a[j];
a[j] = a[j+1];
a[j+1] =temp;
}
}
}
return a;
}
### 稀疏数组: