一. 数据结构
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)
|
|