java代码中Collection c = new ArrayList 为啥说比ArrayList c = new ArrayListy用法灵活?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java代码中Collection c = new ArrayList 为啥说比ArrayList c = new ArrayListy用法灵活?相关的知识,希望对你有一定的参考价值。

Collection 是ArrayList的父接口,如果用ArrayList c = new ArrayList();这种形式,那么c对象只能是一个ArrayList;如果用Collection c = new ArrayList();这种形式,那么c对象就还可能是Collection下的其他子类的对象,例如LinkedList等。针对c对象来说,前一种是不是更灵活?追问

在调用方法时,如何才体现具体的灵活性呀,能否举个具体的例子,我比较笨

追答

这个还真不好举例跟你说,我建议你去看看‘ 面向接口编程 ’的相关内容。我觉得主要的灵活性跟接口相关。

参考技术A 因为ArrayList 是Collection 的某个实现,而不代表Collection 的所有实现。也就是说Collection 包含了ArrayList 。而且一般不是用Collection c = new ArrayList 而是用List c = new ArrayList 参考技术B 这个就是java里面泛型的概念
Collection 是ArrayList的父类。因此可以通过这种方式来赋值。
将来如果不想用ArrayList了,那么可以用LinkList
Collection c = new LinkList

仅仅需要改这一个地方,别的地方代码都不需要修改
参考技术C 这是多态那一块的内容,定义的变量类型越抽象,越灵活。可以更容易的向下转型等等…… 仔细看看多态 参考技术D ArrayList实现了collection接口
如果感觉此容器不太适合操作时,可迅速的切换另外一种容器
ArrayList底层数据结构就是Object[]
如果对这个经常修改,还是更适合用LinkedList
如果你采用ArrayList c = new ArrayList
且下面使用了ArrayList的独有函数
你想改为其它数据结构时,够你改一会儿的追问

可是当c调用方法时,不是不能用ArrayList的方法麽

追答

那你可以使用它的子接口 List呀

java-Collection,List简单使用与方法/(集合使用-中)

1.1集合只存放引用类型的元素并且集合存放的时元素的引用(地址)
1.2新循环遍历集合
Collection c = new ArrayList();
c.add("one");
c.add("two");
c.add("three");
c.add("four");
/*
* 新循环不是新的语法,jvm并不认可新循环。
* 新循环是编译器认可的,当编译器发现在使用新循环遍历集合时,会将代码改变为使用迭代器遍历,所以使用新循环遍历集合的过程中是不能通过集合的方法增删元素的。
*
*/
for (Object object : c) {
String str = (String)object;
System.out.println(str);
}
1.3集合的操作
boolean addAll(collection c) 将给定的集合中的元素存入到当前集合中 当前集合元素发生了变化则返回true
boolean containsAll(Collection c) 判断当前集合是否包含给定集合中的所有元素
boolean removeAll(Collection c) 删除当前集合中与给定集合的相同元素
1.4遍历集合--集合提供统一的遍历元素的方式:迭代器模式
集合提供了用于获取遍历当前集合元素的方法:
java.util.Iterator
Iteartor iterator()迭代器的接口,规定了遍历集合的方法,遵循的模式为:问,取,删的步骤,其中删除元素不是必须操作。不同的集合实现类都提供了一个可以遍历自身的迭代器实现类。我们无需记住它们的名字,当他们的Iterator看待即可。
boolean hasNext()判断集合是否还有元素可以遍历
E next() 取出集合下一个可以遍历的元素
在使用迭代器遍历集合元素的过程中,不能通过集合的方法增删元素否则会引发迭代器遍历集合的异常,但是迭代器的remove能删除通过next方法取出的元素
1.5新循环--新循环又称为:增强for循环,for each,新循环的作用是用来遍历集合或数组-----新循环是JDK1.5之后推出的一个新特性
使用新循环遍历集合:新循环并非新的语法,JVM并不认可新循环。新循环是编译器认可的,当编译器发现在使用新循环遍历集合时,会将代码改变为使用迭代器遍历。所以使用新循环遍历集合的过程中是不能通过集合的方法增删元素的。如果在新循环中删除元素会抛出异常。
1.6泛型--1.5之后推出的一个特性,泛型是编译器认可泛型的实际类型是Object,在使用的时候编译器会进行检查或自动造型。当对泛型变量赋值时,编译器检查是否符合类型要求获取泛型值时,编译器会补充自动造型的代码。不指定泛型则默认认为object。泛型用来规定集合中的元素类型
1.7List_get_set--java.util.List
List是Collection的子类型接口。是可重复集,并且有序,提供了一套可以根据下标操作元素的方法。
常用实现类:
java.util.ArrayList:数组实现,查询效率高
java.util.LinkedList:链表实现,增删元素效率高尤其是首尾增删元素。
E get(int index) 将指定下标所对应的元素返回
E set(int index,E e) 将给定元素替换集合中指定位置的元素并将被替换元素返回。
1.8List_add_remove:List提供了一对重载的add,remove方法也可以通过下标操作元素删除方法会返回一个删除的元素。
1.9获取List子集:List<E> subList(int startindex,int endindex) 截取集合中指定位置的元素,并返回截取的元素;操作获取的子集的时候就等于操作原有集合
1.10集合转换为数组 ---Collection中提供了将当前集合转换为一个数组的方法
E[] array= c.toArray(new E[c.size()]);将集合转换为数组,传一个泛型数组并设置长度,如果设置长度不够也会返回一个刚好和元素相等的数组,如果参数长度大于原有数组,则返回输入长度的数组,没有元素的位置为null。
1.11数组转换为集合---List<String> list = Arrays.asList(array);将数组转化为集合,操作返回后的集合等于操作原来的数组,并且不能增删元素,如果想增加元素需要新建一个数组将返回数组的值传入并操作。
List<String> list1 = new ArrayList<String>(list);这个方法可以在创建新数组的同时将原有数组的元素添加进来。

 

我是初学者,如有更新不好的,欢迎这位大神指出,谢谢大家!

更多精彩以后更新,转载注明!











































以上是关于java代码中Collection c = new ArrayList 为啥说比ArrayList c = new ArrayListy用法灵活?的主要内容,如果未能解决你的问题,请参考以下文章

collection c = new arraylist();这句话啥意思?

JAVA这样的定义:Collection<String>n=new ArrayList<String>()与List<String>n=new ArrayList(

Java map Collection到Collection

JAVA 集合COLLECTION接口能NEW对象吗 ,接口不是不能实例化对象吗

java-Collection,List简单使用与方法/(集合使用-中)

JAVA-初步认识-常用对象API(集合框架-迭代器使用)