Collection和Collections的区别:
Collection 是顶层次单列集合的根接口,是一个集合,是一个接口。
Collections 是针对集合操作的工具类,此类有一些功能:随机置换,集合中的二分查找法,reverse()方法。。。。
Collections集合
此集合没有构造方法,所有的方法都是静态方法,也就意味着Collections中的 所有方法都是破坏性的方法。
方法摘要:
static
| binarySearch(List<? extends Comparable<? super T>> list, T key) 使用二分搜索法搜索指定列表,以获得指定对象。 | |
static
| binarySearch(List<? extends T> list, T key, Comparator<? super T> c) 使用二分搜索法搜索指定列表,以获得指定对象。 |
static void | reverse(List<?> list) 反转指定列表中元素的顺序。 |
static void | shuffle(List<?> list, Random rnd) 使用指定的随机源对指定列表进行置换。 |
例子
reverse()例子(部分代码):
import java.util.ArrayList;
import java.util.Collections;
public class Test1base {
public static void main(String[] args) {
ArrayList<Student> arrayList = new ArrayList<Student>();
arrayList.add(new Student("aloha", 22));
arrayList.add(new Student("alohaa", 222));
arrayList.add(new Student("alohaaa", 2222));
arrayList.add(new Student("alohaaaa", 22222));
for(Student s : arrayList) {
System.out.println(s.getName() + "---"+s.getAge());
}
System.out.println("----------------------");
Collections.reverse(arrayList);
for(Student s : arrayList) {
System.out.println(s.getName() + "---"+s.getAge());
}
}
}
结果:
二分查找法(二分查找法要求 只能操作有序的集合 并且是 List接口的子实现类):
import java.util.Collections;
import java.util.List;
import java.util.Vector;
public class Test2base {
public static void main(String[] args) {
List<Integer> list = new Vector<Integer>() ;
list.add(45);
list.add(20);
list.add(70);
list.add(10);
list.add(2);
//有Vector集合的特性知道此集合自动排序
System.out.println(Collections.binarySearch(list, 10)) ;
Collections.sort(list);
System.out.println(Collections.binarySearch(list, 10)) ;
}
}
结果:
可以看到,没有排序的二分查找法是无法找到元素的位置的。
随机置换shuffle
例子:
import java.util.ArrayList;
import java.util.Collections;
public class Test3base {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(10);
arrayList.add(101);
arrayList.add(24);
arrayList.add(20);
arrayList.add(77);
System.out.println("随机置换前: "+arrayList);
Collections.shuffle(arrayList);
System.out.println("随机置换后: "+arrayList);
}
}
结果:
这个方法可以用在洗牌、抽奖等项目中。
Collections类中的两种排序方法
1、使用比较器进行排序
public void sort() {
//创建对象
ArrayList<Student> al = new ArrayList<Student>() ;
//加入Student对象
al.add(new Student("alohaaa", 2222)) ;
al.add(new Student("alohaa", 2222)) ;
al.add(new Student("alohaaaaa", 222222)) ;
al.add(new Student("aloha", 22)) ;
al.add(new Student("alohaaa", 22222)) ;
Collections.sort(al, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int num = o1.getAge() - o2.getAge() ;
int num2 = num == 0 ? o1.getName().length()-o2.getName().length() : num ;
int num3 = num2 == 0 ? o1.getName().compareTo(o2.getName()) : num2;
return num3;
}
});
for(Student s : al) {
System.out.println(s.getName()+"\t\t"+ s.getAge());
}
}
2、自然排序
重写子类中的compareTo()方法,在调用者中直接调用Collections.sort()即可。
例子:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Sort {
public static void main(String[] args) {
//创建集合对象
List<Student> list = new ArrayList<Student>() ;
list.add(new Student("aloha", 22));
list.add(new Student("nihao", 15));
list.add(new Student("你好", 10));
list.add(new Student("hello", 25));
//排序
Collections.sort(list);
//遍历
for(Student s : list) {
System.out.println(s.getName()+ "\t"+ s.getAge());
}
}
}
class Student implements Comparable<Student>{
private String name ;
private int age ;
public Student() {
super();
}
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;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int compareTo(Student o) {
int num = this.age - o.age ;
return num ;
}
}
实时