java内置对象果然强大。
java中没有sizeof(),获取一个未知数组长度可以 数据名.length 直接得到了数组的长度。连字节转换都省了。
数组静态方法类为Arrays,其中全部为静态方法视为工具类。其中有好多更爽的方法Arrays.toString(array)直接将一个数组换成字符串了。Arrays.sort(array)升序排序。爽就一个字我只说一次啊。
立马实验一下,先来两个基本排序
选择排序:
static void selectSort(int[] array){
for (int i = 0; i < array.length - 1; i++) {
for (int j = i + 1; j < array.length; j++) {
if (array[i] > array[j]) {
array[i] = array[i] ^ array[j];
array[j] = array[i] ^ array[j];
array[i] = array[i] ^ array[j];
}
}
}
}
冒泡排序:
private static void bubbleSort(int[] array){
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j] < array[j + 1]) {
array[j] = array[j] ^ array[j + 1];
array[j + 1] = array[j] ^ array[j + 1];
array[j] = array[j] ^ array[j + 1];
}
}
}
}
有序数组折半插入法:
private static int searchInsertIndex(int[] array, int insertKey){
int mid = 0, start = 0, end = array.length - 1;
while(end >= start){
mid = (end + start)>>1;
if (array[mid] > insertKey) {
end = mid - 1;
}
else if(array[mid] < insertKey){
start = mid + 1;
}
else {
return mid;
}
}
return start;
}
注:有必要提一点,java中创建对象数组和C++相比有一个非常容易忽视的问题。
C++中可以直接使用默认构造函数,new出一个对象数组,如。 Object *pOb= new Object[5];返回的是五个连续Object类数组第一个字节的指针地址。
而在java中。Object[] arrOb = new Object[5];返回的仅仅只是一个数组的引用,对象实例并没有真正被创建,后续须要arrOb[index] = new Object();一次次的将实例创建并用之前创建的数组中的每个元素引用指向它,好啰嗦。由此可以看出,C++中类数组实体是在一片连续的内存空间中,而Java中的类数组很可能在内存中的分配是东一个西一个。
顺便分析了一下这种设计的原因,如果一个对象占用64个字节,那么5个对象就须要320个字节的空间,当创建一个5个该对象数组时,C++会去内存寻找一块不小于320字节的空间用来存放这5个对象。而Java只须要在可用内存空间中找出5块不小于64字节的位置,分别存放5个对象即可。这么做的好处是内存利用率增加,坏处是导致对数组逐元素操作时内存寻址速度减慢,严重影响程序执行效率。