文章目录
泛型
一、泛型的概念
Java泛型是JDK1.5中引入的一个新特性,其本质是参数化类型,把类型作为参数传递
常见形式有泛型类、泛型接口、泛型方法
语法:<T……>
T称为类型占位符,表示一种引用类型
好处:
- 提高代码的重用性
- 防止类型转换异常,提高代码安全性
二、泛型集合
泛型集合是参数化类型、类型安全的集合,强制集合元素的类型必须一致
特点:
- 编译时即可检查,而非运行时抛出异常
- 访问时不必类型转换(拆箱)
- 不同泛型之间引用不能相互赋值,泛型不存在多态
集合
一、集合的概念
集合是对象的容器,实现了对对象常用的操作,类似数组的功能
二、集合与数组的区别
- 数组长度固定,集合长度不固定
- 数组可以存储基本类型和引用类型,集合只能存储引用类型
三、Collection体系集合
interface Collection(根接口,代表一组对象,称为“集合”)
- interface List(特点:有序、有下标、元素可重复)
- class ArrayList
- class LinkedList
- class Vector
- interface Set(特点:无序、无下标、元素不能重复)
- class HashSet
- interface SortedSet
- class TreeSet
四、Collection父接口
特点:代表一组任意类型的对象,无序、无下标、不能重复
主要方法:
方法名 | 描述 |
---|---|
boolean add(Object obj) | 添加一个对象 |
boolean addAll(Collection c) | 将一个集合中的所有对象添加到此集合中 |
void clear() | 清空此集合中的所有对象 |
boolean contains(Object o) | 检查此集合中是否包含o对象 |
boolean equals(Object o) | 比较此集合是否与指定对象相等 |
boolean isEmpty() | 判断此集合是否为空 |
boolean remove(Object o) | 在此集合中删除o对象 |
int size() | 返回此集合中的元素个数 |
Object[] toArray() | 将此集合转换成数组 |
boolean removeAll(Collection<?> c) | 删除此集合中所有属于c集合的元素,其余保留 |
boolean retainAll(Collection<?> c) | 删除此集合中所有不属于c集合的元素,其余保留 |
Iterator <E> iterator() | 返回此集合的迭代器对象 |
Iterator接口的方法:
方法名 | 描述 |
---|---|
boolean hasNext() | 返回迭代器是否有下一个对象,有则返回true,没有返回false |
Object next() | 返回迭代器所指的对象 |
void remove() | 删除迭代器当前所指向的元素 |
**注意:**使用迭代器的过程中(while循环过程中),要删除元素的话必须使用迭代器的remove方法,不能使用集合的删除方法,否则会报错
五、List子接口
特点:有序、有下标、元素可重复
主要方法:
方法名 | 描述 |
---|---|
void add(int index, Object o) | 添加一个对象到index位置 |
boolean addAll(int index, Collection c) | 将一个集合中的所有对象添加到此集合中的index位置 |
Object get(int index) | 获取指定位置的元素 |
E set(int index, E element) | 用指定元素替换列表中index位置的元素 |
List subList(int fromIndex, int toIndex) | 返回一个从fromIndex位置到toIndex位置截取的子列表 |
int indexOf(Object o) | 返回o对象在列表中的位置(从头开始) |
int lastIndexOf(Object o) | 返回o对象在列表中的位置(从尾开始) |
Listiterator<E> listIterator([int index]) | 返回此列表的一个列表专有的迭代器对象,从index开始(可选) |
E remove(int index) | 删除index位置的元素并返回该元素 |
ListIterator接口的方法:
方法名 | 描述 |
---|---|
void add(E e) | 将指定元素插入列表 |
boolean hasNext() | 返回迭代器是否有下一个对象,有则返回true,没有返回false |
boolean hasPrevious() | 返回迭代器是否有上一个对象,有则返回true,没有返回false |
E next() | 返回迭代器所指的下一个对象 |
int nextIndex() | 返回next()元素的索引 |
E previous() | 返回迭代器所指的上一个对象 |
int previousIndex() | 返回对previous()元素的索引 |
void remove() | 删除迭代器当前所指向的元素 |
void set(E e) | 用指定元素替换next()或previous()返回的最后一个元素 |
List接口的实现类:
- ArrayList(数组):
特点:数组结构实现,查询快,增删慢
JDK1.2引入,运行效率快,线程不安全 - Vector(数组):
特点:数组结构实现,查询快,增删慢
JDK1.0就有,运行效率慢,线程安全 - LinkedList(双向链表):
特点:双向链表结构实现,增删快,查询慢
六、Set子接口
特点:无序、无下标、元素不可重复
主要方法:
方法名 | 描述 |
---|---|
boolean add(Object obj) | 添加一个对象 |
boolean addAll(Collection c) | 将一个集合中的所有对象添加到此集合中 |
void clear() | 清空此集合中的所有对象 |
boolean contains(Object o) | 检查此集合中是否包含o对象 |
boolean containsAll(Collection<?> c) | 若此集合包含指定collection的所有元素,则返回true |
boolean equals(Object o) | 比较此集合是否与指定对象相等 |
boolean isEmpty() | 判断此集合是否为空 |
boolean remove(Object o) | 在此集合中删除o对象 |
int size() | 返回此集合中的元素个数 |
Object[] toArray() | 将此集合转换成数组 |
boolean removeAll(Collection<?> c) | 删除此集合中所有属于c集合的元素,其余保留 |
boolean retainAll(Collection<?> c) | 删除此集合中所有不属于c集合的元素,其余保留 |
int hashCode() | 返回此集合的哈希码值 |
Set接口的实现类:
-
HashSet(哈希表+红黑树(jdk1.8)):
基于HashCode实现元素不可重复当存入元素的哈希码值相同时,会调用equals进行确认,如果结果为true,则拒绝后者存入
-
TreeSet(红黑树):
基于排列顺序实现元素不可重复
映射
一、映射的概念
存放k-v对的数据结构
特点:
- 用于存储任意键值对(Key-Value)
- 键:无序、无下标、不允许重复(唯一)
- 值:无序、无下标、允许重复
二、Map父接口
特点:存储一对数据(key-value),无序、无下标,键不可重复,值可重复
常用方法:
方法名 | 描述 |
---|---|
void clear() | 清空所有键值对 |
boolean containsKey(Object key) | 如果此映射包含指定的键的映射关系,则返回true |
boolean containsValue(Object value) | 如果此映射包含指定的值的映射关系,则返回true |
Set<Map.Entry<K,V>> entrySet() | 返回此映射中包含的映射关系的Set视图 |
boolean equals(Object o) | 比较指定对象与本映射是否相等 |
V get(Object key) | 通过指定的键取得映射关系的值,键不存在则返回null |
int hashCode() | 返回本映射的哈希码值 |
boolean isEmpty() | 判断本映射是否为空 |
Set<K> keySet() | 返回此映射中包含的键的Set视图 |
V put(K key,V value) | 添加新映射关系或修改映射关系 |
void putAll(Map<? extends K, ? extends V> m) | 将另一个映射中的所有映射关系都添加到本映射中 |
V remove(Object key) | 删除映射关系 |
int size() | 返回此映射中的映射关系数 |
Collection<V> values() | 返回此映射中包含的值的Collection视图 |
Map接口的实现类:
-
HashMap(哈希表+红黑树):
JDK 1.2版本,线程不安全,运行效率快,允许用null作为key或者value
-
HashTable(哈希表):
JDK1.0版本,线程安全,运行效率慢,不允许用null作为key或value
-
Properties:
HashTable的子类,要求key和value都是String,通常用于配置文件的读取 -
TreeMap(红黑树):
实现了SortedMap接口(是Map的子接口),可以对key自动排序
Collections 工具类
Collections工具类
该工具类提供了大量针对Collection/Map的操作,总体可分为四类,都为静态(static)方法:
-
排序操作(主要针对List接口相关)
- reverse(List list):反转指定List集合中元素的顺序
- shuffle(List list):对List中的元素进行随机排序(洗牌)
- sort(List list):对List里的元素根据自然升序排序
- sort(List list,Comparator c):自定义比较器进行排序
- swap(List list,int i,int j):将指定List集合中i 处元素和j 处元素进行交换
- rotate(List list,int distance):将所有元素向右移位指定长度,如果distance等于size那么结果不变
-
查找和替换(主要针对Collection接口相关)
- binarySearch(List list,Object key):使用二分法查找,以获得指定对象在List中的索引,前提是集合已经排序
- max(Collection coll):返回最大元素
- max(Collection coll,Comparator comp):根据自定义比较器,返回最大元素
- min(Collection] coll):返回最小元素
- min(Collection coll,Comparator comp):根据自定义比较器,返回最小元素
- fill(List list,Object obj):使用指定对象填充
- frequency(Collection Object obj):返回指定集合中指定对象出现的次数
- replaceAll(List list,Object old,Object new):替换
-
同步控制
Collections工具类提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象,从而解决多线程并发访问集合时线程的安全问题。HashSet、ArrayList、HashMap都是线程不安全的,如果需要考虑同步,则使用这些方法。这些方法主要有:synchronizedSet、synchronizedSortedSet、synchronizedList、synchronizedMap、synchronizedSortedMap
特别需要注意:在使用迭代方法遍历集合时需要手工同步返回的集合。(否则会有线程安全的问题) -
设置不可变得结合
- Collections工具类有三种方法返回一个不可变集合
- emptyXxx(): 返回一个空的不可变的集合对象
- singletonXxx(): 返回一个只包含指定对象的,不可变的集合对象
- unmodifiableXxx(): 返回指定集合对象的不可变视图
-
其它
- disjoint(Collections<?>c1,Collections<?>c2) 如果两个指定collection中没有相同的元素,则返回true
- addAll(Collection<?super T>c,T…a) 一种方便的方式,将所有指定元素添加到指定collection中
- Comparator<T>reverseOrder(Comparatorcmp)返回一个比较器,它强行反转指定比较器的顺序。如果指定比较器为null,则此方法等同于reverseOrder()(返回一个比较器,它对实现 Comparable接口的对象集合施加了 自然排序的相反)