为什么使用集合:
在java中数组的大小是固定的,不能改变。而且只能存放同一种类型的数据,而java的集合可以创建和存放大小不固定的数据。java集合都在java.util包中。
Collection
Collection接口是所有集合的根接口
- | 有序 | 重复 |
---|---|---|
Collection | 否 | 是 |
Set(集)
set不重复,无序。如果自己写的类需要重写(hashcode和equals)不然比较的内存,这样使得所有实例都不相同。set有一个子接口叫做SortedSet,它具有排序功能。而TreeSet是SortedSet的实现类。
实现类:
LinkedHashSet:
和HashSet唯一区别是有序的。
HashSet :
采用散列的存储方法,是无序的
TreeSet :
- | 有序 | 重复 |
---|---|---|
HashSet | 否 | 否 |
AbstractSet | 否 | 否 |
TreeSet | 是(用二叉树排序) | 否 |
LinkedHashSet | 是 | 否 |
使用二叉树排序,如果存放自定义类则报错,因为TreeSet在将自定义类转换成comparable的时候错误(TreeSet无法对自定义类经行排序)。有两种方法解决。
方法一:
自定义类继承Comparable
class Person implements Comparable<Person>{
private String name;
private int age;
private double sore;
public Person(String name, int age,double sore) {
super();
this.name = name;
this.age = age;
this.sore=sore;
}
@Override
public int compareTo(Person o) {
// TODO Auto-generated method stub
//按年龄顺序再按名字顺序
int num=this.age>o.age?1:-1;
return this.age==o.age?this.name.compareTo(o.name):num;
}
}
public class LearnOfSet { //测试类
public static void main(String args[]){
Set<Person> set2;
set2=new TreeSet<Person>();
set2.add(new Person("张三", 15,90));
set2.add(new Person("李四", 20,80));
set2.add(new Person("王五", 14,100));
set2.add(new Person("赵六", 19,98));
set2.add(new Person("吴七", 19,60));
set2.add(new Person("可八", 50,80));
set2.add(new Person("王九", 50,70));
set2.add(new Person("赵十一", 50,110));
set2.add(new Person("刘十三", 50,60));
set2.add(new Person("秦十二", 50,60));
for (Person person : set2) { //遍历
System.out.println(person.toString());
}
}
}
方法二:
实现Comparator接口
public class LearnOfSet {
public static void main(String args[]){
Set<Person> set2;
set2=new TreeSet<Person>(new LearnOfSet().new PersonScoreComparator());
set2.add(new Person("张三", 15,90));
set2.add(new Person("李四", 20,80));
set2.add(new Person("王五", 14,100));
set2.add(new Person("赵六", 19,98));
set2.add(new Person("吴七", 19,60));
set2.add(new Person("可八", 50,80));
set2.add(new Person("王九", 50,70));
set2.add(new Person("赵十一", 50,110));
set2.add(new Person("刘十三", 50,60));
set2.add(new Person("秦十二", 50,60));
for (Person person : set2) {
System.out.println(person.toString());
}
}
public class PersonScoreComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
// TODO Auto-generated method stub
if(o1.getSore()>o2.getSore()) return 1;
if(o1.getSore()<o2.getSore()) return -1;
if(o1.getAge()>o2.getAge()) return 1;
if(o1.getAge()<o2.getAge()) return -1;
return 1;
}
}
}
List(列表)
实现类:
LinkedList:链表实现,增删快,查询慢
Vector:数组实现,线程安全,重量级(一般不用)。
ArrayList: 数组实现,查询快,增删慢,线程不安全,轻量级;
- | 有序 | 重复 |
---|---|---|
List | 是 | 是 |
Map(映射)
实现类:
HashMap:允许null值和null键
Hashtable:线程安全的,不允许null值和null键
LinkedHashMap:维护着一个运行于所有条目的双重链接列表。存储的数据是有序的。
Properties:key和value都是String类型,用来读配置文件;
TreeMap:对Map经行排序,和TreeSet用法相似
- | 有序 | 重复 |
---|---|---|
HashSet | 否 | 使用key-value来映射和存储数据,Key必须惟一,value可以重复 |
AbstractSet | 否 | 使用key-value来映射和存储数据,Key必须惟一,value可以重复 |
TreeSet | 是(用二叉树排序) | 使用key-value来映射和存储数据,Key必须惟一,value可以重复 |
两个工具类 Arrays 和 Collections
1.Arrays、此类包含用来操作数组(比如排序和搜索)的各种方法。
2.Collections、主要提供了在 collection 上进行操作的静态方法(同步集合类方法) 。
Collections.synchronized... 方法将List 、 Map 或者Set转换成线程安全。
Collections.sort():将List经行排序,但要实现上诉TreeSet的两个接口中的一个。