问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么是List list = new ArrayList,而不直接用ArrayList

发布网友 发布时间:2022-04-24 22:13

我来回答

3个回答

热心网友 时间:2023-10-12 22:31

面向接口编程思想。


首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。或者说,它是面向对象编程体系中的思想精髓之一。


// 1.这样你就只能调用List接口里面定义好的方法,而不能使用你自己在ArrayList扩展的方法。
     List list = new ArrayList();
     
// 2.这样你可以使用自己在ArrayList类上扩展的方法
    ArrayList list = new ArrayList();
// 接口就是定义了一些行为,它要求你应该做什么。
// 假如你采用了面向接口编程方式,也就是第一种方式:List list = new ArrayList();
// 就能通过接口很大限度上规范开发人员的实现规则,因为你现在只能调用接口的方法。

热心网友 时间:2023-10-12 22:31

List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了List。
List list = new
ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是
List没有的属性和方法,它就不能再用了。而ArrayList list=new
ArrayList();创建一对象则保留了ArrayList的所有属性。

为什么一般都使用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢?

题就在于List有多个实现类,如
LinkedList或者Vector等等,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类呢?,这时你只要改变这一行就行
了:List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。假设你开始用 ArrayList
alist = new ArrayList(), 这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。
,如果没有特别需求的话,最好使用List list = new LinkedList(); ,便于程序代码的重构. 这就是面向接口编程的好处

热心网友 时间:2023-10-12 22:32

