Collection接口详解

在Java集合类框架中提供了两大核心接口:Collection接口和Map接口,这两个接口是相对独立的。

Collection接口的操作形式与之前编写链表的操作形式类似,每一次进行数据操作的时候只对单个对象进行处理。
Collection接口是单个集合保存的最大父接口。

定义:

public interface Collection<E> extends Iterable<E>

JDK1.5之后Collection追加有泛型,避免了ClassCastException,里面所有保存的数据应该是相同的。

当然,在开发过程中,我们还是很少会直接使用Collection接口,因为Collection接口只是一个存储数据的标准,并不能区分存储类型。

所以它有两个子接口:List接口和Set接口,继承关系如下:
在这里插入图片描述
Collection中两个重要的方法add()和iterator(),子接口中都有

List接口

在实际开发过程中,List的使用频率可以达到Collection使用的80%,在进行集合处理的时候优先考虑List。

List接口有两个重要的扩充方法,如下:

在这里插入图片描述
List接口与Collection接口相比最大的特点就在于,List接口有一个get()方法,可以根据索引获取值,由于List本身还是接口,要对它进行实例化,就要用到子类。List有三个子类:ArrayList,Vector,LinkedList,结构如下:
在这里插入图片描述

ArrayList子类(优先考虑)

通过代码来看一下ArrayList的一些方法:

public class TestArrayList {
    public static void main(String[] args) {
        List<String > list=new ArrayList<String>();
        list.add("hello");
        //重复元素
        list.add("hello");
        list.add("Java");
        System.out.println("集合大小为:"+list.size()+" 集合是否为空:"+list.isEmpty());
        for (int i=0;i<list.size();i++){
            //get()方法
            System.out.println(list.get(i));
        }
        System.out.println("删除hello后");
        list.remove("hello");
        System.out.println("集合大小为:"+list.size()+" 集合是否为空:"+list.isEmpty());
        for (int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
        System.out.println(list.contains("hello"));
        System.out.println(list.contains("ABC"));
		System.out.println(list);
    }
}

在这里插入图片描述
通过上述代码我们可以发现,List允许保存重复数据。另外,get()方法是List子接口提供的。如果现在操作的是Collection接口,那么对于此时的数据取出只能够将集合变为对象数组操作。如下:

   Collection<String > list=new ArrayList<String>();
        list.add("hello");
        list.add("hello");
        list.add("Java");
        // 操作以Object为主,有可能需要向下转型,就有可能产生ClassCastException
        Object[] objects=list.toArray();
        System.out.println(Arrays.toString(objects));

在这里插入图片描述
用Collection接口很容易产生ClassCastException异常,因此在开发过程中尽量少用。

Vector子类(旧的子类,使用较少)

Vector是从JDK1.0提出的,而ArrayList是从JDK1.2提出的。
用例:

List<String > list=new Vector<String>();
        list.add("hello");
        list.add("hello");
        list.add("Java");
        System.out.println(list);

在这里插入图片描述
ArrayList和Vector的区别

历史时间:ArrayList是从JDK1.2提出的,Vector是从JDK1.0提出的
处理形式:ArrayList是异步处理,性能较高,而Vector是同步处理,性能较低
数据安全:ArrayList是线程不安全的,而Vector是线程安全的。
输出形式:ArrayList支持Iterator、ListIterator、foreach;Vector支持Iterator、ListIterator、foreach、Enumeration。

LinkedList子类

范例

package www.bit.java.test;
import java.util.LinkedList;
import java.util.List;
public class TestDemo {
public static void main(String[] args) {
List<String> list = new LinkedList<>() ;
list.add("hello") ;
list.add("hello") ;
list.add("bit") ;
System.out.println(list) ;
list.remove("hello") ;
System.out.println(list) ;
}
}

ArrayList和LinkedList的区别

  1. 观察ArrayList源码,可以发现ArrayList里面存放的是一个数组,如果实例化此类对象时传入了数组大
    小,则里面保存的数组就会开辟一个定长的数组,但是后面再进行数据保存的时候发现数组个数不够了
    会进行数组动态扩充。 所以在实际开发之中,使用ArrayList最好的做法就是设置初始化大小。
  2. LinkedList:是一个纯粹的链表实现,与之前编写的链表程序的实现基本一样(人家性能高)。

ArrayList封装的是数组;LinkedList封装的是链表。ArrayList时间复杂度为1,而LinkedList的复杂度为
n。

Set接口

Set接口和List接口的最大区别在于Set接口中的内容是不允许重复的,并且Set接口并没有对Collection接口进行扩充,而List接口对Collection接口扩充了。因此Set接口中没有get()方法。

Set也有两个子接口:HashSet(无序存储)TreeSet(有序存储)
在这里插入图片描述

HashSet子类

看一段代码:

 Set<String> set=new HashSet<String>();
        set.add("hello");
        set.add("hello");
        set.add("Java");
        System.out.println(set);

在这里插入图片描述
可以发现:结果只有一个hello,而且输出的顺序是无序的。

TreeSet子类

使用范例:

   Set<Integer> set=new TreeSet<Integer>();
        set.add(1);
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(4);
        set.add(5);
        System.out.println(set);

在这里插入图片描述
可以看到,TreeSet同样不允许重复,输出的结果是有序的,并且是升序的。
对象判断必须两个方法equals()、hashCode()返回值都相同才判断为相同

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章