集合框架、泛型
1).Collection
集合:一类特殊的对象(用于保存多个对象的对象)
Collection:元素必须是引用类型,在遍历时需要for each方式(因为数据没有下标)
Collection 重要的两个子接口:①List ②Set
Collection集合的重要的方法:
add(E e) 顺序的添加元素到集合中
remove(Object o) 从集合移除
size() 返回collection集合中的元素数量
Object[] toArray() 返回包含collection中所有元素的数组
void clear() 移除collocation中所有的元素
boolean contains() 判断集合是否包含特定元素
注:
在遍历时要使用for(集合类型 引用名:数组或集合);
2).List
元素内容可以重复,有顺序也有下标(可用for遍历,也可用for…each遍历)
常见实现类:
(1)ArrayList jdk1.2 底层数组实现 查询快,增删慢 线程不安全 轻量级实现 效率高
(2)LinkedList jdk1.2 底层链表实现 查询慢,增删快
(3)Vector jdk1.1 底层数组实现 查询快,增删慢 线程安全 重量级实现 效率低
常见方法:
void add() 顺序添加
void add(int index,E element) 指定下标插入
E get(int index) 指定下标获取值
E remove(int index) 指定下标删除
E set(int index,E element) 指定下标更新元素
size() 返回长度
indexOf(Object o) 获取从前往后第一次出现的下标
List<E> subList(int fromIndex,int toIndex) 返回从fromindex到toindex-1处所有元素组成的子集合
3).Set
元素内容不可以重复,储存没有顺序,而且无下标(只能用for…each遍历)
常见实现类:
(1)HashSet
添加元素过程:
①元素调用hashCode(),获取哈希码,然后对长度求模(%),获取下标(随机性)
②如果在index处为空,则直接添加;否则使用equals比较两个元素是否相同(可自己覆盖其equals方法),
如果相同添加失败,如果元素不同,则使用链表和前面的元素连起来
注意:开发中往往可能需要覆盖父类的hashCode()和equals()方法;
如果是自定义类型,为保证元素的内容相同就是相同元素,我们必须重新hashCode和equals方法,其要求:
1)内容相同的对象(利用equals方法),必须放回相同的哈希码
2)内容不同的对象,极可能返回不同的哈希码
a) LinkedHashSet(继承自HashSet):自定义类型,为保证元素内容不重复,必须必须重写hashCode和equals方法;添加是有顺序的,遍历时和添加的时的顺序一致
(2)SortedSet
b) TreeSet(继承自SortedSet):可以根据元素的内容自动升序排序,并且不重复。在自定义该集合类型时,为保证元素内容不重复,必须实现coMparable接口并实现compareTo方法
常见方法:
void add(E e) 添加元素,存储顺序随机
E remove(Object o) 指定元素删除
int size() 返回长度
void clear() 清除所有元素
boolean contains(E e)判断是否包含
HashSet jdk1.2 底层实现是散列表
LinkedHashSet jdk1.2 底层实现是散列表和链表
TreeSet jdk1.2 底层实现是红黑树
4).泛型
参数化类型、模板编程
定义类型时,使用类型变量代替;使用泛型类型时,必须传入确切的类型,泛型默认类型时object类型,利用泛型技术可以构建元素类型安全的集合
List<Object> list = new List<>(); //系统会根据传入的参数进行推断其类型
List<T>………此处的T,可以是自定义的类型,比如自定义类
在定义类时也可以用泛型:
public class Student<T> {
public T method(){return T;}
}
泛型可约定范围
<T extends Number> 约定T的类型为数值类型
Number 是short int double float long byte 的父类
5).Map
集合Map是单独的集合,并不是Collection的子类集合,其常见的实现类有:
(1)HashMap
(2)LinkedHashMap
(3)TreeMap
(4)Hashtable
(5)Properties 继承自Hashtable, 键值对为String,大多用于配置文件的存取
Map:元素有key(键)和value(值),其中的键(key)不能重复,而值可以重复
map内的键-值对存储是无序的,没有下标的
-------------------------------------------------------------------------------------------------------------
HashMap:
常见方法:①put(Object K,Object V)②remove(key)删除key键的键值对③size()④get(key)⑤containsKey(Object Key)是否包含key⑥containsValue(Object Value)是否包含值⑦values()获取所有的值⑧KeySet()获取所有的键
遍历方法:
Map<T, T> map = new HashMap<>();
(1)对键(key)遍历
a) for(T t : map.KeySet() ){} //获取的key集合给o引用
b) Set<T> set = map.KeySet(); //用set集合实现,可以通过键找到值
for(T t:set ){}
(2)对值(value)遍历
a) for(T t : map.ValueSet() ){} //对值进行遍历
b) Collection<T> c = map.values(); //通过collection集合实现(值因为可能有重复),通过值无法找到键
for(T t: c){}
(3)对键-值(key, value)对遍历
Set<Map.Entry<K, V>> set = map.entrySet();
for(Map.Entry<K, V> me : set){}
注: //Map.Entry<T, T>是一个类类型 ,它有两个重要的方法:getKey() / getValue(); //获取建和值
6).了解内容
(1)HashMap jdk1.2 底层是散列表 线程不安全,轻量级实现,允许null键-值对
(2)LinkedHashMap jdk1.2 散列表+链表 保证键-值对的遍历时顺序和添加时顺序一致
(3)TreeMap jdk1.2 红黑树 可以根据key的内容对键值对进行自动升序排序
(4)Hashtable jdk1.0 底层是散列表 线程安全,重量级实现,键和值都不能为null
(5)Properties jdk1.0 Hashtable子类 键-值对都是String,专门用于读取配置文件的信息