java数据结构-数组

1 数组的使用 java

声明数组:就是告诉计算机数组的类型是什么。有两种形式:int[] array、int array[]。数组

分配空间:告诉计算机须要给该数组分配多少连续的空间,记住是连续的。array = new int[10];dom

赋值:赋值就是在已经分配的空间里面放入数据。array[0] = 1 、array[1] = 2……其实分配空间和赋值是一块儿进行的,也就是完成数组的初始化。有以下三种形式:工具

int a[] = new int[2]; //默认为0,若是是引用数据类型就为null
int b[] = new int[] {1,2,3,4,5};
int c[] = {1,2,3,4,5};

操做:就是对数组元素进行操做。经过数组名+有效的下标来确认数据。性能

2 数组底层spa

数组底层:普通的java类是以全限定路径名+类名来做为本身的惟一标示的,而数组则是以若干个[+L+数组元素类全限定路径+类来最为惟一标示的。
这个不一样也许在某种程度上说明了数组也普通java类在实现上存在很大的区别,也许能够利用这个区别来使得JVM在处理数组和普通java类时做出区分。

Object[]: class [Ljava.lang.Object; (一维数组)
Object: class java.lang.Object; (普通类)code

3 数组性能对象

 一组数据进行求和运算,可将这些数据放到一个数组中,遍历加和,也可将这些数据放到一个list中,遍历求和,数组的性能显而易见。blog

4 数组长度问题ci

数组是定长的,一旦初始化声明后是不可改变长度的。那么如何来实现变长数组呢?咱们能够利用List集合add方法里面的扩容思路来模拟实现。下面是ArrayList的扩容方法:

 1  public void ensureCapacity(int minCapacity) {  2         modCount++;  3         int oldCapacity = elementData.length;  4         /**
 5  * 若当前须要的长度超过数组长度时进行扩容处理  6          */
 7         if (minCapacity > oldCapacity) {  8             Object oldData[] = elementData;  9             int newCapacity = (oldCapacity * 3) / 2 + 1;    //扩容
10             if (newCapacity < minCapacity) 11                 newCapacity = minCapacity; 12             //拷贝数组,生成新的数组
13             elementData = Arrays.copyOf(elementData, newCapacity); 14  } 15     }

5 数组转化为list须要注意的地方

asList() 方法是Arrays的静态方法,能够将数组转化为List

public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}

注意这个参数:T…a,这个参数是一个泛型的变长参数,咱们知道基本数据类型是不可能泛型化的,也是就说8个基本数据类型是不可做为泛型参数的。
可是若是将基本类型的数组转换为List也是不会报错的。由于,在传入参数的时候,是数组,数组在java 中会被当作对象,而对象是能够泛型的。
因此咱们的程序是把一个int型的数组做为了T的类型,因此在转换以后List中就只会存在一个类型为int数组的元素了。固然若是将int改成Integer,则长度就会变成5了。

当数组装换成List 时,这个list 并非java.util.ArrayList 而是Arrays工具类的一个内部类:
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
/** 省略方法 **/
}

这个内部类ArrayList并无提升add的实现方法。在ArrayList中,它主要提供了以下几个方法:

一、size:元素数量

二、toArray:转换为数组,实现了数组的浅拷贝。

三、get:得到指定元素。

四、contains:是否包含某元素。

因此综上所述,asList返回的是一个长度不可变的列表。数组是多长,转换成的列表是多长,咱们是没法经过add、remove来增长或者减小其长度的。

相关文章
相关标签/搜索