集合框架1——Collection系

0. 数据多了为方便存储就出现了对象, 对象多了也需要存储, 有两种存储方式: 数组、集合. 


1. 为什么出现集合类? 

答: 面向对象语言对事物的体现都是以对象的形式, 所以为了方便对多个对象的操作, 就对对象进行存储, 集合就是存储对象最常用的一 种方式. 


2. 数组和集合类都是容器, 有何不同?

答: 数组长度固定, 集合长度可变; 数组中只能存储同种类型的对象, 集合存多种. 


3. 集合类框架:


这个看着乱, 先看个Collection及其衍生的吧! (老毕手绘*)



4. 集合框架的共性方法(Collection<E>接口的): 

  • 添加
  • add(E e): 添加元素. 
  • addAll(Collection<? extends E> c): 添加一个集合. 
  • 删除
  • remove(Object o)
  • removeAll(Collection<?> c)
  • clear(): 清空集合. 
  • 判断
  • contains(Object o): 包含. 
  • containsAll(Collection<?> c)
  • isEmpty()
  • 获取
  • iterator(): 获取迭代器. 
  • size(): 获取元素个数. 
  • 其他
  • retainAll(Collection<?> c): 交集. 返回boolean值. 
  • toArray(): 集合变数组, 返回Object[]. 
  • toArray(T[] t): 存入t. 

5. 迭代器(Iterator): 
import java.util.ArrayList;
import java.util.Iterator;


public class Test2 {
	
	public static void main(String[] args) throws InterruptedException {	
		
		ArrayList al = new ArrayList();
		al.add("asd");
		al.add("xxx");
		
		Iterator it = al.iterator();	//获取迭代器, 用于取出元素
		while(it.hasNext())
			System.out.println(it.next());
		
	}
}

6. * 集合有Collection和Map接口. 其中Collection又有List(列表)和Set(集)子接口. 
  • List: 元素可以重复, 有序(指存入和取出的顺序一致), 有索引. 
    |-- Vector: 线程安全的ArrayList. 
    |-- ArrayList: 底层使用数组数据结构. 查改快, 增删慢. 线程不安全. 
    |-- LinkedList: 底层使用链表结构. 增删快, 查改慢. 

  • Set: 元素不能重复, 无序(值存入和取出的顺序不一定一致), 没索引. 
    |-- HashSet: 底层数据结构是哈希表(存入对象时, 先判断hashCode()得到的值, 如果一样, 再用equals()方法比较, 再相同就当做同一个元素, 不相同就在同一个位置上串联着存两个元素.). 线程不安全. 存取速度快. 
    |-- TreeSet: 底层数据结构是二叉树. 线程不安全. 可以对Set集合中的元素进行排序(通过compareTo或者compare()方法来保证元素的唯一性.). 

7. List集合的共性方法: 大多是与index有关的. 

  • add(index, element)
  • addAll(index, Collection)
  • remove(index)
  • set(index, element)
  • get(index)
  • subList(from, to)
  • * listIterator()

8. 列表迭代器ListIterator: 
  • ListIterator是Iterator的子接口. 
  • 在迭代时, 不能用集合对象的方法操作集合中的元素, 否则会发生ConcurrentModificationException异常. 
    所以, 迭代时只能用迭代器的方法操作元素, 但是Iterator方法有限(只能判断、取出、删除), 如有更多要求, 就要使用子接口ListIterator. 


9. LinkedList特有方法:

  • addFirst(e)和offerFirst(e): 查的, 说addXxx是继承自List的, offerXxx是来自Queue. 
  • addLast(e)和offerLast(e)
  • 获取获取,但不删除元素。
  • getFirst()和peakFirst(): 如果集合为空, 前者抛异常, 后者获取null. 
  • getLast()和peakLast(): 同上
  • 获取,且删除元素。
  • removeFirst()和pollFirst(): 如果集合为空, 前者抛异常, 后者获取null. 
  • remove()和poll(): 同上
  • removeLast()和pollLast(): 同上

10.* ArrayList和LinkedList分别什么时候用?
答: 一般只有元素多, 且增删频繁, 用LinkedList. 
否则一般(涉及增删, 又涉及改查)用ArrayList. 

11. TreeSet的排序方式:
  • 第一种: 让元素自身具备比较性. 元素需要实现comparable接口, 覆盖compareTo方法. 这种方式也称为元素的自然顺序, 或者叫做默认顺序. 
  • 第二种: 当元素自身不具备比较性, 或者具备的比较性不是所需的时, 就需要让集合自身具备比较性. 


12. 泛型: 用于解决安全问题,是一个类型安全机制。


13. 泛型的好处: 

  • 更安全让运行时问题减少, 更安全. 
  • 将运行时期出现问题ClassCastException,转移到了编译时期. 方便于程序员解决问题. 
  • 避免了强制转换麻烦. 

14. 泛型格式: 
通过<>来定义遥操作的引用数据类型. 
  • 定义类时, 放在类名之后. 
  • 定义方法是, 放在返回值之前修饰符之后. 

15. 什么时候定义泛型类?
答:* 当类中要操作的引用数据类型不确定的时候. 早期定义Object来完成扩展, 现在定义泛型来完成扩展. 

16. 静态方法泛型:
静态方法不可以访问类上定义的泛型. 如果静态方法操作的应用数据类型不确定, 可以将泛型定义在方法上. 


17.* 泛型限定:

  • <?>: 代表任意类型. 
  • <? extends Person>: 代表Person及其子类型. 上限. 
  • <? super Person>: 代表Person及其父类型. 


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页