集合

1.Comparable接口

* 所有可“排序”的类都可以通过实现java.lang.Comparable接口来实现,该接口中的唯一方法:

public int compareTo(Object obj);

该方法如果

返回 0,表示 this == obj
返回正数,表示 this > obj
返回负数,表示 this < obj

* 可“排序”的类通过Comparable接口的compareTo方法来确定该类对象的排序方式。

2.Comparator接口

1. 在实现类中重写compare方法

@Override
public int compareTo(Student o) {
    return this.id - o.id;
}

2. 通过构造匿名内部类实现比较方法

TreeSet<Student> treeSet = new TreeSet<Student>(new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.id - o2.id;
    }
});

TreeSet<Student> set2 = new TreeSet<Student>(new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
        //o1   外面的
        //o2  是里面的
        if(o1.score == o2.score){
            return 0;
        }
        return o1.score > o2.score ? -1 : 1;
    }
});

注意,一个是compareTo,一个是compare,只能用给TreeSet

3.Map接口

* Map接口的实现类常用的有:
    * HashMap:HashMap内部对“键”用Set进行散列存放。所以根据“键”去取“值”的效率很高
    * TreeMap:TreeMap内部使用红黑树结构对“key”进行排序存放,所以放入TreeMap中的“key-value”对的“key”必须是可“排序”的
    * Hashtable (并不常用)

4.Map.Entry接口

* Map.Entry是Map中内部定义的一个接口,专门用来保存key->value的内容

5.map遍历方法

* 第一种遍历

Set<Integer> keySet = map2.keySet();   
for(Integer integer : keySet){
    System.out.println("key:" + integer + " value:" + map2.get(integer));
}

* 第二种遍历

Set<Map.Entry<Integer, String>> entrys = map2.entrySet();
for(Map.Entry<Integer, String> entry : entrys){
    System.out.println("key:" + entry.getKey() + 
                        " value:" + entry.getValue());
}

6.set

* Set接口的实现类
    * HashSet:散列存放
    * TreeSet:有序存放
    * LinkedHashSet

* set 集合是一个不可以重复的集合?
    【解答】原理:它底层是一个Map   -- key -value 对, key 跟 value 一一对应,其中,key 是不能重复的

* set 进行存储的时候,
    1. 如果是添加同一个对象(即把同一个对象添加多次),那么set只添加一次,不管hashcode  equals 方法的结果是啥 其结果是由它底层的map决定,因为key只能唯一
    2. 如果添加的不是同个对象,那么先调用 hashcode方法,获取hashcode值 ,如果 hascode 一样,那么就调用equals方法,如果返回时true表示元素不可以存入,反之则可以
    得出的结果:实际开发中,如果需要将自定义的类添加入set中,一样重写hashcode  跟 equals

* TreeSet   
    * 添加进去的元素,不管添加顺序怎样子的,输出结果,都是一样的
    * 添加进去的元素,不能重复,如果重复,取其中一个 (由set的特性决定)

* LinkedHashSet:元素最终打印的顺序跟添加的顺序一样

7.HashSet

存储原理:

* 根据每个对象的哈希码值(调用hashCode()获得)用固定的算法算出它的存储索引,把对象存放在一个叫散列表的相应位置(表元)中:
    * 如果对应的位置没有其它元素,就只需要直接存入。
    * 如果该位置有元素了,会将新对象跟该位置的所有对象进行比较(调用equals()),以查看是否已经存在了:还不存在就存放,已经存在就直接使用。
* 取对象时:
    * 根据对象的哈希码值计算出它的存储索引,在散列表的相应位置(表元)上的元素间进行少量的比较操作就可以找出它。

特点及使用技巧:

* HashSet不保存元素的加入顺序。
* HashSet 接口存、取、删对象都有很高的效率。
* 对于要存放到HashSet集合中的对象,对应的类一定要重写equals()和hashCode(Object obj)方法以实现对象相等规则。
* HashSet根据元素的哈希码进行存放,取出时也可以根据哈希码快速找到

8.iterator迭代器接口的使用方法

**所有实现了Collection接口的集合类都有一个iterator()方法用以返回一个实现了Iterator接口的对象**。

Iterator it = coll.iterator();

9.遍历

* 第一种:普通for循环

for(int i = 0; i < list.size(); i++){
    System.out.print(list.get(i) + "  ");
}
System.out.println();

* 第二种:增强的for循环

**增强for循环,只能用于循环遍历,无法进行修改(添加 删除)**

for(String str : list){
    System.out.print(str + " ");
}
System.out.println();

* 第三种:迭代循环

//获取迭代器
Iterator<String> iterator = list.iterator();
for(;iterator.hasNext();  ){
    System.out.print(iterator.next() + " ");
}

/*while(iteratro.hasNext()){
    System.out.print(iterator.next() + " ");
}*/

10.总结
###List
 * list集合中可以放置重复元素
    
    #####ArrayList
    * 底层是一个默认长度为10的数组, list.size超10个之后,会动态(size * 1.5 + 1)拓展底层那个数组
    * 如果系统需要频繁的查询元素,获取元素使用ArrayList 进行元素存储
    * 如果系统需要频繁的添加 删除 建议使用LinkedList
    * ArrayList 是一个线程不安全的(不同步) 集合
    ####LinkedList
    * 底层是一个双向链表
    * 如果系统需要频繁的添加 删除使用LinkedList
    * 如果系统需要频繁的查询元素,建议使用 ArrayList
    * LinkedList 是一个线程不安全的(不同步) 集合
    ####Vector
    * 老版本的Arraylist
    * 跟ArrayList是一样的,唯一区别是vector 线程安全的,Arraylist线程不安全的

>运用场景:

* 由Arraylist 跟 linkedlist特证决定:
    * 频繁的查询元素,用Arraylist     从数据库 获取数据,加工成 Arraylist
    * 频繁的添加 删除 ,用linkedlist

###set
* 不能放置重复元素

    #####HashSet
    * 底层是一个Map,因为map的key要求是唯一,所以这造就HashSet不能重复放置元素
    * 注意点:自定义类必须重写  hashcode 跟 equals方法,如果不重写,只能通过==进行判断。
    * 获取值的时候,通过查hash表,然后对比值

    #####TreeSet
    * 特点跟HashSet 一样
    * 底层实现一个红黑树结构存储方式,所以它带排序功能
    * 注意:添加进去的元素,必须得可排序的 怎么实现呢?
        * 方法1、自定义的类实现 Comparable 接口,进而重写 CompareTo方法
        * 方法2、new TreeSet 自己添加一个比较器(Comparator 接口,实现compare方法)
>使用场景:

* 数据添加的数据需要不重复  HashSet TreeSet  一般选HashSet,但是如果数据还需要排序时选用TreeSet

###总结:
* 如果数据关注是否重复,选用set,反之选用List

11.最后附图一张

posted @ 2016-02-28 23:05  嘉禾世兴  阅读(350)  评论(0编辑  收藏  举报