关于数组的一些个人理解和源码
2018-03-01 11:02
459 查看
数组的特殊性:
java中有大量其他的方式可以持有对象,为什么数组十分的与众不同呢?
因为数组与其他种类别的容器的区别有三方面:效率、类型和保存基本类型的能力。
Java中数组是一种效率最高的存储和随机访问对象引用序列的方式。
数组就是一个简单的线性序列,所以访问元素会特别快。
但是弊端就是数组对象的大小是被固定的,并且在生命周期中不可改变。
很容易就会想到ArrayList的本质也是数组,并且他的访问速度相对于LinkedList来说还非常快,主要ArrayList的长度在其生命周期中可以随意变化。
ArrayList可以通过创建一个新的实例,然后把旧实例中所有的引用移到新实例中,从而实现更多空间的自动分配。
但是这种弹性需要开销,因此,ArrayList的效率比数组低得多。
无论是哪种数据类型的数组,数组标识符其实只是一个引用,指向堆中创建的一个真实对象。
对象数组和基本类型数组在使用上几乎是一样的,只不过是对象数组保存的是对象的引用,基本类型数组保存的是基本类型的值。
Arrays实用功能:
equals()
用于比较两个数组是否相等(deepEquals()用于比较多维数组)
jdk源码:
sort()
用于数组排序:http://blog.csdn.net/octopusflying/article/details/52388012
binarySearch()
在已经排序的数组中查找元素
jdk源码:
toString()
产生数组的String表示:
jdk源码:
hashCode()
产生数组散列码:
jdk源码:
asList()数组转变为List容器
java中有大量其他的方式可以持有对象,为什么数组十分的与众不同呢?
因为数组与其他种类别的容器的区别有三方面:效率、类型和保存基本类型的能力。
Java中数组是一种效率最高的存储和随机访问对象引用序列的方式。
数组就是一个简单的线性序列,所以访问元素会特别快。
但是弊端就是数组对象的大小是被固定的,并且在生命周期中不可改变。
很容易就会想到ArrayList的本质也是数组,并且他的访问速度相对于LinkedList来说还非常快,主要ArrayList的长度在其生命周期中可以随意变化。
ArrayList可以通过创建一个新的实例,然后把旧实例中所有的引用移到新实例中,从而实现更多空间的自动分配。
但是这种弹性需要开销,因此,ArrayList的效率比数组低得多。
无论是哪种数据类型的数组,数组标识符其实只是一个引用,指向堆中创建的一个真实对象。
对象数组和基本类型数组在使用上几乎是一样的,只不过是对象数组保存的是对象的引用,基本类型数组保存的是基本类型的值。
Arrays实用功能:
equals()
用于比较两个数组是否相等(deepEquals()用于比较多维数组)
jdk源码:
public static boolean equals(char[] a, char[] 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; }
sort()
用于数组排序:http://blog.csdn.net/octopusflying/article/details/52388012
binarySearch()
在已经排序的数组中查找元素
jdk源码:
public static int binarySearch(int[] a, int key) { return binarySearch0(a, 0, a.length, key); } private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) { int low = fromIndex; int high = toIndex - 1; while (low <= high) { int mid = (low + high) >>> 1; int 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. }
toString()
产生数组的String表示:
jdk源码:
public static String toString(long[] 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(", "); } }
hashCode()
产生数组散列码:
jdk源码:
public static int hashCode(long a[]) { if (a == null) return 0; int result = 1; for (long element : a) { int elementHash = (int)(element ^ (element >>> 32)); result = 31 * result + elementHash; } return result; }
asList()数组转变为List容器
相关文章推荐
- 关于事件与委托的一些个人简单理解
- 关于Python2/3多进程的一些个人理解
- 关于高考英语阅读理解的一些个人技巧1.17
- 关于函数指针数组和函数指针数组的指针的一些理解
- js中关于可视区、实际区域一些知识的个人理解
- 关于wordpress的$post全局变量,以及主循环the loop的一些个人理解。
- 关于Bean\Entity\Model\POJO的一些个人理解
- 个人理解:关于指针数组、数组指针、函数指针、函数指针数组、函数指针数组指针
- 关于数组的一些理解(不定数组赋值,泛类型)
- 关于内核中spinlock的一些个人理解 【转】
- 关于KMP的一些个人理解
- 关于多维数组的一点个人的理解(以三维数组为例)
- 关于python锁的一些个人理解
- 关于Myeclipse调试的一些个人理解
- 关于AOP的一些个人理解
- 关于.NE弱引用的一些个人理解
- 关于大数据的一些个人理解
- 关于技术美术的一些个人理解
- 关于递归调用,函数指针,数组,字符串的一些理解
- 关于Volatile关键字含义的一些个人理解