Java之集合框架总结

一、 定义
Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象。
在java.util 包中
二、框架图
Java之集合框架总结_第1张图片
三、总结
1、 集合框架主要分为两个接口:Collection和Map
2、 Collection接口实Iterable接口,凡是实现了Iterable接口,都可以使用迭代器或增强for循环(for each)来进行遍历
3、 List接口
List继承了Collection,集合元素可以重复,有序,可以允许多个null
ArrayList 继承了抽象类AbstractList,实现了List接口;不同步
数据结构:动态数组
使用默认构造函数ArrayList() 时,会创建一个size为10的Object类型的空列表,当添加的容量超过数组大小的时候,会产生一个新的数组,新的数组大小为原来数组大小的1.5倍,把原数组中的数据拷贝到新的数组
常用方法:

  • add(E e) 将指定的元素追加到此列表的末尾
  • clear() 从列表中删除所有元素
  • contains(Object o) 如果此列表包含指定的元素,则返回 true 。
  • indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1
  • remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)
  • set(int index, E element) 用指定的元素替换此列表中指定位置的元素
  • size()
  • sort(Comparator 泛型E c) 使用提供的 Comparator对此列表进行排序以比较元素
  • get(int index) 返回此列表中指定位置的元素
  • isEmpty() 如果此列表不包含元素,则返回 true

LinkedList 继承了AbstractSequentialList,实现了List接口;不同步
数据结构:双向链表
每个节点是一个Node对象,Node对象中封装的是你要添加的元素,还是next和pre的对象的引用
常用的方法:除了有ArrayList的基本操作方法,还有

  • addFirst(E e) 在该列表开头插入指定的元素
  • addLast(E e) 将指定的元素追加到此列表的末尾
  • getFirst() 返回此列表中的第一个元素
  • getLast() 返回此列表中的最后一个元素

链表数据(LinkedList)结构的特点是 做插入 删除的效率比较高,查询的效率比较低
ArrayList 做查询的时候效率比较高,因为可以通过下标直接找到元素,但是插入和删除效率比较低,因为要做移位操作。
4、 Set接口 不重复,无序,只能有一个null
不包含重复元素的Collection,并且最多包含一个null
和list容器恰恰相反 Set容器不能保证元素的顺序
HashSet(底层是一个HashMap)
使用哈希表进行存储(散列算法)
hashSet操作的是HashMap的key

/**
     * Constructs a new, empty set; the backing HashMap instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }

hashSet的add方法:

  public boolean add(E e) {
        return map.put(e, PRESENT)==null; //PRESENT是一个final的Object
    }

TreeSet
TreeSet的内部操作的是底层数据TreeMap,只是我们操作的是TreeMap的key(和HashSet类似)
5、 Map接口
key-value映射 无序 key是唯一的 并允许null的值和null键
HashMap
不是同步的 非线程安全
HashMap 默认底层的构造方法会产生一个底层长度为16的Entry数组
hashMap 内部的数据结构是数组链表结构
因为不同的key有可能算出来的下标相同,这时 如果key相同 ,则覆盖value 如果不同 则把新的entry放入,把就的entry以链表的结构 连在新的entry下面
int hash = hash(key.hashCode());
首先调用key的hashCode方法来得到一个整数–哈希码
把哈希码作为参数传到hash函数中来进行运算–散列函数 得到了一个int
把散列值和数组的长度来进行计算 最终得到存放到数组的位置(下标)
所以如果key是对象的话,一般都要重写hasCode和equals方法
TreeMap
红黑树的数据结构 不同步
每一个key-value节点作为红黑树的一个节点。TreeMap存储时会进行排序的,会根据key来对key-value键值对进行排序,其中排序方式也是分为两种,一种是自然排序,一种是定制排序,具体取决于使用的构造方法。
自然排序:TreeMap中所有的key必须实现Comparable接口,并且所有的key都应该是同一个类的对象,否则会报ClassCastException异常。

@Override//重写compareTo方法,自定义比较规则
    public int compareTo(Person o) {
        if(this.age-o.getAge()>0){
            return 1;
        }else if(this.age-o.getAge()<0){
            return -1;
        }
        return this.name.compareTo(o.getName());
    }

定制排序:定义TreeMap时,创建一个comparator对象,该对象对所有的treeMap中所有的key值进行排序,采用定制排序的时候不需要TreeMap中所有的key必须实现Comparable接口。

        TreeMap<Person,String> map = new TreeMap<Person,String>(new Comparator<Person>() {

            @Override
            public int compare(Person o1, Person o2) {
                //自定义排序
                if(o1.getAge()-o2.getAge()>0){
                    return 1;
                }else if(o1.getAge()-o2.getAge()<0){
                    return -1;
                }else{
                    return o1.getName().compareTo(o2.getName());

                }
            }
        });

Java之集合框架总结_第2张图片
四、 包装类Collections
此类仅由静态方法组合或返回集合
扩展了List、Set、Map的操作方法
比如说List Set Map都是不同步的 不安全的 可以使用包装类来使得线程安全
Java之集合框架总结_第3张图片
还可以对List进行排序 等等 具体的方法可以插看java api文档

你可能感兴趣的:(Java)