黑马程序员——JAVA基础----------集合框架(一)----list接口

时间:2022-03-25 12:00:59

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——

一、集合框架

在实际开发中,我们经常会对一组相同类型的数据进行统一管理操作。通常通过数组结构、链表结构、二叉树结构来实现。
数组的最大问题在于数组中的元素个数是固定的,实现动态数组,比较麻烦。自己实现链表或二叉树结构来管理对象更是不方便。
因此,集合出现了。
集合中分为三大接口:
Collection、Map、Iterator
集合框架的接口和类在java.util包中

集合框架结构图如下:
黑马程序员——JAVA基础----------集合框架(一)----list接口

二、Collection接口

Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为collection 的元素。一些collection 允许有重复的元素,而另一些则不允许。一些collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何实现:它提供更具体的子接口(如Set 和 List)实现。此接口通常用来传递collection ,并在需要最大普遍性的地方操作这些 collection 。

接口的定义:

public interface Collection<E>extends Iterable<E>

三、List 接口

public interface List<E> extends Collection<E>

有序的Collection(序列)。此接口的用户可以对列表中的每个元素的插入位置进行精确的控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。其下有ArrayList、LinkedList、Vector 子类。

1、ArrayList

public class ArrayList<E> extends AbstractList<E> implements List<E>,RandomAccess,Cloneable,Serializable

ArrayList 集合默认容量大小为10,每次扩容为原容量的1.5倍,并允许包括 null 在内的所有元素,ArrayList 集合是有序的,底层是通过数组结构实现,可通过索引找到元素。

2、LinkedList

public class LinkedList<E> extends AbstractList<E> implements List<E>,Deque<E>,Cloneable,Serializable

LinkdedList 集合默认容量大小为10,每次扩容为原容量的2倍,并允许包括 null 在内的所有元素 ,LinkedList 集合底层是通过链表结构实现,LinkedList 在列表的开头及结尾 get 、remove 和 insert 元素提供了统一的命名方法。

3、Vector

public class Vector<E> extends AbstractList<E> implements List<E>,RandomAccess,Cloneable,Serializable

Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。ArrayList 1.2 版本后基本上代替了 Vector。

代码演示:

package com.joe.list;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

/**
* List接口: 1、允许重复元素 2、必须是有序的 3、允许null元素
*
* @author joe
*
*/

public class ListDemo {

public static void main(String[] args) {
arraylist();
linkedlist();
vector();

// 创建集合对象时,使用泛型
List<String> list = new ArrayList<String>();
list.add("");

}

/**
* ArrayList实现类
* 1、默认构造的ArrayList对象是10个大小的数组
* 2、如果数组已存满,就需动态扩充数组,算法是:(原数组长度*3/2)+1,大约是原数组的一半左右
* 3、内部使用动态数组实现
* 4、如果我们已知元素个数,那么可以使用指定初始容量的构造方法创建ArrayList对象,这样可以 有效的避免数组扩充的次数过多,从而提高效率
* 5、使用插入或删除操作,会导致数组需要重新创建,会影响性能,尽量少用
* 6、线程不安全
*/

public static void arraylist() {
// 创建ArrayList对象
ArrayList list = new ArrayList();
list.add(10);
list.add("JAVA");
list.add(true);
// 添加元素.....

list.add(11);
list.add(12);
list.add(13);
list.add(14);
list.add(15);
list.add(16);
list.add(17);
list.add(18);
list.add(17);

// 插入方法
//在下角标为5的位置上,插入“50”
list.add(5, 50);

System.out.println("一共有元素:" + list.size());
//得到下角标为5位置上的元素
System.out.println("第5个元素是:" + list.get(5));
// 清除所有元素
// list.clear();
// System.out.println(list.size());
// 如果此列表中包含指定的元素,则返回 true。
System.out.println(list.contains(17));
// 查找指定元素的位置(首次)
System.out.println(list.indexOf(17));
// 检查集合是否为空
System.out.println(list.isEmpty());

// 删除指定索引的元素
System.out.println(list.remove(1));

}

/**
* LinkedList实现类
* 1、使用双向链表实现
* 2、优点,适合插入,删除操作很方便
* LinkedList特有方法: addFirst() addLast() getFirst() getLast() removeFirst() removeLast()
*/

public static void linkedlist() {

LinkedList list = new LinkedList();
//在集合的头部加入元素
list.addFirst("我爱");
//在集合的尾部加入元素
list.addLast("学习");
//得到集合头部的元素
list.getFirst();
//得到集合尾部的元素
list.getLast()
//移除集合头部的元素
list.removeFirst()
//移除集合尾部的元素
list/removeLast()
}

/**
* Vector实现类
* 1、使用动态对象数组实现
* 2、默认构造方法初始化容量为10
* 3、扩充方式:如果有指定增量:当前容量+增量;如果没有增量:原容量
* 4、线程安全
*/

public static void vector() {
Vector vector = new Vector();
vector.add("我爱");
vector.add("学习");
vector.add("JAVA");
}
}