数组的用处是什么呢?——当你需要将30个数进行大小排列的时候,用数组这样的数据结构存储是个很好的选择,当你是一个班的班主任的时候,每次要记录那些学生的缺勤次数的时候,数组也是很有用。数组可以进行插入,删除,查找等。

1)创建和内存分配

Java中有两种数据类型,基本类型和对象类型,也有人称为引用类型,Java中把数组当成对象,创建数组时使用new操作符。

    1. int array[] = new int[10];

    既然是对象,那么array便是数组的一个引用

     的内存分配,array会在栈中开辟空间,并且空间存储着保存数组存储的地址,真正保存对象的地方是对,new操作在堆中开辟了所需的空间,然后array指向头地址。

    初始化:

      1. public class UseArray {  
      2. public static void main(String[] args) {  
      3. int array[] = new int[10];  
      4. 2]);  
      5. new UseArray[12];  
      6. 1]);  
      7. int array2[] ={1,2,3,4,5,5,6};  
      8.     }  
      9. }

      new后的数组里面的值被默认初始化为0,而对象的初始化是空的,null,当然还可以通过{}的方式初始化。

      2)数组封装后的使用

      1. public class UseArray {  
      2. private int[] array;  
      3. private int number = 0;  
      4. public UseArray(int max){  
      5. new int[max];  
      6.     }  
      7. public void insert(int value){  
      8.         array[number] = value;  
      9.         number++;  
      10.     }  
      11. public int find(int value){  
      12. int index = 0;  
      13. for (int i= 0; i < number; i++) {  
      14. if(array[i]==value)  
      15. return index;  
      16.         }  
      17. return number;  
      18.     }  
      19.       
      20. public boolean delete(int value){  
      21. int index = find(value);  
      22. if(index != number){  
      23. for (int i = index; i < number-1; i++) {  
      24. 1];  
      25.             }  
      26.             number--;  
      27. return true;  
      28.         }  
      29. return false;  
      30.     }  
      31.       
      32. public void display(){  
      33. for (int i = 0; i < number; i++) {  
      34. " ");  
      35.         }  
      36.     }  
      37. public static void main(String[] args) {  
      38. new UseArray(5);  
      39. 1);  
      40. 2);  
      41. 6);  
      42. 7);  
      43. 3);  
      44.           
      45.         ua.display();  
      46. if(ua.find(5) != ua.number){  
      47.             System.out.println();  
      48. else{  
      49. "not found!");  
      50.         }  
      51. if(ua.delete(5)!=true){  
      52. "can not delete!");  
      53.         }  
      54.         ua.display();  
      55.     }  
      56. }

      将整个数组封装,用number代替数组的个数,插入数据的时候也不必理会往哪个下标插,当然,也可以自定义一个具体下标的方法。

      方法比较简单就不介绍了,但是存在的一个缺点在delete那里,其实只是从删除元素开始的左移而已,所以,虽然number减少了,但是最后一个元素并没有删除掉,只是display输出展示的时候隐藏了而已,但是,下次插入元素的时候新元素便会取代掉最后一个元素的位置。

      3)查找优化——二分查找

      1. public int find(int value){  
      2. int start = 0;  
      3. int end = number-1;  
      4. while(end>start){  
      5. int index =(end + start)/2;   
      6. if(array[index]==value){  
      7. return index;  
      8. else if(array[index] >value){  
      9. 1;  
      10. else {   
      11. 1;  
      12.             }  
      13.         }  
      14. return number;  
      15.     }

      二分查找前提是数组已经有序。刚开始index写成end和start相减,造成死循环。其实要的是相加。1,2,3,6,7。index=2,value=7,3小于7,start=3,那么index要的是3和4间的中间数,所以是相加之后除以2,6小于7,start=4,find到7。

      存储对象的话原理一样。

      4)大O表示法

      设N为数据总数,加入插入一个数据时间为K。

      那么线性查找总时间T=K*N/2,因为查找的话大概为比较数目的一半。

      二分查找的话T=k*log2(N)。

      大O表示法,O可以看成是order of,大约是的意思,k/2也是常数,所以可以看成是O(N)。

      数组的缺点呢,就是大小固定,查找慢,如果你要经常查找百万级别的数据,还会用数组吗?不会的,所以数据结构的选用要结合具体的实际情况,达到最大的效率值。