集合

为什么使用集合:

在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{
    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 set2;
        set2=new TreeSet();
        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 set2;
        set2=new TreeSet(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{

        @Override
        public int compare(Person o1, Person o2) {
            // TODO Auto-generated method stub
            if(o1.getSore()>o2.getSore()) return 1;
            if(o1.getSore()o2.getAge()) return 1;
            if(o1.getAge()

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的两个接口中的一个。

你可能感兴趣的:(集合)