文章目录
Collections提供了哪些操作呢?
一、查询操作
1.查找元素
binarySearch(List<? extends Comparable<? super T>> list, T key)
binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
看方法名就知道它是用的二分查找。
注意:
集合中元素是没有经过排序,那么结果是未知的。
另外,排序的元素必须实现排序接口(Comparable)或者比较器接口(Comparator)。
List<String> str = new ArrayList<String>();
str.add("b");
str.add("c");
str.add("a");
System.out.println(Collections.binarySearch(str, "a")); //返回-1, 即没有找到
现在调整一下顺序:
str.add("b");
str.add("a");
str.add("c");
System.out.println(Collections.binarySearch(str, "a")); //返回1
2.集合中最大/最小元素
// 查找元素最大值
<T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
<T> T max(Collection<? extends T> coll, Comparator<? super T> comp)
// 查找元素最小值
<T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)
<T> T min(Collection<? extends T> coll, Comparator<? super T> comp)
注意:
排序的元素要实现排序接口(Comparable)或者比较器接口(Comparator)哦
\\ 基本类型
str.add("b");
str.add("a");
str.add("c");
System.out.println(Collections.max(str)); //c
System.out.println(Collections.min(str)); //a
\\ 自定义类
public class Person implements Comparable<Person>{ //实现Comparable接口
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Person person){ //实现compareTo方法
return this.age - person.age;
}
}
Person p1 = new Person("Zzzz", 40);
Person p2 = new Person("Kkkk", 30);
Person p3 = new Person("Mmmm", 50);
ArrayList<Person> al = new ArrayList<Person>();
al.add(p1);
al.add(p2);
al.add(p3);
System.out.println(Collections.max(al).getName()); //Mmmm
System.out.println(Collections.min(al).getName()); //Kkkk
3.集合中的是否存在子集合
static int indexOfSubList(List<?> source, List<?> target) //子集合是首次出现的索引
static int lastIndexOfSubList(List<?> source, List<?> target) //子集合最后一次出现的索引
根据源码解释,它使用的是暴力匹配的方式。
4.集合中是否有相同的元素,没有返回true
boolean disjoint(Collection<?> c1, Collection<?> c2)
Source code ~
//关键实现
for (Object e : iterate) {
if (contains.contains(e)) {
// Found a common element. Collections are not disjoint.
return false;
}
}
5.返回元素在集合中出现的次数
int frequency(Collection<?> c, Object o)