第七章 集合
集合概念
存储一个班学员信息,假定一个班容纳20名学员
当我们需要保存一组一样(类型相同)的元素的时候,我们应该使用一个容器来存储,数组就是这样一个容器。 数组的缺点:数组一旦定义,长度将不能再变化。 然而在我们的开发实践中,经常需要保存一些变长的数据集合,于是,我们需要一些能够动态增长长度的容器来保存我们的数据。而我们需要对数据的保存的逻辑可能各种各样,于是就有了各种各样的数据结构。Java中对于各种数据结构的实现,就是我们用到的集合。
集合 API
集合体系概述:Java的集合框架是由很多接口、抽象类、具体类组成的,都位于java.util包中。
Collection 接口
Collection 接口-定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式。 1.Set 中的数据对象没有顺序且不可以重复。 2.List 中的数据对象有顺序且可以重复。
List 接口及实现类
List继承了Collection接口,有三个实现的类: ArrayList:数组列表,数据采用数组方式存储。 LinkedList:链表. Vector:数组列表,添加同步锁,线程安全的. 特点:ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高. LinkedList采用链表存储方式。插入、删除元素时效率比较高.
public class ArrayListDemo1 { // ArrayList public static void main(String[] args) { //List<String> list = new ArrayList<>(); /* ArrayList底层是数组实现 add();向集合中添加元素时,底层会默认创建一个长度为10的Object类型数组, 当数组装满时,再次添加元素,会创建一个原来数组长度1.5倍的新数组,将原数组内容复制过来 最后将新数组地址赋给底层的数组 public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } if (minCapacity - elementData.length > 0) grow(minCapacity);底层扩展的方法 */ ArrayList<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("d"); list.add("d"); list.add("d"); list.add("d"); list.add("d"); list.add("d"); list.add("d"); list.add(0, "X");//向指定下标位置上添加元素 System.out.println(list.get(11));//elementData[index]; System.out.println(list.remove(0));//删除并返回指定位置的元素 list.set(2, "K");//替换指定位置的元素 System.out.println(list.size());//返回集合中实际存储的元素个数 System.out.println(list); } //1.for循环遍历 /* for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } */ //2.增强for循环遍历 for(String s : list){ System.out.println(s);} //LinkedList public static void main(String[] args) { LinkedList<String> llist = new LinkedList<>(); llist.add("a");//向链表中添加元素 [0,1,2,3,4] llist.add("b"); llist.add("c"); llist.add("d"); llist.add("e"); System.out.println(llist.get(3));//要找的元素位置小于size/2,从头结点开始查找,否则从尾结点开始查找 llist.addFirst("X"); llist.addLast("Y"); System.out.println(llist.removeFirst()); System.out.println(llist.removeLast()); System.out.println(llist); } //Vector public static void main(String[] args) { // 底层也是数组实现,但是是线程安全的 Vector<String> v = new Vector<>(); v.add("a"); v.add("b"); v.add("c"); v.add("d"); v.add("a"); v.get(1); System.out.println(v);}