数组的用处是什么呢?——当你需要将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学院整理),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!