——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——
一、集合框架
在实际开发中,我们经常会对一组相同类型的数据进行统一管理操作。通常通过数组结构、链表结构、二叉树结构来实现。
数组的最大问题在于数组中的元素个数是固定的,实现动态数组,比较麻烦。自己实现链表或二叉树结构来管理对象更是不方便。
因此,集合出现了。
集合中分为三大接口:
Collection、Map、Iterator
集合框架的接口和类在java.util包中
集合框架结构图如下:
二、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");
}
}