arraylist和linkedlist的区别和使用场景

一、arraylist和linkedlist的区别和使用场景

1、ArrayList是基于数组实现的,其构造函数为:

private transient Object[] elementData;

private int size;

ArryList初始化时,elementData数组大小默认为10;

每次add()时,先调用ensureCapacity()保证数组不会溢出,如果此时已满,会扩展为数组length的1.5倍+1,然后用array.copy的方法,将原数组拷贝到新的数组中;

ArrayList线程不安全,Vector方法是同步的,线程安全;

2、LinkedList是基于双链表实现的:

Object element;

Entry next,

previous;

初始化时,有个header Entry,值为null;

使用header的优点是:在任何一个条目(包括第一个和最后一个)都有一个前置条目和一个后置条目,因此在LinkedList对象的开始或者末尾进行插入操作没有特殊的地方;

使用场景:

(1)如果应用程序对各个索引位置的元素进行大量的存取或删除操作,ArrayList对象要远优于LinkedList对象;

( 2 ) 如果应用程序主要是对列表进行循环,并且循环时候进行插入或者删除操作,LinkedList对象要远优于ArrayList对象;

二、一维数组中有n个元素,读取第i个数组元素的平均时间复杂度。

一般存储器都是按地址寻访的,访问任意地址时间相同。故你这个问题,我个人感觉如非要算时间复杂度,就是o(1)把。。。(不敢确定,个人想法,仅供参考)

三、C#和Matlab数据处理

在c#中没有这样的命令

此时的x在c#中应该称为数组,可以使用for循环进行数组赋值

对于实现这种操作 c#中有一种动态数组技术 可以实现数组动态扩展

具体如下:

1. arraylist al=new arraylist( capacity );

2. //初始容量capacity也是可以不写的

原因就是即使不在初识化确定容量,容量不够的时候,会自动的按倍数作扩充。

c#动态数组的常用属性

◆capacity:获取或设置arraylist可包含的元素数。

◆count:获取arraylist 中实际包含的元素数。

◆isreadonly:获取一个值,该值表示arraylist是否为只读。

◆item:获取或设置指定索引处的元素。

c#动态数组的常用方法

◆增加元素-arraylist.add(value);利用add方法增加集合元素值,我们也可以索引增加元素 arraylist[index]=value;

◆插入元素-arraylist.insert(index,value);将元素的值 value,插入到第index位置。

◆删除元素-arraylist.clear(); 全部删除集合中的元素

◆arraylist.remove(value);按照集合元素值删除元素

◆arraylist.removeat(index);按照集合的元素索引删除元素

◆缩减容量 -arraylist.trimtosize();将集合的容量减少到实际元素个数的大小

四、java数组的相关操作

1.在Java 中所有的数组都在一个缺省的属性Length,用于获取数组中元素的个数.

2.数组的复制System.arraycopy()

3.数组的排序Arrays.sort()

4.在已排序的数组中查找某个元素Arays.binarySearch()*/

import java.util.Arrays; //对数组排序时要导入此包.

class ArrayTest

{

public static void main(String[] args)

{

/*int [] num1=new int [] {1,2,3};

int [] num2=new int [3];

System.arraycopy(num1,0,num2,0,num1.length);

for(int i=0;i<num2.length;i++)

{

System.out.println(num2[i]);

}*/

//对象数组的copy

/*Point [] pts1=new Point []{ new Point(1,1),new Point(2,2),new Point(3,3)};

Point [] pts2=new Point[3];

System.arraycopy(pts1,0,pts2,0,pts1.length);

for(int i=0;i<pts1.length;i++)

{

System.out.println(x=+pts1[i].x+,+y=+pts1[i].y);

}

pts2[2].x=6;//对pts1[2].x也进行了修改.

pts2[2].y=6;//对pts1[2].y也进行了修改.

System.out.println(x=+pts1[2].x+,+y=+pts1[2].y);*/

//数组的排序

/*int [] num=new int []{3,1,2};

Arrays.sort(num);

for (int i=0;i<num.length;i++)

{

System.out.println(num[i]);

}

int index=Arrays.binarySearch(num,3);

System.out.println(index=+index);

System.out.println(element=+num[index]);*/

Student [] st=new Student[]{new Student(1,zhangsan),

new Student(2,lisi),

new Student(3,wangwu),

new Student(3,mybole)};

Arrays.sort(st);

for(int i=0;i<st.length;i++)

{

System.out.println(st[i]);

}

}

}

//要对对象进行排序必须实现comparable接口

class Student implements Comparable

{

int num;

String name;

Student(int num,String name)

{

this.num=num;

this.name=name;

}

//重写toString方法

public String toString()

{

return number=+num+,+name=+name;

}

public int compareTo(Object o)//覆盖Comparable中的CompareTo方法.

{

Student s=(Student)o;

//return num>s.num?1:(num==s.num?0:-1);

int rusult=num>s.num?1:(num==s.num?0:-1); //在num相同时,对name进行排序.

if(0==rusult)

{

rusult=name.compareTo(s.name);//对于比较字符类型的,在String类中已经重写的compareTo方法,可以直接使用.

}

return rusult;

}

}

class Point

{

int x,y;

Point(int x,int y)

{

this.x=x;

this.y=y;

}

}