2020/3/6学习笔记-day13

java-day13

目录

早上

第一节课

内存内的堆和栈

第二节课

数组中的下标

循环遍历数组

特殊形式

形式1:

形式2:

形式3:

第三节课

数组拷贝

jdk提供了数组拷贝的方法

对数组进行操作的工具类

toString()

下午

第一节课

copyOfRange

sort:排序

binarySearch:在排序完后进行指定位置的查找

equals:比较两个数组是否相等

fill:填充

实例:求平均值

第二节课

实例:求最大值

 实例:实现冒泡排序

第三节课

实例:选择排序


早上

第一节课

内存内的堆和栈

堆内存:存放对象(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];   
            }   
        }
    

发布了82 篇原创文章 · 获赞 52 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/iostream992/article/details/104700168