文章目录


  • 前言
  • 一、集合的概念
  • 二、集合API
  • 三、Collection接口 
  • 四、List接口及实现类
  • 五、List接口集合迭代
  • 六、set接口
  • 七、Map接口



前言

       Java 集合概览 Java 集合, 也叫作容器,主要是由两大接口派生而来:一个是 Collection 接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对。 对于 Collection 接口,下面又有三个主要的子接口: List 、 Set 和 Queue  


一、集合的概念

        数组:是容器,对象,指定存储空间,长度不可变
                索引-->查询块  向数组中插入,删除
        实际开发中数据数量是变化的,而且不同的是数据结构不同,所以java中提供了许多不同类型的集合--Java中对于各种数据结构的实现,就是集合
        集合就是容器:以不同的结构特征来存储数据--动态增长长度的容器

二、集合API

集合体系概述:
       Java的集合框架由许多接口、抽象类、具体类组成的,位于java.util包中

java中的容器类 java容器的概念_数组

三、Collection接口 

Collection接口:定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式
      Set中的数据对象没有顺序且不可以重复
      List中的数据对象有顺序且可以重复

Collection<E> 集合可以使用泛型向集合中传入一个参数
      如果不传默认是Object,都必须存储引用类型

boolean add(Object element);
boolean addAll(Collection c);
boolean remove(Object element);
删除指定集合 不包含时,删除相交的元素
boolean removeAll(Collection c);
void clear();
int size();
判断是否为空
boolean isEmpty();
是否包含
boolean contains(Object element);
boolean containsAll(Collection c);
求交集,集合数据发生变化返回true,不变返回false
boolean retainAll(Collection c);

四、List接口及实现类

List继承了Collection接口,有三个实现类:
1、ArrayList:数组列表,数据采用数组方式存储
         ArrayList实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高

java中的容器类 java容器的概念_数组_02

ArrayList常用方法:

add(int index, E element)
get(int index)
indexOf(Object o)
lastIndexOf(Object o)
删除并返回指定位置元素
remove(int index)
删除指定区间的元素(子类继承使用)
removeRange(int fromIndex, int toIndex)
set(int index, E element)

public class ArrayListDemo1 {
    public static void main(String[] args) {

        //ArrayList<>()创建一个长度为10的底层数组,第一次添加元素时,真正创建数组
        ArrayList<String> alist = new ArrayList<>();
                          alist.add("a");
                          alist.add("b");
                          alist.add("c");
        //向指定位置插入元素
        alist.add(0,"d");
        //获取指定位置的元素  return elementData(index);
        System.out.println(alist.get(2));
        //获取指定元素的位置
        System.out.println(alist.indexOf("b"));
        //删除并返回指定索引的元素
        System.out.println(alist.remove(1));
        //替换指定位置的元素
        System.out.println(alist.set(1, "B"));
        System.out.println(alist.size());
        System.out.println(alist);

        //ArrayList<String> alist = new ArrayList<>(20);
        /*
           add()添加一个元素到集合中的过程
                调用add()添加元素时,先检查底层数组是否能够存放,直接将元素添加到末尾
                如果不可以,会创建一个新的数组,将原来的数组内容复制过去
           size --> 记录实际装入数组的元素个数

    //底层数组
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // 检查元素能否存放
        elementData[size++] = e;
        return true;
    }
    放进去后容量大小 - 底层数组长度 > 0
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);扩容

        private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        //数组赋值,创建一个新数组,将原来的数组内容复制到新数组中
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
         */

    }
}
public class ArrayListDemo {

    public static void main(String[] args) {
        ArrayList<String> alist = new ArrayList<>();
                          alist.add("c");
                          alist.add("b");
                          alist.add("a");
                          alist.add("d");
        //new 接口() { 方法重写 } 创建了一个匿名内部类对象
        /*        
            alist.sort(new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    return 0;
                }
            });
        */
        //创建了一个自定义String比较类的对象
        //alist.sort(new StringComparator());
        alist.sort((String o1,String o2)->{return o1.compareTo(o2); });
        System.out.println(alist);
    }
}

2、LinkedList:链表

      LinkedList采用链表存储方式。插入、删除元素时效率比较高

java中的容器类 java容器的概念_ci_03

LinkedList的常用方法:
add() 每添加一个元素,创建一个Node对象
                   E item;
                   Node<E> next;
                   Node<E> prev;
add(int index,Object element)
addFirist(Object element)
addLast(Object element)
index<size/2 

从头结点开始向后查找,否则从尾节点向前找
get(int index)
removeFirst()
removeLast()
remove(int index)
getFirst()
getLast()

public class LinkedListDemo {
    public static void main(String[] args) {

        /*
          储存重复元素
              add() 每添加一个元素,创建一个Node对象
                   E item;
                   Node<E> next;
                   Node<E> prev;
         */
        LinkedList<String> llink = new LinkedList<>();

                          llink.add("a");
                          llink.add("b");
                          llink.add("c");
                          llink.add("d");
                          llink.add("e");
        //index<size/2  从头结点开始向后查找,否则从尾节点向前找
        System.out.println(llink.get(2));
        System.out.println(llink);
    }
}

