黑马程序员-java集合总结

来源:互联网 发布:python二分查找 编辑:程序博客网 时间:2024/05/19 06:34
一.        数据结构
A)        线性表(list)
  a)        有序列表  : 按照储存顺序位置不变。只能在最后插入,插入顺序作为遍历顺序,内存地址连续
  b)        顺序存储  :查找方便,插入和删除麻烦,下标会有很大影响。
  c)        链式存储(链表):地址不连续,插入和删除效率高,但是查找麻烦。通过移动指针寻址
B)        栈(stack)
        线性表:顺序存储,先进后出,限制了插入和删除的位置,只能在尾部进行。(弹夹)
C)        队列(queue)
        也是线性表(顺序存储) 先进先出,只能在尾部插入,头部删除(银行排队)
D)        Hash table(散列 哈希表)
        查找删除插入速度都快(实现类似字典)
E)        树(二叉树,平衡二叉树)查找删除插入速度都快。
二.        集合
Collection接口:1:list   2. Set
1.List接口     :允许重复,有序即插入顺序
A)        Vactor:(向量列表)底层数据结构是动态的数组结构。线程安全。增删查找都很缓慢。默认容量10,增量10
B)        Arraylist:(线性列表)底层数据结构是动态的数组结构。线程不安全。增删效率低,查询速度快。初始容量10.
C)        Linkedlist:(链式列表):底层数据结构是链表数据结构,线程不安全。增删效率高,查询效率低。默认初始容量0.没有增量。AddFirst(obj);addLast(obj);getFirst(),getLast(),removeFirst(),RemoveLast()是其特有方法。
2.Set接口        :存储无序(无 下标或索引),唯一(重复的会被覆盖),没有自有的方法,全部继承自Collection接口
A)        Hashset:采用哈希散列存储对象。大大提高查询效率。存储结构是:数组+链表。线程不安全
B)        Linkhashset:仍然没有下标和索引。但是增加了一个链表维护插入顺序并作为遍历顺序。(学生作为对象,教室作为集合,学生进教室有顺序,但是在教室是无序的。但是可以按照进入教室的顺序遍历之)。线程不安全。
C)        Treese:以平衡二叉树存储。访问和遍历速度快。按照自然顺序进行存储。线程不安全。存入自定义对象需要重写compareTo()方法。
Map接口
        一次存储两个数据(一个键值对,Entry)。键(key)值(value)键不能重复,允许值重复。键重复的话会覆盖。一个键只能对应一个值。
存储put(key,value)        
删除void clear()   remove(key)
判断: containsKey(Object   key) 先判断hashcode后判断equals
               containsValue(object value)判断equals      isEmpty()
获取        set<Map,Entry<key,value>>entrySet()
        V get(Object key)        set<k> keySet()返回键集合,可以通过键遍历。比较麻烦。
        int size()        Collection<V> values()
A)        HashMap 
基于哈希表的Map实现 允许null值和null键。无序,线程不安全。默认容量16.
B)        LinkedHashMap:
基于哈希表和链表的Map实现。维护插入顺序作为遍历顺序,不保证线程安全。初始容量16。允许空值空键
C)        TreeMap:
基于平衡二叉树结构的Map实现。允许空值空键。根据键的自然顺序排序。线程不安全。
只遍历所有的值:Set<K> keySet()
只遍历所有的键:Collection <V> values()
getKey()        getValue()
三.        泛型
泛型的出现是为了实现集合只能存储一种类型的对象。
这样的好处是:对于集合来说能存储任意类型的对象,但是取出的时候就不知道类型是什么样的,调用特有方法时也不知道应该强转成什么类型的对象。而泛型的出现,弥补了集合的不足,只能放入指定类型的对象,取出来使用的时候也不用再做转型,直接调用其方法即可。
List<Student> ls = new ArrayList<>();
四.        迭代器
Foreach()增强for循环是一种迭代器。Set,Map没有索引。
for( 类型    容器   : 集合)  {                }
Itrator<> it = ArrayList.itrator();
Itrator<Entry<key,value>>  it = Map.itrator<Entry<key,value>>();
通过hasNext遍历
While(it.hasNext)        it.next
五.        工具类
        A)集合排序
方式一:java.long.Comparable接口     int compareTo(T    o)重写自定义排序方法;(0相等,-小,+大)。需要定义在类的内部,后期需要更改类的源代码。
方式二:java.long.comparator接口:int   compare(T  o1,T  o2)自定义一个类,并实现该接口重写排序方法。T TreeSet类有一个                     public TreeSet(Comparator<T>  comp)构造方法可以指定排序算法类。
方式二定义在类的外部,解耦了,更灵活,更方便。
        B)工具:
                  二分查找:(比较器必须和sort()的比较器一致)
[“a“,16        “b”,15                “c”,14]
public static <T> int binarySearch(List list, T key)
public static <T> int binarySearch(List list, T key, Comparator  c)
最值:
public static <T > T max(Collection<T> coll)
public static <T> T max(Collection<T> coll, Comparator<T> comp)
public static <T> T min(Collection<T> coll)
public static <T> T min(Collection<T> coll, Comparator<T> comp)
替换:
public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)
反转:
public static void reverse(List<T> list)
//排序
public static <T> void sort(List<T> list)
public static <T> void sort(List<T> list, Comparator<T> c)
0 0