Java集合--数组
2017-09-06 本文已影响0人
Aruforce
1.简述
一个个独立的数据是没有任何意义的,可集合的可辨识的数据才有。数据的最基本的一种集合方式为数组。数组对于每一门编程语言来说都是重要的数据结构之一,Java 语言中提供的数组是用来存储固定大小的同类型元素。但是Java并未提供一个描述数组的类(类似于public class []<T>{} 这样的),为了便于操作数组而提供了一个工具类java.util.Arrays;
2.数组的数据结构
2.1一维数组
dataArray.jpg如上如图所示,int [] a = new int[10]。这是整型的集合,可简单依靠地址(index)去分别;按地址寻找的复杂度为O(1)按内容寻找的复杂度为O(n);
tip:需要补充内存的工作原理,数据结构及算法的知识了。
2.2多维数组
实际上并不存在多维数组,只是对一维数组的扩展。所有的高纬数组都可以看成是低一纬度的数组的数组;例如二维数组就可以看作一维数组的数组,依次类推。
3.数组的特征
3.1大小(length):
数组的容量,由于Java是边解释边执行,我们可以在代码编写时不指定数组的具体大小而是由代码的执行结果来来确定数组大小(C好像是不可以的,代码编写期间就必须制定数组的大小,这是大学时的记忆了还是谭浩强的,不知改了没改,不能动态的搞就太蛋疼了);
3.2下标(index);
从0开始到length-1结束,用于获取每个元素。
4.对数组的操作(排序及查找)
4.1 Arrays.asList(T... a)转换为ArrayList:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
4.2 Arrays.binarySearch(a, key) 二分查找:
对于已经排序的数组(从小到大的,不能有相同的值的)搜索某个元素的下标。
原理:取范围内下标在中间的值进行比较,然后不断选择合适范围,知道选出合适的值,个人实现代码如下:
public static int binarySearch(List<Comparable> objs,Comparable comp,int startIndex,int endIndex){
Object [] objArray = objs.toArray();
if(startIndex<0){
startIndex=0;
}
if(endIndex>objArray.length-1){
endIndex = objArray.length-1;
}
while (startIndex<=endIndex) {
int midIndex = (startIndex+endIndex)/2;
Comparable target = (Comparable)objArray[midIndex];
if(comp.compareTo(target)<0){//comp<target
endIndex = midIndex-1;
continue;
}
if(comp.compareTo(target)==0){//comp == target
return midIndex;
}
if(comp.compareTo(target)>0){//comp>target
startIndex = midIndex+1;
continue;
}
}
return -1;
}
4.3 Arrays.copyOf()数组拷贝:
底层调用的是 System.arraycopy(native final方法);
注意对于基本数据类型等常量值的拷贝是可以的,但是对于一般引用类型数据的拷贝只能拷贝引用的值,如下代码:
public class TestObject {
public static void main(String[] args) {
String [] src = new String [] {new String("0"),new String("1"),new String("2"),new String("3")};
String [] src2 = Arrays.copyOf(src, src.length);
src2[0]= new String("0000");//返回的是String Pool常量池的引用
System.out.println(src[0]);//0
Integer [] ints = new Integer[]{new Integer(0),new Integer(1),new Integer(2)};
Integer [] ints2 = Arrays.copyOf(ints, ints.length);
ints2[0] = new Integer(10);//返回的是Integer(10)Integer类常量池的引用
System.out.println(ints[0]);//0
Demo[] demo = new Demo[]{new Demo("0"),new Demo("1")};
Demo [] demo2 = Arrays.copyOf(demo, demo.length);
demo2[0].a="00000";
System.out.println(demo[0].a);//00000
int [] [] int2 = new int[2][2];
int2[0][0]=0;
int2[0][1]=1;
int2[1][0]=1;
int2[1][1]=2;
int [] [] int2s = Arrays.copyOf(int2, int2.length);
int2[0][0] = 10086;
System.out.println(int2[0][0]);//10086
}
}
class Demo{
String a;
public Demo() {
super();
}
public Demo(String a) {
super();
this.a = a;
}
}
5.数组的排序
这个打算在以后弄个专门的集合来搞这个内容,应该是个很大的工程。