1.1:集合概述
- 出现意义:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
- 集合与数组辨析
容器长度:
集合长度可变
数组长度固定
存储内容类型
集合存储引用数据类型
数组存储任意类型
是否可存储不同类型数据
集合可以存储不同类型数据
数组只能存储相同数据类型
- Java中的集合: JDK为我们提供了一套完整的容器类库,这些容器可以用于存储各种类型的对象,并且长度都是可变的,我们把这些类统称为集合类,它们都位于java.util包中。
- 分类:
单列集合Collection
List:元素有序、包含重复元素
Set:元素无序、不包含重复元素
双列集合Map:键值映射关系
其他功能接口
迭代器Iterator
Comparable与Comparator用于比较元素
1.2:Collection
Collection接口:单列集合的根接口
主要方法
boolean add(E e)
boolean remove(Object o)
void clear()
boolean contains(Object o)
boolean isEmpty()
int size()
主要方法2
boolean addAll(Collection c)
boolean removeAll(Collection c)
boolean containsAll(Collection c)
boolean retainAll(Collection c)
返回迭代器方法
Iterator<E> iterator()
1.3:迭代器
Iterator接口:单列集合的迭代器。迭代器会像地震搜救队的方式一样去遍历集合中的每一个元素。
主要方法
boolean hasNext()
E next()
使用固定格式:
格式一:
Collection c = new ArrayList();
Iterator it = c.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
格式二:
for(Iterator it = c.iterator();it.hasNext();){
System.out.println(it.next());
}
1.4:增强for循环
foreach循环:又叫增强for循环,是迭代器的简写形式
格式:
for(容器内类型 临时变量:容器) {
内部可以直接使用临时变量访问数据
}
1.5:List
List:单列集合,可存放重复元素,元素有序。
主要子类:
ArrayList:底层数据结构是数组结构。线程不安全的。所以ArrayList的出现替代了Vector。增删慢,改查快。
LinkedList:底层是链表数据结构。线程不安全的,同时对元素的增删操作效率很高。
Vector:底层数据结构是数组结构。jdk1.0版本。线程安全的。无论增删还是查询都非常慢.已被ArrayList替代。
特殊方法
void add(int index, E element)
E remove(int index)
E get(int index)
E set(int index, E element)
List<E> subList(int fromIndex, int toIndex)
int indexOf(Object o)
int lastIndexOf(Object o)
ListIterator<E> listIterator() 注意:用于应对并发修改异常
ListIterator:list特有的迭代器,内含避免并发修改异常的算法。
主要方法:
boolean hasNext()
E next()
boolean hasPrevious()
E previous()
void add(E e)
void remove()
void set(E e)
LinkedList:与ArrayList不同,LinkedList是方便添加删除的List。
主要方法:
public void addFirst(E e)
public void addLast(E e)
public E getFirst()
public E getLast()
以及其替代方法
Vector:安全的List,Vector中提供了一个独特的取出方式,就是枚举Enumeration。此接口Enumeration的功能与 Iterator 接口的功能是重复的。
主要方法:
public E elementAt(int index)
public E firstElement()
public E lastElement()
public void setElementAt(E obj, int index)
public void removeElementAt(int index)及其他删除
public Enumeration<E> elements()
1.6:Set
Set:单列集合,无序,元素不得重复。与Collection方法一致。
Set集合取出元素只能使用迭代器。
Set 主要子类
HashSet:线程不安全,存取速度快
底层结构为哈希表结构,即区分元素时使用hash值。可以通过hashCode与equals方法的重写,保证元素唯一性。
具体代码体现为:先判断哈希值是否相等,再判断equals方法是否返回true。true则为相同元素,存储元素失败,false则为不同元素,存储元素成功。
TreeSet: 线程不安全,可以对集合中的元素进行排序。
通过Comparable让集合内元素具备比较性
通过Comparator让集合具备比较某种类型元素的能力。
当Comparator与Comparable冲突时,以Comparator作为标准。
LinkedHashSet:
在HashSet集合的基础上,使迭代顺序可预测。
1.7:Collection小结
Collection体系最常用的集合为ArrayList。
当数据从数据库读出时,通常是使用ArrayList接收多个对象,从而使用该集合进行数据的传递。通常页面展示数据时,使用ArrayList作为最后数据的容器。
TreeSet的排序功能在日常开发中使用的并不广泛。
LinkedList常用于发生修改的数据。
1.8:数据结构简介
数组结构(array)与链表结构(linked)
数组结构增删慢,查找快
链表结构增删快,查找慢
栈(stack)与队列(queue)
栈结构先进后出
堆结构后进先出
树结构(tree):实现可排序的方式之一
1.9:泛型
泛型:用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数传递。
泛型的优点:
提高程序的安全性
将运行期问题转移到了编译期
省去了类型强转的麻烦
优化了程序设计
在使用泛型后的集合中,迭代器返回时,可以直接返回该种数据类型对象。
替代了Object类的“任意化”性,避免了程序员必须预知使用时数据类型的情况。
泛型的使用
直接在指定泛型的地方给出明确的数据类型即可
泛型的格式:
<>:里边写具体的类型,里边什么都不写,叫菱形泛型,即前边是什么类型,后边也是什么类型。
泛型的定义
泛型类:在类上定义泛型,类中使用该类型
格式:class 类名<T>{使用T}
泛型方法:在方法上定义泛型,方法内使用泛型,与类无关。
格式:public <T> void method(){使用T}
泛型接口:在接口上使用泛型。
格式:interface 接口名<T>{}
在类实现接口时明确泛型类型
在类实现接口时仍不明确泛型类型,在创建对象时明确泛型类型
泛型通配符:<?>可匹配任意一种数据类型
<?>与<T>的差别
通配符修饰的泛型不能直接使用而<T>可以使用
通配符修饰相当于声明了一种变量,它可以作为参数在方法中传递,如collection的containsAll方法
使用<?>可以完成类型限定,可参见TreeSet
? extends E 限定类型上限
? super E 限定类型下限
2.1:集合工具类Collections
Collections集合工具类
以上为两种工具类,分别对数组或集合进行了常规动作的操作。日常开发中,出现在该两类的功能应该直接调用,而不应手动自己开发。
重点关注数组与集合相互转换的方法。
重点关注带可变参数与泛型的的方法。
注意:当使用Arrays将数组转成集合后,长度不可增加。
2.2:Map
Map集合概念:对应于Collection的单列集合,Map为双列集合,存储的每个元素均为键值对。可以通过键找到该建对应的值。
Map集合无法返回对应的迭代器。其内容需要调用方法进行访问。
主要格式:
Map<k,v>
key - 此映射所维护的键的类型
value - 映射值的类型
主要子类:
HashMap:底层为哈希表结构的Map集合。
Hashtable:底层为哈希表结构的Map集合。
TreeMap:对键进行排序,排序原理与TreeSet相同的Map集合。
LinkedHashMap:可预知顺序的HashMap集合
2.3:HashMap
HashMap :底层为哈希表的双列集合。对键进行唯一约束,放入相同键时,新的值会将旧的值覆盖。是最常用的Map集合。
特点:
线程不安全
速度快
允许存放null键,null值。
主要方法
public V put(K key, V value)
public void putAll(Map<? extends K,? extends V> m)
public boolean isEmpty()
public int size()
public boolean containsKey(Object key)
public boolean containsValue(Object value)
public V remove(Object key)
public void clear()
public V get(Object key)
public Set<K> keySet()
public Collection<V> values()
public Set<Map.Entry<K,V>> entrySet()
2.4:Map.Entry
Map.Entry :键值对映射关系
主要方法
K getKey()
V getValue()
V setValue(V value)
int hashCode()
2.5:Hashtable
Hashtable:底层为哈希表的集合,已被HashMap替代。Hashtable的Properties用于配置文件的定义和操作,键和值都是字符串,是集合中可以和IO技术相结合的对象
特点:
线程安全
速度慢
不允许存放null键,null值
命名方式不符合标准大驼峰式
2.6:TreeMap
TreeMap:对键进行排序,排序原理与TreeSet相同的Map集合。
排序方式同TreeSet
使键实现Comparable接口,重写compareTo方法
创建集合对象时,传入Comparator对象,重写compare方法
2.7:集合小结
Collection
List有序,可重复,允许为null
ArrayList 数据结构是数组.查找快
LinkedList 数据结构是链表.增删快
Vector 数据结构是数组.都很慢
Set无序,不可以重复
HashSet 数据结构是哈希表.无序
LinkedHashSet 数据结构是哈希表和链表.
TreeSet 数据结构是二叉树.排序
Map
HashMap键无序,key不可重复,不安全,速度快
LinkedHashMap键有序,不可重复
Hashtable键无序,不可重复,安全,速度慢
TreeMap键排序,不可重复
企业级开发实际情况:
单列使用ArrayList、LinkedList、HashSet
双列使用HashMap
(以上:就是APL集合,接下来我们讲常用API-IO)