一、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;
}
}