Java基础知识(二)——数组
为什么会有栈内存和堆内存之分呢?
当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁。因此,所有在方法中定义的局部变量都是放在栈内存中的;在程序中创建一个对象时,这个对象将被保存到运行时数据库中,以便反复利用(因为对象创建成本通常较大),这个·运行时的数据区就是堆内存。
堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(在参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它。
因此,为了让垃圾回收机制回收一个数组所占空间,可以将该数组变量赋为null,也就切断了数组引用变量和实际数组之间的引用关系,实际数组也就成了垃圾。
定义并初始化一个数组后,在内存中分配了两个空间,一个用于存放数组的引用变量,另一个用于存放数组本身。
Java没有多维数组!!!
type [] [] arrName;
Java语言采用上面的语法格式来定义二维数组,但它的实质还是一维数组,只是其数组元素也是引用,数组元素里保存的引用指向一维数组。
接着对这个“二维数组”执行初始化,同样可以把这个数组当成一维数组来初始化,把这个“二维数组”当成一个一维数组,其元素的类型是type[]类型,则可以采用如下语法进行初始化:
arrName = new type[length] [];
上面的初始化语法相当于初始了一个一维数组,这个一维数组的长度是length。同样,因为这个一维数组的数组元素是引用类型的,所以系统为每个数组元素都分配初始值:null。
是否可以让灰色覆盖的数组元素再指向另一个数组?以此拓展为多维数组?
不能(至少在这个程序中不能)!,因为Java是强类型语言,当定义a数组的数组元素是int[]类型,则a[]数组元素只能是int类型所以只能存储int类型的变量。
Java 8增强的工具类:Arrays(java.util)
Search:
int binarySearch(type[] a, type key);使用二分法查询key元素在a数组中出现的索引;数组不包含key元素值,则返回负数。调用该方法时要求数组元素已经按升序排列,才能得到正确结果。
int binarySearch(type[] a, int fromIdex, int toIndex, type key);
Copy:
type[] copyOf(type[] original, int length);这个方法将会把original数组复制成一个新数组,其中length是新数组的长度。如果length小于original数组的长度,则新数组元素就是原数组的前面length个元素;如果length大于original数组的长度,则新数组的后面的元素补充0、false或者null。
type[] copyOfRange(type original, int from, int to);
Equals:
boolean equals(type[] a,type a2);a数组和a2数组长度相等,元素一一相同,则返回true。
Fill:
void fill(type[] a, type val);该方法会把a数组所有元素赋值为val。
void fill(type[] a,int fromIndex, int toIndex, type val);
Sort:
void sort(type[] a);对a数组排序。
void sort(type[] a, int fromIndex, int toIndex);
String toString(type[] a);该方法将一个数组转换成一个字符串。该方法按顺序把多个数组元素连缀在一起,多个数组元素使用英文逗号(,)和空格隔开。
此外,在System类里也包含了一个static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)方法,该方法可以将src数组里元素赋给dest数组的元素,其中srcPos(destPos)指定从src(destPos)数组的第几个元素开始赋值,length参数指定将src数组的多少个元素值付给dest数组元素。
Parallel:
parallelPrefix(xxx[] array, XxxBinaryOperator op);该方法使用op参数指定的计算公式计算得到的结果作为新元素。op计算公式包括left、right两个形参,其中left代表中前一个索引处的元素,right代表数组中当前索引处的元素,当计算第一个新数组元素时,left默认值为1。
void parallelPrefix(xxx[] array, int fromIndex, int toIndex, XxxBinaryOperator op);
void setAll(xxx[] array, IntToXxxFunction generator);该方法使用指定生成器(generator)为所有数组元素设置值,该生成器控制数组值的生成算法。
void parallelsetAll(xxx[] array, IntToXxxFunction generator);
void parallelSort(xxx[] a);该方法的功能与Arrays类以前的sort类似,只是增加了并行能力,可以利用多CPU并行提高性能。
void parallelSort(xxx[] a, int fromIndex, int toIndex);
Spliterator:
Spliterator.OfXxx spliterator(xxx[] array);将该数组所有元素转换成Spliterator对象。
Spliterator.OfXxx spliterator(xxx[] array, int stratInclusive, int endExclusive);
XxxStream stream(xxx[] array);该方法将数组转换成为Stream(Java8新增的流式编程的API)。
XxxStream stream(xxx[] array, int stratInclusive, int endExclusive);
posted on 2019-01-03 18:45 没有人能在我的BGM里战胜我 阅读(118) 评论(0) 收藏 举报
浙公网安备 33010602011771号