數組的用處是什么呢?——當你需要將30個數進行大小排列的時候,用數組這樣的數據結構存儲是個很好的選擇,當你是一個班的班主任的時候,每次要記錄那些學生的缺勤次數的時候,數組也是很有用。數組可以進行插入,刪除,查找等。
1)創建和內存分配
Java中有兩種數據類型,基本類型和對象類型,也有人稱為引用類型,Java中把數組當成對象,創建數組時使用new操作符。
1
|
int array[] = new int [ 10 ]; |
既然是對象,那么array便是數組的一個引用,根據Java編程思想(一) —— 一切都是對象 的內存分配,array會在棧中開辟空間,并且空間存儲著保存數組存儲的地址,真正保存對象的地方是對,new操作在堆中開辟了所需的空間,然后array指向頭地址。
初始化:
1
2
3
4
5
6
7
8
9
|
public class UseArray { public static void main(String[] args) { int array[] = new int [ 10 ]; System.out.println(array[ 2 ]); UseArray a[] = new UseArray[ 12 ]; System.out.println(a[ 1 ]); int array2[] ={ 1 , 2 , 3 , 4 , 5 , 5 , 6 }; } } |
new后的數組里面的值被默認初始化為0,而對象的初始化是空的,null,當然還可以通過{}的方式初始化。
2)數組封裝后的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
public class UseArray { private int [] array; private int number = 0 ; public UseArray( int max){ array = new int [max]; } public void insert( int value){ array[number] = value; number++; } public int find( int value){ for ( int i= 0 ; i < number; i++) { if (array[i]==value) return i; } return number; } public boolean delete( int value){ int index = find(value); if (index != number){ for ( int i = index; i < number- 1 ; i++) { array[i] = array[i+ 1 ]; } number--; return true ; } return false ; } public void display(){ for ( int i = 0 ; i < number; i++) { System.out.printf(array[i]+ " " ); } } public static void main(String[] args) { UseArray ua = new UseArray( 5 ); ua.insert( 1 ); ua.insert( 2 ); ua.insert( 6 ); ua.insert( 7 ); ua.insert( 3 ); ua.display(); if (ua.find( 5 ) != ua.number){ System.out.println( "find,the number index is " +ua.find( 5 )); } else { System.out.println( "not found!" ); } if (ua.delete( 5 )!= true ){ System.out.println( "can not delete!" ); } ua.display(); } } |
將整個數組封裝,用number代替數組的個數,插入數據的時候也不必理會往哪個下標插,當然,也可以自定義一個具體下標的方法。
方法比較簡單就不介紹了,但是存在的一個缺點在delete那里,其實只是從刪除元素開始的左移而已,所以,雖然number減少了,但是最后一個元素并沒有刪除掉,只是display輸出展示的時候隱藏了而已,但是,下次插入元素的時候新元素便會取代掉最后一個元素的位置。
3)查找優化——二分查找
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public int find( int value){ int start = 0 ; int end = number- 1 ; while (end>=start){ int index =(end + start)/ 2 ; if (array[index]==value){ return index; } else if (array[index] >value){ end = index- 1 ; } else { start = index+ 1 ; } } return number; } |
二分查找前提是數組已經有序。剛開始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)。
數組的缺點呢,就是大小固定,查找慢,如果你要經常查找百萬級別的數據,還會用數組嗎?不會的,所以數據結構的選用要結合具體的實際情況,達到最大的效率值。
以上所述是小編給大家介紹的Java數據結構之數組(動力節點之Java學院整理),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!