java源码之Collection
- 前言
- 继承关系
- 方法
- size
- isEmpty
- contains
- iterator
- toArray
- add
- remove
- containsAll
- addAll
- removeAll
- removeIf
- retainAll
- clear
- equals
- hashCode
- spliterator
- stream
- parallelStream
前言
collection作为list,set以及queue的老大哥,对其的了解能更有效地了解数组
继承关系
collection继承自Iterable所有其有Iterable的所有相关的方法。
方法
size
- jdk源码
int size();
返回数组的长度,如果数组的长度大于Integer最大值,返回Integer最大值。
- demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("a");
System.out.println(strings.size());
}
控制台输出1
isEmpty
- jdk源码
boolean isEmpty();
判断数组是否为空,当数组不包含任何元素是返回true
- demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
System.out.println(strings.isEmpty());
strings.add("a");
System.out.println(strings.isEmpty());
}
代码第一次在控台输出true,第二次输出false。
contains
- jdk源码
boolean contains(Object o);
- demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("a");
System.out.println(strings.contains("b"));
System.out.println(strings.contains("a"));
}
结合不包含"b"所以返回为false,包含"a"返回为true。
判断是否包含某个元素
iterator
- jdk源码
Iterator<E> iterator();
获取迭代器Itertor
- demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("a");
Iterator<String> iterator = strings.iterator();
}
获取数组的迭代器,具体操作详见Itertor
toArray
- jdk源码
Object[] toArray();
返回无类型数组
<T> T[] toArray(T[] a);
返回指定类型数组
- demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("a");
Object[] os = strings.toArray();
String[] s = strings.toArray(new String[]{"1", "2", "3"});
}
os数据为[“a”],s的数据为[“a”,null,“3”];
toArray()返回的为原来的数组转换为的一个数组;但是toArray(T[] a)要对两个数组进行判断,如果原数组的长度大于a,则返回数组和原数组相同,否则把原数组的数据拷贝到a中,如果a的长度大于原数组,将原数组之后的那一个元素设为null。
add
- jdk源码
boolean add(E e);
将一个元素加入数组
- demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("a");
}
此时strings中一个元素"a"。
remove
- jdk源码
boolean remove(Object o);
从数组中一处某个元素
- demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("a");
strings.remove("a");
System.out.println(strings.size());
}
调用remove后数组的长度为0。
containsAll
- jdk源码
boolean containsAll(Collection<?> c);
判断数组是否包含某个数组
- demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
List<String> containStrings = new ArrayList<>();
containStrings.add("a");
System.out.println(strings.containsAll(containStrings));
}
strings数组包含的元素为a,b;containStrings g数组包含的元素为a,所以结果返回为true。
addAll
- jdk源码
boolean addAll(Collection<? extends E> c);
将一个数组中的全部元素添加到数组中
- demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
List<String> containStrings = new ArrayList<>();
containStrings.add("a");
strings.addAll(containStrings);
System.out.println(strings);
}
控制台输出为[a, b, a],说明containStrings中的元素已经添加到strings中了。
removeAll
- jdk源码
boolean removeAll(Collection<?> c);
将一个数组中的元素从数组中全部已出
- demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
List<String> containStrings = new ArrayList<>();
containStrings.add("a");
strings.removeAll(containStrings);
System.out.println(strings);
}
控制输出为[b],由于containStrings包含a元素,所以string中的a元素被移除了。
removeIf
- jdk源码
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;
}
根据条件删除元素
-demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.removeIf(s -> strings.indexOf(s)==1);
System.out.println(strings);
}
将数据下表为1的元素删除掉,所以最终的结果为[a]。
retainAll
- jdk源码
boolean retainAll(Collection<?> c);
获取集合的交集,如果集合有改变那么返回为true,否则返回为false。
- demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
List<String> containStrings = new ArrayList<>();
containStrings.add("a");
System.out.println(strings.retainAll(containStrings));
System.out.println(strings);
}
string中包含a,b两个元素,containStrings 中包含a元素所以string结果仅为a,containStrings不会发生任何变化。
如果string中有两个重复的元素且在containStrings 中那么这连个元素都返回。
clear
- jdk源码
void clear();
清除集合中的所有元素
- demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.clear();
System.out.println(strings);
}
string最终得到的结果为[],一个空数组
equals
- jdk源码
boolean equals(Object o);
判断两个集合是否相同
- demo
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
List<String> strings1 = new ArrayList<>();
strings1.add("a");
strings1.add("b");
System.out.println(strings.equals(strings1));
}
连个集合的元素相同,返回为true
hashCode
- jdk源码
int hashCode();
获取集合的hashcode
spliterator
- jdk源码
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
获取集合的分割迭代器
- demo
详见 Iterable
stream
- jdk源码
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
获取集合的流
- demo
public static void main(String[] args) {
List<Integer> nums = new ArrayList<>();
nums.add(1);
nums.add(2);
nums.add(3);
System.out.println(nums.stream().filter(num->num<3).collect(Collectors.toList()));
}
nums获取流然后使用拦截器过滤获取小于3的数据所以结果为[1,2]
parallelStream
- jdk源码
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
获取集合的并行
- demo
public static void main(String[] args) {
List<Integer> nums = new ArrayList<>();
nums.add(1);
nums.add(2);
nums.add(3);
System.out.println(nums.parallelStream().filter(num->num<3).collect(Collectors.toList()));
}
和上面一样(nums获取流然后使用拦截器过滤获取小于3的数据所以结果为[1,2])