没有合适的资源?快使用搜索试试~ 我知道了~
1. Collection接口 3. Queue与Deque接口 6. 实现类小结 7. 迭代器 1. Collection接口
资源详情
资源评论
资源推荐
1. Collection接口
1.1. Collection主要方法
1.2. Collection对集合运算的支持
1.3. Collection转化为数组toArray()
2. List接口
2.1. List主要方法
3. Queue与Deque接口
3.1. Queue主要方法
3.2. Deque主要方法
4. Map接口
4.1. Map的主要方法
4.2. Map.Entry键值对
4.3. SortedMap接口
4.4. NavigableMap接口
5. Set接口
5.1. SortedSet接口
5.2. NavigableSet接口
6. 实现类小结
7. 迭代器
7.1. Iterable
7.2. Iterator
7.2.1. Iterator主要方法
7.2.2. 游标模式
7.2.3. fail-fast机制
7.3. ListIterator
7.3.1. ListIterator主要方法
总体框架
Java容器主要可以划分为4个部分: List 列表、 Set 容器、 Map 映射、工具类( Iterator 迭代器、
Enumeration 枚举类、 Arrays 和 Collections )
它们的关系如上图所示,标蓝的为抽象类,实线全箭头指的是extends(继承),虚线全箭头表示
implement(实现),虚线半箭头依赖指的是这个类里面有依赖接口或者类的成员变量,比如
HashSet类,继承AbstractSet抽象类,它里面又定义了HashMap的成员变量:
1. Collection接口
Collection 是 Queue , List , Set 的根类 ,是一个高度抽象出来的接口,包含了容器的基本操作和属
性。
1.1. Collection主要方法
其中 removeIf() 的源码
boolean add(E e) //向Collection末尾中添加元素
boolean addAll(Collection<? extends E> c) //把Collectionc中的所有元素添加到指
定的Collection里
void clear() //清除Collection中的元素,长度变为0
boolean contains(Object o) //返回Collection中是否包含指定元素
int hashCode() //返回此Collection的哈希码值。
boolean isEmpty() //Collection是否为空
Iterator<E> iterator() //返回一个Iterator对象,用于遍历
Collection中的元素
boolean remove(Object o) //删除Collection中指定的对象
default boolean removeIf(Predicate<? super E> filter) //删除此Collection中
满足给定谓词的所有元素
int size() //返回Collection里元素的个数
Object[] toArray() //把Collection转化为一个数组
<T> T[] toArray(T[] a) //把Collection转化为一个指定类型的数
组,推荐使用此种方式
1
2
3
4
5
6
7
8
9
10
11
12
支持对容器的条件过滤。
1.2. Collection对集合运算的支持
Set 接口实现类更符合数学定义上的集合,因此我们常用 TreeSet 、 HashSet 去调用这些方法实现
更符合数学定义的集合运算。当然 List 接口实现类也能调用:其中实现无重复元素并集的方式:
再就是要注意以上方法,返回值是 boolean 类型,也就是集合运算会影响调用方法的 Collection 的
结构,如果需要单独返回运算结果,可以通过 static Collections.copy() 静态方法或是对应的
clone() 方法,产生容器副本。
示例:
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
1
2
3
4
5
6
7
8
9
10
11
12
boolean retainAll(Collection<?> c) //得到调用Collection与c的交集
boolean addAll(Collection<? extends E> c) //得到调用Collection与c的交集
boolean removeAll(Collection<?> c) //得到调用Collection与c的差集
//被持有对象必须有正确的equals方法,也就是如果自定义类型需要重写equals方法
1
2
3
4
list2.removeAll(list1);
list1.addAll(list2);
1
2
//返回ls、ls2的交集
public List intersect(List ls, List ls2) {
List list = new ArrayList(Arrays.asList(new Object[ls.size()]));
//产生ls的副本
Collections.copy(list, ls);
list.retainAll(ls2);
return list;
}
//返回ls、ls2的并集
public List union(List ls, List ls2) {
1
2
3
4
5
6
7
8
9
1.3. Collection转化为数组toArray()
当我们调用 Collection 中的 toArray() ,可能遇到过抛出“ java.lang.ClassCastException ”异
常的情况。下面我们说说这是怎么回事。
Collection 接口提供了2个 toArray() 函数:
调用 toArray() 函数会抛出“ java.lang.ClassCastException ”异常,但是调用 toArray(T[]
contents) 能正常返回 T[] 。
toArray() 会抛出异常是因为 toArray() 返回的是 Object[] 数组,将 Object[] 转换为其它类
型(如,将 Object[] 转换为的 Integer[] )则会抛出“ java.lang.ClassCastException ”异常,因为
Java不支持向下转型。 解决该问题的办法是调用 <T> T[] toArray(T[] contents) .
调用 toArray(T[] contents) 返回 T[] 的可以通过以下几种方式实现(以 ArrayList 为例)。
List list1 = new ArrayList(Arrays.asList(new Object[ls.size()]));
List list2 = new ArrayList(Arrays.asList(new Object[ls2.size()]));
Collections.copy(list1, ls);
Collections.copy(list2, ls2);
list2.removeAll(list1); //剔除重复元素
list1.addAll(list2)
return list1;
}
//返回ls、ls2的差集,注意ls-ls2!=ls2-ls -代表差集运算
public List diff(List ls, List ls2) {
List list = new ArrayList(Arrays.asList(new Object[ls.size()]));
Collections.copy(list, ls);
list.removeAll(ls2);
return list;
}
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Object[] toArray()
<T> T[] toArray(T[] contents)
1
2
// toArray(T[] contents)调用方式一
public static Integer[] vectorToArray1(ArrayList<Integer> v) {
Integer[] newText = new Integer[v.size()];
v.toArray(newText);
return newText;
}
// toArray(T[] contents)调用方式二。最常用!
1
2
3
4
5
6
7
8
toArray() 、与 toArray(T[ ] a) 的源码
2. List接口
public static Integer[] vectorToArray2(ArrayList<Integer> v) {
Integer[] newText = (Integer[])v.toArray(new Integer[0]);
return newText;
}
// toArray(T[] contents)调用方式三
public static Integer[] vectorToArray3(ArrayList<Integer> v) {
Integer[] newText = new Integer[v.size()];
Integer[] newStrings = (Integer[])v.toArray(newText);
return newStrings;
}
9
10
11
12
13
14
15
16
17
18
19
// 返回ArrayList的E数组
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
// 返回ArrayList的模板数组。所谓模板数组,即可以将T设为任意的数据类型
public <T> T[] toArray(T[] a) {
// 若数组a的大小 < ArrayList的元素个数;
// 则新建一个T[]数组,数组大小是“ArrayList的元素个数”,并将“ArrayList”全部
拷贝到新数组中
if (a.length < size)
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
// 若数组a的大小 >= ArrayList的元素个数;
// 则将ArrayList的全部元素都拷贝到数组a中。
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
剩余22页未读,继续阅读
马克love
- 粉丝: 30
- 资源: 320
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0