集合类

一、集合类结构体系

  图一

  图二

  

二、ArrayList

  特点:元素有序可重复,与LinkedList相比,对集合进行随机访问较快,但向指定索引插入、删除对象较慢。(查、改快)

  构造器

  1、ArrayList() :构造一个初始容量为 10 的空列表。

  2、ArrayList(Collection<? extends E> c) :构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。

  3、ArrayList(int initialCapacity) :构造一个具有指定初始容量的空列表。

  常用方法

  1、boolean add(E e):将指定的元素添加到此列表的尾部。

  2、void add(int index, E element) :将指定的元素插入此列表中的指定位置。

  3、boolean addAll(Collection<? extends E> c) :将 Collection容器中的元素按顺序迭代出来,添加到列表尾部。

  4、void clear():移除此列表中的所有元素。

  5、boolean contains(Object o):如果此列表中包含指定的元素,则返回 true。

  6、E get(int index):返回此列表中指定位置上的元素。

  7、int indexOf(Object o) :返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。

  8、boolean isEmpty() :如果此列表中没有元素,则返回 true

  9、E remove(int index):移除此列表中指定位置上的元素。

  10、boolean remove(Object o):移除此列表中首次出现的指定元素(如果存在)。

  11、E set(int index, E element):用指定的元素替代此列表中指定位置上的元素。

  12、int size() :返回此列表中的元素数。

  13、Object[] toArray() :按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。

  14、void trimToSize() :将此 ArrayList 实例的容量调整为列表的当前大小。

  Vector和ArrayList类似,但是是线程同步。

三、LinkedList

  特点:链表可以用作堆栈、队列或双端队列。与ArrayList相比,对集合进行随机访问较慢,但向指定索引插入、删除对象较快。 (增、删快)

  构造器

  LinkedList() :构造一个空列表。

  LinkedList(Collection<? extends E> c) :构造一个包含指定 collection 中的元素的列表,这些元素按其 collection 的迭代器返回的顺序排列。

  常用方法:LinkedList()相比ArrayList方法要多一些,因为实现了更多的接口。很多功能相似,但是方法命名不同,可以根据需求查阅api进行选择。

  几个容易混淆的方法

  1、E peek() :获取但不移除此列表的头(第一个元素)。

  2、E poll():获取并移除此列表的头(第一个元素)

  3、void push(E e) :将元素推入此列表所表示的堆栈。

  4、E pop():从此列表所表示的堆栈处弹出一个元素。

  注意下面这个题:

public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        //队列,先进先出
//        linkedList.add("A");
//        linkedList.add("B");
//        linkedList.add("C");
//        linkedList.add("D");
//        linkedList.add("E");
//        linkedList.add("F");
        
        //栈结构,先进后出
        linkedList.push("A");
        linkedList.push("B");
        linkedList.push("C");
        linkedList.push("D");
        linkedList.push("E");
        linkedList.push("F");
        for(int i=0;i<linkedList.size();i++){
//          System.out.println(linkedList.remove());//F E D
            System.out.println(linkedList.pop());//F E D
        }
    }

四、迭代器

  遍历集合元素,除了使用for循环、增强for循环,还可以使用Iterator(单向), ListIterator(双向)迭代器。

  Iterator:

  1、boolean hasNext() :如果仍有元素可以迭代,则返回 true。

  2、E next():返回迭代的下一个元素。

  3、void remove() :从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。

  ListIterator:

  除了有Iterator的方法,还有的主要方法是:

  1、boolean hasPrevious():如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。

  2、E previous() :返回列表中的前一个元素。

五、HashSet

  特点:无序、不可重复,基于HashMap实现

       判断是否重复的流程:

       1、判断HashCode是否相等,如果不等,则不会判断equals方法

       2、如果HashCode相等,则会判断equals方法

       重写hashCode 和equals方法:快捷键生成(可以根据实际需求修改)

六、TreeSet 

  特点:无序、不可重复,基于TreeMap实现,可以按照指定顺序进行排序。

       判断重复的原理:比较两个对象时,返回值为0,则重复。

       实现的两种方式:

       1、类(如Student)本身实现Comparable接口,重写compareTo方法,则该类就有了排序功能。

       2、创建一个比较器类实现Comparator接口,重写compare方法,创建带比较的TreeSet对象,该对象就有了排序功能。

七、Map  

  HashMap:基于HashCode,允许null键null值,线程不安全。

       判断是否是同一个元素:与HashSet相同,先判断HashCode是否相等,如果不等,则       不会判断equals方法,如果HashCode相等,则会判断equals方法。

       TreeMap:基于红黑树,不允许null键,允许null值,线程不安全,有排序功能

       比较是否是同一个元素,比较方法返回0则相同,返回正数按升序排,返回负数,按降       序排。

       LinkedHashMap:基于HashMap,内部维护了一个链表,可以保证存入和取出顺序是       一致的。

       HashTable:是一个线程安全的HashMap,不能用null键。

       场景选择:一般使用HashMap,如果对自然排序有需求,使用TreeMap,如果对存取       有要求,使用LinkedHashMap。

       两种遍历方法

       1、如果仅仅需要values,就可以使用values()方法

       2、如果需要key和value,就使用entrySet()方法。

       JDK8新特性:当键相同时,存入元素的地方会形成链表结构,当存入元素达到8个时       会形成二叉树。

八、Properties

  

  Properties 类表示了一个持久的属性集。继承HashTable线程安全。

       主要方法:

       1. setProperties(String key,String value);//存入,修改属性

       2. getProperties(String key);//获取属性

       3. void list(PrintStream out) 写

       4. void load(InputStream in)  读

九、Collections工具类

       该类是一个操作集合的工具类,类似操作数组的工具类Arrays

       主要方法:

       1、addAll(Collection c, T... elements);//向集合中添加元素

       2、reverse(list);//反转元素顺序

       3、shuffle(list);//随机排序,单词是洗牌的意思

       4、sort(list);//排序

       5. static List synchronizedList(list)//转换为线程安全的List

十、泛型

  

  在设计类(接口等)的时候,没有给规定具体是什么类型的参数,在实例化或调用的时候再传入具体的类型,告诉编译器这是什么类型。

  注意:

  1、泛型参数类型不能是基本数据类型。

  2、泛型的参数类型可以是多个。

  3、泛型的参数类型允许使用通配符,如<? extends Collection>

  3、泛型的上下限,使用extends或者super限制。

public class GenericityClass <T>{
    
    public T[] sort(T[] src) {
        return null;
    }
    
    public static <T>T[] sort2(T[] src) {//静态方法,类加载时,需要告知jvm其类型,所以需要使用<T>
        return null;
    }
}
原文地址:https://www.cnblogs.com/zwcnblog/p/9941503.html