3、Vector:数组列表,添加同步锁,线程安全的
     Vector底层也是数组,但是线程是安全的

public class VectorDemo {
    public static void main(String[] args) {
        Vector<String> v = new Vector<>();
                       v.add("a");
                       v.add("b");
                       v.add("c");
        System.out.println(v);

        /*
        Vector底层也是数组,但是线程是安全的

        public synchronized boolean add(E e) {
            modCount++;
            ensureCapacityHelper(elementCount + 1);
            elementData[elementCount++] = e;
            return true;
        }
         */
    }
}

五、List接口集合迭代


● for循环遍历


● 增强for循环的遍历


● 迭代器遍历(Iterator)



public class ListIteratorDemo1 {

    public static void main(String[] args) {

        ArrayList<String> alist = new ArrayList<>();
                          alist.add("a");
                          alist.add("b");
                          alist.add("c");
                          alist.add("d");
        
        //for循环
        //支持在遍历的过程中删除集合中的元素,注意元素向前移动,i++,会漏掉一些元素
        for (int i = 0; i < alist.size(); i++) {
            if (alist.get(i).equals("a")) {
                alist.remove(i);
            }
        }
        System.out.println(alist);
        
        //增强for循环
        //不支持遍历时删除元素
        for (String s : alist) {
            if (s.equals("a")) {
                break;
            }
        }
        System.out.println(alist);

        //迭代器
        //返回一个迭代器对象,控制元素的遍历
        Iterator<String> it = alist.iterator();
        while (it.hasNext()) {
            String s = it.next();
            if (s.equals("a")) {
                it.remove();//使用迭代器中的方法进行遍历
            }
        }
        System.out.println(alist);

        ListIterator<String> lit = alist.listIterator();
        while(lit.hasNext()) {
            System.out.println(lit.next());
        }

        //listIterator() 只能对list接口下的实现类进行遍历
        ListIterator<String> list = alist.listIterator();
        while(list.hasPrevious()) {
            System.out.println(list.previous());
        }
    }

}

六、set接口

Set接口继承了Collection接口:
      Set中所存储的元素是不重复的,但是是无序的,Set中的元素是没有索引的
Set接口有两个实现类
HashSet:
      HashSet类中的元素不能重复,彼此调用equals方法比较,都返回false
      底层数据结构是哈希表+链表
      哈希表依赖于哈希存储
TreeSet:
      可以给Set集合中的元素进行指定方式的排序。
      存储对象必须实现Comparable接口。
      TreeSet底层数据结构是二叉树

七、Map接口

Map接口:
       将键映射到值的对象,一个映射不能包含重复的键,每个映射最多只能映射到一个值

Map接口常用方法:

V put(K key,V value)
 V remove(Object key)
 void clear()
 boolean containsKey(Object key)
 boolean containsValue(Object value)
 boolean isEmpty()
 int size()
 V get(Object key)
 Collection<V> values()
 Set<K> keySet()
 Set<Map.Entry<K,V>> entrySet()

HashMap:
        HashMap中元素的key值不能重复,排列顺序不固定,可以存储一个为null的键

TreeMap:
       TreeMap中所有的元素都保持着某种固定的顺序,如果需要得到一个有序Map就使用TreeMap,key值所在类必须实现Comparable接口

HashTable:
        实现了同步,不能存储为null的键

Map集合遍历:
        根据键找值:
               获取所有键的集合
               遍历键的集合,获取到每一个键
               根据键找值
        根据键值对对象找键和值
               获取所有键值对对象的集合
               遍历键值对对象的集合,获取到每一个键值对对象
               根基键值对对象找键和值

TreeMap:

      适用于自然顺序或自定义顺序遍历键(key)
      TreeMap根据key值排序,key值需要实现Comparable接口,重写compareTo方法。TreeMap根据compareTo的逻辑,对key进行排序。
      键是红黑树结构,可以保证键的排序和唯一性

9、Collections类

Collections是集合类的工具类,与数组的工具类Arrays类似.
addAl l(Col lection<? super T> c, T... elements);
binarySearch(List<? extends Comparable<? super T>> l ist, T key)
sort(List<T> l ist)
sort(List<T> l ist, Comparator<? super T> c)
swap(List<?> l ist, int i, int j)
copy(List<? super T> dest, List<? extends T> src) ; 注意 dest size需大于等于src.size
emptyList() 返回为空的集合,不能添加数据
fi l l(List<? super T> l ist, T obj)
max(Col lection<? extends T> col l)
min(Col lection<? extends T> col l)
replaceAl l(List<T> l ist, T oldVal, T newVal)
reverse(List<?> l ist)