【Java】——数组、List和ArrayList、LinkedList 的区别

版权声明:未经过博主同意,不得随意转发 https://blog.csdn.net/weixin_40918067/article/details/82254236

【题目】

问题来源:List<QueryScriptManageEntity> list = new ArrayList<>();

本来想用的是 List<QueryScriptManageEntity> list = new List<>() 存储数据,结果ArrayList<>();能用,而list()不能用???

解析:

【例子】证明:数组索引速度、赋值或者修改快???——》内存中存储数据是连续的;

string[] s=new string[3];

//赋值

s[0]="p"; s[1]="m"; s[2]="s";

//修改

s[1]="p";

解析:

不足:

在数组俩个数据间插入数据麻烦;

声明数组时,还要申明数组的长度;

注意:

  1. 若长度过长会造成内存浪费,长度过短,会造成数据溢出的错误;
  2. ArrayList克服数组的种种缺陷;
  3. 声明ArrayList对象时并不需要指定它的长度;???——》它的大小是按照其中存储的数据来动态扩充和收缩的???——》ArrayList是.Net Framework提供的用于数据存储和检索的专用类;
  4. ArrayList很方便的进行数据的添加,插入和移除;???——》ArrayList继承了IList接口;

【例子】ArrayList继承了IList接口,例如:

ArrayList list = new ArrayList();

//新增数据

list.Add("abc"); list.Add(123);

//修改数据

list[2] = 345;

//移除数据

list.RemoveAt(0);

//插入数据

list.Insert(0, "hello world"

解析:

ArrayList中插入不同类型的数据是允许的;???——》ArrayList会把所有插入其中的数据都当作为object类型来处理;

在我们使用ArrayList中的数据来处理问题的时候,很可能会报类型不匹配的错误;???——》ArrayList不是类型安全的;

既使我们保证在插入数据的时候都很小心,都有插入了同一类型的数据,但在使用的时候,我们也需要将它们转化为对应的原类型来处理。这就存在了装箱与拆箱的操作,会带来很大的性能损耗;

装箱与拆箱的概念

装箱???——》将值类型的数据打包到引用类型的实例中;

【例子】将int类型的值123赋给object对象o;

int i=123; 

object o=(object)i;

拆箱???——》从引用数据中提取值类型

【例子】将object对象o的值赋给int类型的变量i;

object o=123; 

int i=(int)o;

           

装箱与拆箱的过程;???——》损耗性能的;

List类是ArrayList类的泛型等效类???——》因为ArrayList存在不安全类型与装箱拆箱的缺点,所以在C#2.0后出现了泛型的概念;

List类的大部分用法都与ArrayList相似???——》List类也继承了IList接口;

最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型;

List<int> list = new List<int>();

//新增数据

list.Add(123);

//修改数据

list[0] = 345;

//移除数据

list.RemoveAt(0);

解析:

  1. List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造;
  2. ArrayList是List的实现类;???——》List是一个接口,不能实例化对象的;
  3. 实例化的ArrayList对象的引用会自动向上转型为List,这是多态的用法之一。
List list; //正确 list=null;

List list=new List(); // 是错误的用法

List list = new ArrayList();

解析:

  • “List list = new ArrayList();” ??——》这句创建了一个ArrayList的对象后,并上溯到了List;
  • 此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,所以它就不能再用了;
  • “ArrayList list=new ArrayList();”???——》创建一对象则保留了ArrayList的所有属性;

List泛型的好处???——》

  1. 通过允许指定泛型类或方法操作的特定类型,泛型功能将类型安全的任务从您转移给了编译器;
  2. 不需要编写代码来检测数据类型是否正确,因为会在编译时强制使用正确的数据类型;
  3. 减少了类型强制转换的需要和运行时错误的可能性;
  4. 泛型提供了类型安全但没有增加多个实现的开销;

ArrayList 和 LinkedList 有什么区别。

ArrayList和LinkedList都实现了List接口,有以下的不同点:

  1. ArrayList是基于索引的数据接口,它的底层是数组;它可以以O(1)时间复杂度对元素进行随机访问;与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n);
  2. 相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引;
  3. LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素;

大家给个赞,就是给我最大的鼓励!!!

注意:“赞”位于右上角;

猜你喜欢

转载自blog.csdn.net/weixin_40918067/article/details/82254236