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);
    }
}
Collection接口

 

以上是关于java 中 collection 和set ,list的主要内容,如果未能解决你的问题,请参考以下文章

java 中 collection 和set ,list

java集合类-Set接口

Java中的Collection和Set接口有啥区别?

JAVA Collection接口中List Map 和Set的区别(转)

java集合之Collection架构

Java 集合系列02之 Collection架构