打字猴:1.70044394e+09
1700443940
1700443941 //赋值index位置元素
1700443942
1700443943 elementData[index]=element;
1700443944
1700443945 //列表长度+1
1700443946
1700443947 size++;
1700443948
1700443949 }
1700443950
1700443951 注意看arraycopy方法,只要是插入一个元素,其后的元素就会向后移动一位,虽然arraycopy是一个本地方法,效率非常高,但频繁的插入,每次后面的元素都要拷贝一遍,效率就变低了,特别是在头位置插入元素时。现在的问题是,开发中确实会遇到要插入元素的情况,那有什么更好的方法解决此效率问题吗?
1700443952
1700443953 有,使用LinkedList类即可。我们知道LinkedList是一个双向链表,它的插入只是修改相邻元素的next和previous引用,其插入算法(add方法)如下:
1700443954
1700443955 public void add(int index, E element){
1700443956
1700443957 addBefore(element,(index==size?header:entry(index)));
1700443958
1700443959 }
1700443960
1700443961 这里调用了私有addBefore方法,该方法实现了在一个元素之前插于元素的算法,代码如下:
1700443962
1700443963 private Entry<E>addBefore(E e, Entry<E>entry){
1700443964
1700443965 //组装一个新节点,previous指向原节点的前节点,next指向原节点
1700443966
1700443967 Entry<E>newEntry=new Entry<E>(e, entry, entry.previous);
1700443968
1700443969 //前节点的next指向自己
1700443970
1700443971 newEntry.previous.next=newEntry;
1700443972
1700443973 //后节点的previous指向自己
1700443974
1700443975 newEntry.next.previous=newEntry;
1700443976
1700443977 //长度+1
1700443978
1700443979 size++;
1700443980
1700443981 //修改计数器+1
1700443982
1700443983 modCount++;
1700443984
1700443985 return newEntry;
1700443986
1700443987 }
1700443988
1700443989 这是一个典型的双向链表插入算法,把自己插入到链表,然后再把前节点的next和后节点的previous指向自己。想想看,这样一个插入元素(也就是Entry对象)的过程中,没有任何元素会有拷贝过程,只是引用地址改变了,那效率当然就高了。
[ 上一页 ]  [ :1.70044394e+09 ]  [ 下一页 ]