Arrays工具类常用方法分析

Arrays工具类常用方法分析:

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。

引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,****实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

import java.util.Arrays;
import java.util.Comparator;

public class ArrUtils {
    public static void main(String[] args){
        //比较两个数组是否完全相同(值和值的排列顺序)
        int[] temp1=new int[]{1,2,3};
        int[] temp2=new int[]{1,3,2};
        System.out.println(Arrays.equals(temp1,temp2));
        int[] temp3=temp1;
        System.out.println(Arrays.equals(temp1,temp3));
        /*
        public static boolean equals(int[] a, int[] 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;
        }
        通过源代码可以知道我们先进行两个数组是否指向堆内存中的同一块内存,如果是true,如果不是在进行比较(对应位置的值)
        */


        //输出数组信息toString
        System.out.println(Arrays.toString(temp1));

        //将指定元素填充满数组
        Arrays.fill(temp1,100);
        System.out.println(Arrays.toString(temp1));

        //排序算法sort
        Integer[] temp4=new Integer[]{1,2,3,2};
        Arrays.sort(temp4,new Comparator<Integer>(){
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        System.out.println(Arrays.toString(temp4));
        //Arrays.sort(temp2);
        //System.out.println(Arrays.toString(temp2));



        //二分查找 binarySearch
        int index=Arrays.binarySearch(temp4,3);
        System.out.println(index);

        /*
        public static int binarySearch(Object[] a, Object key) {
            return binarySearch0(a, 0, a.length, key);
        }
        private static int binarySearch0(Object[] a, int fromIndex, int toIndex,
                                     Object key) {
            int low = fromIndex;
            int high = toIndex - 1;

            while (low <= high) {
                int mid = (low + high) >>> 1;
                @SuppressWarnings("rawtypes")
                Comparable midVal = (Comparable)a[mid];
                @SuppressWarnings("unchecked")
                int cmp = midVal.compareTo(key);

                if (cmp < 0)
                    low = mid + 1;
                else if (cmp > 0)
                    high = mid - 1;
                else
                    return mid; // key found
            }
            return -(low + 1);  // key not found.
        }
        */


    }
}
posted on 2021-09-17 00:12  gyp666  阅读(34)  评论(0)    收藏  举报