一、集合类结构体系
图一
图二
二、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; } }