1、什么是ArrayListArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素实现了ICollection和IList接口灵活的设置数组的大小2、如何使用ArrayList最简单的例子:ArrayListList=newArrayList();for(inti=0;i<10;i++)//给数组增加10个Int元素List.Add(i);//..程序做一些处理List.RemoveAt(5);//将第6个元素移除for(inti=0;i<3;i++)//再增加3个元素List.Add(i+20);Int32[]values=(Int32[])List.ToArray(typeof(Int32));//返回ArrayList包含的数组这是一个简单的例子,虽然没有包含ArrayList所有的方法,但是可以反映出ArrayList最常用的用法3、ArrayList重要的方法和属性1)构造器ArrayList提供了三个构造器:publicArrayList();默认的构造器,将会以默认(16)的大小来初始化内部的数组publicArrayList(ICollection);用一个ICollection对象来构造,并将该集合的元素添加到ArrayListpublicArrayList(int);用指定的大小来初始化内部的数组2)IsSynchronized属性和ArrayList.Synchronized方法IsSynchronized属性指示当前的ArrayList实例是否支持线程同步,而ArrayList.Synchronized静态方法则会返回一个ArrayList的线程同步的封装。如果使用非线程同步的实例,那么在多线程访问的时候,需要自己手动调用lock来保持线程同步,例如:ArrayListlist=newArrayList();//lock(list.SyncRoot)//当ArrayList为非线程包装的时候,SyncRoot属性其实就是它自己,但是为了满足ICollection的SyncRoot定义,这里还是使用SyncRoot来保持源代码的规范性{list.Add(“AddaItem”);}如果使用ArrayList.Synchronized方法返回的实例,那么就不用考虑线程同步的问题,这个实例本身就是线程安全的,实际上ArrayList内部实现了一个保证线程同步的内部类,ArrayList.Synchronized返回的就是这个类的实例,它里面的每个属性都是用了lock关键字来保证线程同步。3)Count属性和Capacity属性Count属性是目前ArrayList包含的元素的数量,这个属性是只读的。Capacity属性是目前ArrayList能够包含的最大数量,可以手动的设置这个属性,但是当设置为小于Count值的时候会引发一个异常。4)Add、AddRange、Remove、RemoveAt、RemoveRange、Insert、InsertRange这几个方法比较类似Add方法用于添加一个元素到当前列表的末尾AddRange方法用于添加一批元素到当前列表的末尾Remove方法用于删除一个元素,通过元素本身的引用来删除RemoveAt方法用于删除一个元素,通过索引值来删除RemoveRange用于删除一批元素,通过指定开始的索引和删除的数量来删除Insert用于添加一个元素到指定位置,列表后面的元素依次往后移动InsertRange用于从指定位置开始添加一批元素,列表后面的元素依次往后移动另外,还有几个类似的方法:Clear方法用于清除现有所有的元素Contains方法用来查找某个对象在不在列表之中其他的我就不一一累赘了,大家可以查看MSDN,上面讲的更仔细5)TrimSize方法这个方法用于将ArrayList固定到实际元素的大小,当动态数组元素确定不在添加的时候,可以调用这个方法来释放空余的内存。6)ToArray方法这个方法把ArrayList的元素Copy到一个新的数组中。4、ArrayList与数组转换例1:ArrayListList=newArrayList();List.Add(1);List.Add(2);List.Add(3);Int32[]values=(Int32[])List.ToArray(typeof(Int32));例2:ArrayListList=newArrayList();List.Add(1);List.Add(2);List.Add(3);Int32[]values=newInt32[List.Count];List.CopyTo(values);上面介绍了两种从ArrayList转换到数组的方法例3:ArrayListList=newArrayList();List.Add(“string”);List.Add(1);//往数组中添加不同类型的元素object[]values=List.ToArray(typeof(object));//正确string[]values=(string[])List.ToArray(typeof(string));//错误和数组不一样,因为可以转换为Object数组,所以往ArrayList里面添加不同类型的元素是不会出错的,但是当调用ArrayList方法的时候,要么传递所有元素都可以正确转型的类型或者Object类型,否则将会抛出无法转型的异常。5、ArrayList最佳使用建议这一节我们来讨论ArrayList与数组的差别,以及ArrayList的效率问题1)ArrayList是Array的复杂版本ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。2)内部的Object类型的影响对于一般的引用类型来说,这部分的影响不是很大,但是对于值类型来说,往ArrayList里面添加和修改元素,都会引起装箱和拆箱的操作,频繁的操作可能会影响一部分效率。但是恰恰对于大多数人,多数的应用都是使用值类型的数组。消除这个影响是没有法的,除非你不用它,否则就要承担一部分的效率损失,不过这部分的损失不会很大。3)数组扩容这是对ArrayList效率影响比较大的一个因素。每当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。例1:比如,一个可能有200个元素的数据动态添加到一个以默认16个元素大小创建的ArrayList中,将会经过:16*2*2*2*2=256四次的扩容才会满足最终的要求,那么如果一开始就以:ArrayListList=newArrayList(210);的方式创建ArrayList,不仅会减少4次数组创建和Copy的操作,还会减少内存使用。例2:预计有30个元素而创建了一个ArrayList:ArrayListList=newArrayList(30);在执行过程中,加入了31个元素,那么数组会扩充到60个元素的大小,而这时候不会有新的元素再增加进来,而且有没有调用TrimSize方法,那么就有1次扩容的操作,并且浪费了29个元素大小的空间。如果这时候,用:ArrayListList=newArrayList(40);那么一切都解决了。所以说,正确的预估可能的元素,并且在适当的时候调用TrimSize方法是提高ArrayList使用效率的重要途径。4)频繁的调用IndexOf、Contains等方法(Sort、BinarySearch等方法经过优化,不在此列)引起的效率损失首先,我们要明确一点,ArrayList是动态数组,它不包括通过Key或者Value快速访问的算法,所以实际上调用IndexOf、Contains等方法是执行的简单的循环来查找元素,所以频繁的调用此类方法并不比你自己写循环并且稍作优化来的快,如果有这方面的要求,建议使用Hashtable或SortedList等键值对的集合。ArrayListal=newArrayList();al.Add("How");al.Add("are");al.Add("you!");al.Add(100);al.Add(200);al.Add(300);al.Add(1.2);al.Add(22.8);//第一种遍历ArrayList对象的方法foreach(objectoinal){Console.Write(o.ToString()+"");}//第二种遍历ArrayList对象的方法IEnumeratorie=al.GetEnumerator();while(ie.MoveNext()){Console.Write(ie.Curret.ToString()+"");}//第三种遍历ArrayList对象的方法我忘记了,好象是利用ArrayList对象的一个属性,它返回一此对象中的元素个数.然后在利用索引for(inti=0;i
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 谁知道初一下英语期末卷子 华为交换机web管理用哪个版本的ie浏览器最好 AddANewHardDisk什么意思 为什么有的多肉有香味 有香味多肉有哪些? 哪些多肉有比较浓香味 请问多肉的香味有助于睡眠吗? 多肉有香味会不会闻了中毒? 多肉的香味有利于睡眠吗? 日照市区内有多少万人口? 日照属于县级市? 山东日照市东港区的邮编是多少? 日照市的面积和人口是多少啊? 三十年前日照是县区吗?归哪个市? 日照市行政区域规划 日照市级行政区怎么填 日照市有几个区和县? 日照的市区是哪里? 山东日照,日照市有几个区 闭上眼睛一想,日照市近年只有两个大新闻,一是市直三区的大面积官房,旁边楼盘八千左右,三区三千五, 大一期末Java作业不会做,有兴趣的朋友帮下忙!!谢谢 初一下册英语期末测试题 拖鞋搭配黑丝很土吗? 夏天穿黑丝连裤袜船鞋逛街,回家换拖鞋还要脱丝袜吗? 冬天穿厚黑丝连裤袜逛街,回家换拖鞋(棉拖)还要脱丝袜吗? 凉鞋可以配丝袜吗 各位穿连裤袜的姐妹们,你们有没在下雨天穿拖鞋的经历?仅限女生回答 白裙子黑丝袜配什么色的凉鞋比较好看 为什么在我们公司女员工可以穿凉鞋和拖鞋,男的就不行? 我那个穿黑丝的女生到底叫什么 像鸡眼一样肉里面有黑头发一样的黑丝是什么 女友得脚气 写一篇关于运动鞋布鞋拖鞋高跟鞋的作文三百字 女生在外人面前穿拖鞋约会,情侣到深吻吗? 冬天穿棉拖脚出汗,是怎么回事? 笔记本电脑异常发热的原因(风扇,CPU正常) 笔记本异常发热怎么办? 笔记本电脑异常声音? 笔记本电脑发热不正常怎么办? 笔记本电脑出现应用程序发生异常如何解决