java 中 collection 和set ,list
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 中 collection 和set ,list相关的知识,希望对你有一定的参考价值。
这个 Collection是set和list的父接口,他们是怎么样的关系呢,那个 add方法是collection中的的?collection是抽象类,那这个add()岂不是在ArrayList实现的时候被重写?collection c=new ArrayList():
ArrayList C =new Arraylist();在实际应用的区别在哪?
add方法是collection,但是set和list在实现collection接口时都有重写该方法,set和list的add方法不同就是最好的证明。
api中有写到“如果 set 中尚未存在指定的元素,则添加此元素(可选操作)。更确切地讲,如果此 set 没有包含满足
(e==null ? e2==null : e.equals(e2)) 的元素 e2,则向该 set 中添加指定的元素
e。如果此 set 已经包含该元素,则该调用不改变此 set 并返回 false。结合构造方法上的限制,这就可以确保 set
永远不包含重复的元素。 ” 简单来说就是set中不会重复添加相同的元素,而list却可以。collection是个接口,并不是抽象类,而arraylist这个非抽象类实现了collection这个接口,肯定是要重写接口中的方法,所以add方法肯定是被重写的。对于最后一个问题,两者的区别再来看2张图片。
显然collection c=new ArrayList():中的c对象能够使用的方法只是来自Collection中所有的,对于arraylist这个类所特有的方法它是不具备的,也是不可以使用的。所以ArrayList C =new Arraylist()中的C对象要明显多了许多方法。一般我们都采用collection c=new ArrayList():这种写法是因为面向接口的编程对于日后的更改会更方便,举个例子,如果以后把collection c=new ArrayList():改成=new HashSet();后面的代码是不需要做任何变动的,因为c所用的方法是类从collection继承的,而如果ArrayList C =new Arraylist()改成HashSet C= new HashSet();的话,后面代码可能要做很大的变动,毕竟ArrayList类中存在的方法HashSet类中不一定有。
//楼主看我这么辛苦作答,要是觉得大体满意就采纳呗。
参考技术A add是要重写的collection c=new ArrayList():
ArrayList C =new Arraylist();
写法一般使用上,没区别,但是想直接使用c变量来执行ArrayList的方法,就不行。
这样的好处是通用、方便有的方法作重载。 参考技术B 1.collection是接口里面的方法都是抽象方法的,但接口跟抽象类不一样的.(LZ不清楚可追问,我补充)
2.collection和List都是接口,所以方法都是抽象方法,没有方法体的,所以方法的实现都在Arraylist里面.
3.至于实际应用的区别按照业务需求的不同而不同,不能一概而论.例如,你做了一个项目要用到List集合(ArrayList C =new Arraylist()),但做到一半的时候发现数据里不能出现重复元素,用set比较合适,这时候你改起来就非常麻烦.因为可能已经涉及到很多类,而且实际开发当中都是好几个人一起开发的,如果别人已经调用的集合,你一改动别人的代码也是跟着改动,如果一开始你是用的就是多态的方式,改动就时候只需改实例化(就是
collection c=new ArrayList():
)就行了其他就不用改动,因为别人拿到的只是接口的实现对象,至于你实现的是List还是set,对调用者来说都没区别,因为他只能用接口中的共有方法,这样就大大减少耦合性,也方面了开发. 参考技术C 这里有一个非常重要的概念叫做面向接口编程http://baike.baidu.com/link?url=Uh-UEl_4gv2oi0Uc1CmRokLDPSyvQMrqzuvfwwb7s5K7zNj962b4ng9eSg4yc05l2z_GvW1V1LrpKfL6gEyAnq
对于谁重写谁建议查api,多看看什么都明白了
java集合之Collection架构
Java集合之Collection架构
首先,我们对Collection进行说明。下面先看看Collection的一些框架类的关系图:
Collection是一个接口,它主要的两个分支是:List 和 Set。List和Set都是接口,它们继承于Collection。List是有序的队列,List中可以有重复的元素;而Set是数学概念中的集合,Set中没有重复元素!List和Set都有它们各自的实现类。 如ArrayList LinkedList Vector Stack
为了方便,我们抽象出了AbstractCollection抽象类,它实现了Collection中的绝大部分函数;这样,在Collection的实现类中,我们就可以通过继承AbstractCollection省去重复编码。
AbstractList和AbstractSet都继承于AbstractCollection,具体的List实现类继承于AbstractList,而Set的实现类则继承于AbstractSet。
另外,Collection中有一个iterator()函数,它的作用是返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合。ListIterator是List接口所特有的,在List接口中,通过ListIterator()返回一个ListIterator对象。 接下来,我们看看各个接口和抽象类的介绍;然后,再对实现类进行详细的了解。
接下来我们来看Collection接口:
package java.util; import java.util.function.Predicate; import java.util.stream.Stream; import java.util.stream.StreamSupport; /** *继承了Iterable接口,Iterable是一个迭代器接口,里面有返回迭代器的抽象方法 */ public interface Collection<E> extends Iterable<E> { int size();//返回集合元素个数 boolean isEmpty();//是否为空 boolean contains(Object o);//集合中是否存在这个对象 Iterator<E> iterator();//从Iterable中继承而来 Object[] toArray();//将集合转换为object数组 <T> T[] toArray(T[] a);//将集合转换特定类型的数组 boolean add(E e);//添加 boolean remove(Object o);//删除 boolean containsAll(Collection<?> c);//本集合是否和参数集合相同 boolean addAll(Collection<? extends E> c);//添加一个集合 boolean removeAll(Collection<?> c);//删除本集合中所有参数集合中元素 boolean retainAll(Collection<?> c);//retain保留 void clear();//清空 boolean equals(Object o);//Object中方法 int hashCode();//hash函数 default boolean removeIf(Predicate<? super E> filter) {//如果有就删除,接口默认实现 Objects.requireNonNull(filter); boolean removed = false; final Iterator<E> each = iterator(); while (each.hasNext()) { if (filter.test(each.next())) { each.remove(); removed = true; } } return removed; } @Override default Spliterator<E> spliterator() { return Spliterators.spliterator(this, 0); } default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); } default Stream<E> parallelStream() { return StreamSupport.stream(spliterator(), true); } }
以上是关于java 中 collection 和set ,list的主要内容,如果未能解决你的问题,请参考以下文章