java-day13
目录
早上
第一节课
内存内的堆和栈
堆内存:存放对象(new出的每个对象都在堆中)
栈内存:方法中所编写的代码都会存储在栈中,一行一行地执行;局部变量存在栈中,会指向堆中对应的内存对象。
基本类型数组和引用类型数组的区别
引用里面存的是对象内存地址值,通过下标来表示。
第二节课
数组中的下标
由于数组在堆区是一块连续的内存空间,所以我们可以用0123这样连续的下标值来访问数组中的数据。
注意:下标一定是从0开始的,下标的最大值为数组的长度-1。
例如:
int [ ] a = new int[5];
这个数组对象的长度为5
数组下标的最小值为0
数组下标的最大值为4
因为 0 1 2 3 4刚好对应数组中五个可以存放的数据的位置
注意:下表在使用中如果超过最小或者最大的范围就会报错。
循环遍历数组
特殊形式
形式1:
编译通过 声明数组变量、创建数组对象、给数组中进行赋值 表明数组对象的长度为4,并且已经把值给设置好了分别为1 2 3 4
int[] a2 = new int[]{1,2,3,4};
形式2:
编译通过 声明数组变量、创建数组对象、给数组中进行赋值 表明数组对象的长度为4,并且已经把值给设置好了分别为1 2 3 4
int[] a3 = {1,2,3,4};
形式3:
编译通过 先声明数组变量,再创建数组对象、给数组中进行赋值 表明数组对象的长度为4,并且已经把值给设置好了分别为1 2 3 4
int[] a4;
a2 = new int[]{1,2,3,4};
注意以下方法
int[] a = new int[3]; //正确
int[] a = new int[3]{1,2,3}; //错误
int[] a = new int[]{1,2,3}; //正确
int[] a = {1,2,3}; //正确
int[] a ;
a = new int[]{1,2,3}; //正确
int[] a ;
a = new int[3]; //正确
int[] a;
a = {1,2,3}; //错误
第三节课
数组拷贝
jdk提供了数组拷贝的方法
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目的地数据中的起始位置。
length - 要复制的数组元素的数量。
该方法运用了其他语言来实现(native修饰的方法)
对数组进行操作的工具类
java.util.Arrays类:java api中提供的工具类
这个类在代码中辅助我们对数组对象进行操作的。
里面有很多静态方法可供调用,重要的功能是对数组的操作,如排序、查询、填充、复制
源代码
public static boolean[] copyOf(boolean[] original, int newLength) {
boolean[] copy = new boolean[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
/*
在arraycopy下进行限制,从0开始,两者最小值结束
*/
通过观察上面的源码,等号右边先建了一个数组对象,将a指向新的数组对象,此时新的数组对象有10个值
toString()
public static String toString(short[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
数组长度一旦确定,就不能再修改了。我们只是创建了一个新的数组,并且把老数组中的数据复制到了新数组中,并且把新数组返回给用户,这个效果让人感觉上像是老的数组的长度变长了,但其实并没有。
下午
第一节课
copyOfRange
public static short[] copyOfRange(short[] original, int from, int to) {
int newLength = to - from;
if (newLength < 0)
throw new IllegalArgumentException(from + " > " + to);
short[] copy = new short[newLength];
System.arraycopy(original, from, copy, 0,
Math.min(original.length - from, newLength));
return copy;
}
sort:排序
binarySearch:在排序完后进行指定位置的查找
public static int binarySearch(long[] a, int fromIndex, int toIndex,
long key) {
rangeCheck(a.length, fromIndex, toIndex);
return binarySearch0(a, fromIndex, toIndex, key);
}
// Like public version, but without range checks.
private static int binarySearch0(long[] a, int fromIndex, int toIndex,
long key) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
long midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
equals:比较两个数组是否相等
但是要求两个数组中的值一一相等并且顺序一致(比较前用sort对两个数组进行排序)
public static boolean equals(long[] a, long[] a2) {
if (a==a2)
return true;
if (a==null || a2==null)
return false;
int length = a.length;
if (a2.length != length)
return false;
for (int i=0; i<length; i++)
if (a[i] != a2[i])
return false;
return true;
}
fill:填充
实例:求平均值
第二节课
实例:求最大值
实例:实现冒泡排序
规则:在一组数据中,从左到右,俩俩比较,然后把较大的数据往前推,一轮下来之后,最大的一一个数据就被推到了最右边。
第三节课
实例:选择排序
规则:每一轮在待排序找到一个最小值后,把这个最小值放到已经排好顺序的区域的末尾,剩下的部分成为新的待排区域部分,重复上面的步骤直到排序结束。
//选择排序
public void test10(int[] arr2){
//获取数组的长度
int len = arr2.length;
//每一轮的找到最小值放置的位置
int min_now_index; //最小值当前的位置
int min_should_index;//最小值应该在的位置
//外层循环:比较轮数,i是该轮最小值存放位置
for(int i = 0;i<len-1;i++){
//每一轮i刚好就是本轮就是最小值的位置
min_now_index = i;
//假设当前i就是本轮最小位置的实际位置
min_should_index = i;
//内层循环:每轮找出当前未排序区最小值实际位置的下标
for(int j = i+1;j<len;j++){//第一轮下标1开始
if(arr2[j]<arr2[min_now_index]){
//哪个数据小,就把这个数据下标赋值给min_now_index
//这个变量始终保持当前未排序区中的最小值的位置
min_now_index = j;
}
}
//内层循环结束后就明确当前未排序中最新值的实际位置
//以及最小值的应该存放在什么位置
//找到最小值之后,需要和本轮提前指定好的位置进行数据交换
if(min_now_index!=min_should_index){
arr2[min_now_index] = arr2[min_now_index]^arr2[min_should_index];
arr2[min_should_index] = arr2[min_now_index]^arr2[min_should_index];
arr2[min_now_index] = arr2[min_now_index]^arr2[min_should_index];
}
}