java集合详解

Java集合详解

一、集合的基本框架

java中的集合结构可分为两大类:collction和Map两种体系

Collection接口 单列数据, 定义存取一组对象的方法集合

Map接口 双列数据,保存具有映射关系key-value对的集合

|----Collection接口:单列集合,用来存储一个一个的对象
     |----List接口:一种包含有序元素的线性表,可存储有序的、可重复的数据。
                    可以存放多个null值。      -->“动态”数组
           |----ArrayList:作为List接口的主要实现类,多用于频繁的改查操作,线程不安全的,效率高;
                           底层采用Object[] elementData数组存储。
           |----LinkedList:对于频繁的插入删除操作,使用此类效率比ArrayList效率高,线程也不安全                         
                           底层采用双向链表存储
           |----Vector:作为List的古老实现类,线程安全的,效率低;
                           底层采用Object[]数组存储
           
     |----Set接口:存储无序的、不可重复的数据   -->数学概念上的“集合”
           |----HashSet:作为Set接口主要实现类;线程不安全;可以存null值
                         底层采用数组+链表+红黑树
           		|----LinkedHashSet:作为HashSet的子类;遍历其内部数据时,可以按照添加顺序遍历;对于频繁的遍历操作,	     							LinkedHashSet效率高于HashSet.
                          底层采用数组+双向链表+红黑树
           |----TreeSet:可以按照添加对象的指定属性,进行排序。
                           底层采用红黑树
 
|----Map:双列数据,存储key-value对的数据
     |----HashMap:作为Map的主要实现类;线程不安全的,效率高;可存储key和value可以为null,且值(value)可以存在多个null,键					(key)只能出现一个null,若key中出现多个null,其结果是对第一个null的值进行覆盖
          |----LinkedHashMap:保证在遍历map元素时,可以照添加的顺序实现遍历。
                    原因:在原的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。对于频繁的遍历操作,此类执行效						 率高于HashMap。
     |----TreeMap:保证照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序,底层使用红黑树
     |----Hashtable:作为古老的实现类;线程安全的,效率低;不能存储null的key和value
          |----Properties:常用来处理配置文件。key和value都是String类型

二、collection接口

Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。

  • collection中的抽象方法
    //添加
    boolean add(object e)
    //删除
    boolean remove(Object o)
    //清空集合
    void claer()
    //是否包含某个元素
    boolean contains(Object o)
    //集合是否为空
    boolean isEmpty()
    //集合中元素个数
    int size()
    // 将一个集合中的元素添加到另一个集合中
    boolean addAll(Collection c)
    //在c1中移除与c2相同部分的元素
    boolean removeAll(Collection c)
    //判断一个集合中是否包含另一个集合的所有元素
    boolean containsAll(Collection c)
    // c1与c2做交集 交集的结果存储在c1中,c2不变
    boolean retainAll(Collection c)
        
    //把集合转成数组,可以实现集合的遍历    
    Object[] toArray()
	//迭代器,集合的专用遍历方式
    Iterator iterator()


  • Iterator接口概述

    • 对 collection 进行迭代的迭代器

    • 接口成员方法

      	//判断迭代器下一对象是否存在
      	boolean hasNext()
          //获得迭代下一个对象
      	E next()
              
          //遍历集合c1
              Iterator iterator = c1.iterator();
              while (iterator.hasNext()) {
                  String s = (String) iterator.next();
                  System.out.println(s + ", " + s.length());
             }
      
      

2.1.List接口概述

有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
与 set 不同,列表通常允许重复的元素。

  • List接口的成员方法
    //添加
    void add(int index,E element)
    //删除
    E remove(int index)
    //获取
    E get(int index)
    //修改
    E set(int index,E element)
    //列表迭代器,List集合特有的迭代器
    ListIterator listIterator()

  • ListIterator接口的成员方法

boolean hasPrevious()
E previous()

1.ArrayList类概述

底层数据结构是数组,查询快,增删慢线程不安全,效率高

2.Vector类概述

底层数据结构是数组,查询快,增删慢线程安全,效率低

  • Vector类特有功能
public void addElement(E obj)
public E elementAt(int index)
public Enumeration elements()
3.LinkedList类概述

底层数据结构是链表,查询慢,增删快线程不安全,效率高

  • LinkedList类特有功能
    //向集合头或尾添加元素
    public void addFirst(E e) addLast(E e)
    //获取集合头或尾的元素
    public E getFirst() getLast()
    //删除集合头和尾的元素
    public E removeFirst()及public E removeLast()

2.2.HashSet类概述

不保证 set 的迭代顺序,特别是它不保证该顺序恒久不变。HashSet如何保证元素唯一性
底层数据结构是哈希表(元素是链表的数组)
哈希表依赖于哈希值存储

int hashCode()
boolean equals(Object obj)
  • LinkedHashSet类概述
    元素有序唯一
    由链表保证元素有序
    由哈希表保证元素唯一

2.3TreeSet类概述

使用元素的自然顺序对元素进行排序或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
底层数据结构是红黑树(红黑树是一种自平衡的二叉树)

自然排序:
    class Student2 implements Comparable<Student2> {
    String name;
    int age;
        //显式条件:按照年龄从小到大排序
        //隐藏条件:当年龄一样的时候,比较姓名
        //this -- 待插入的元素
        //o -- 已经在树中的根
        int i1 = this.age - s.age;
        return (i1 == 0) ? this.name.compareTo(s.name) : i1;
    }
}
比较器排序:
    TreeSet<Student3> treeSet = new TreeSet<>(new Comparator<Student3>() {
        @Override
        public int compare(Student3 o1, Student3 o2) {
            //o1 -- 待插入的元素
            //o2 -- 已经存在树中的根
            int i1 = o1.age - o2.age;
            return (i1 == 0) ? o1.name.compareTo(o2.name) : i1;
        }
    });

小总结:
    1、如果要使用自然排序,在创建TreeSet对象的时候,使用无参构造方法,
    但是要保证元素的类实现Comparable接口,重写compareTo方法。
    2、如果要使用比较器排序,在创建TreeSet对象的时候,使用有参构造方法,
    传入一个实现了Comparator接口的子类对象,重写compare方法

三、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)

Set<K> keySet()
Collection<V> values()
Set<Map.Entry<K,V>> entrySet()
    
//遍历集合的两种方式
Set<Integer> integers = map.keySet();
	for (Integer integer : integers) {
    	String value = map.get(integer);
    	System.out.println(integer+"---"+value);
	}


Set<Map.Entry<Integer, String>> entries = map.entrySet();
	for (Map.Entry<Integer, String> entry : entries) {
    	Integer key = entry.getKey();
    	String value = entry.getValue();
    	System.out.println(key+"----"+value);
	}


1.HashMap类概述

键是哈希表结构,可以保证键的唯一性

2.TreeMap类概述

键是红黑树结构,可以保证键的排序和唯一性

四、Collections类概述

  • 针对集合操作的工具类
  • Collections成员方法
public static <T> void sort(List<T> list)
public static <T> int binarySearch(List<?> list,T key)
public static <T> T max(Collection<?> coll)
public static void reverse(List<?> list)
//将集合中元素随机打乱
public static void shuffle(List<?> list)
posted @ 2024-03-08 20:52  low-reed  阅读(16)  评论(0)    收藏  举报