类集
常见的数据结构
栈:stack
限定仅在表尾进行插入和删除操作的线性表。把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。
存元素:压栈
取元素:弹栈
队列:queue
只允许在表的一端进行擦汗如,在另一端进行删除元素的线性表。队尾(rear)是允许插入的一端,队头(front)是允许删除的一端。空队列是不含元素的空表。
数组:array
有序的元素序列,是内存中开辟一段连续的空间,并在此空间存放元素,查找块,增删慢。
链表:linked list
由一系列结点node组成,结点可以在运行时动态生成。每个结点有两个部分,一是存储数据的数据部域,二是存放下个结点地址的指针域。插入元素慢,增删元素快。
红黑树:二叉树:binary tree
是每个结点不超过2的有序树
红黑树本身就是一棵二叉查找树,将结点插入后,该树仍然是一棵二叉查找树,意味着树的键值仍然是有序的。
红黑树的约束:
1.节点可以是红色或黑色的
2.根节点是黑色的
3.叶子节点(特指空节点)是黑色的
4.每个红色节点的子节点都是黑色的
5.任何一个节点到其每个叶子节点的所有路径上黑色节点数相同
红黑树的特点:
速度特别快,趋近平衡树,查找叶子元素最少和最多次数不多于二倍。
Collection 接口
Collection接口是在整个java类集中保存单值的最大操作接口,里面每次操作的时候都只能保存一个对象的数据。此接口定义在java.util包中。
此接口定义如下:
public interface Collection<E> extends Iterable<E>
在开发中不会直接使用Collection接口,而使用其操作的子接口:List(允许重复),Set(不允许重复).
List接口
List接口是Collection接口的子接口,里面的所有内容都是允许重复的。它是一个元素存取有序的集合,
是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
定义:
public interface List<E>extends Collection<E>
此接口的常用实现类:
ArrayList(95%)(线程安全,不允许多线程同时访问),Vector(4%)(线程不安全,允许多线程同时访问),LinkedList(1%)(链表实现)
ArrayList
有序存储。
ArrayList<Integer>data = new ArrayList<>();
ArrayList的无参构造方法
构造一个初始容量为10的空列表,刚创建时容量为0,存入第一个数据后容量变为10
ArrayList的一参构造方法
构造一个具有指定初始容量的空列表。
ArrayList的add方法不论是否添加成功都只返回true
扩容时每次扩容为旧长度的1.5倍如果长度超出范围则变为负数长度,抛出异常。
Vector
可以多个线程同时访问
扩容的增量可指定
若增量为0或小于零则扩容时长度为两倍。
LinkedList
使用的是双向链表结构,增删快,查找慢。可以用来当作栈和队列使用。
模拟堆栈方法
压栈
data.push();
弹栈
data.pop();
队列方式:
从首部添加:
data.addFirst();
从尾部加:
data.addLast();
取的时候用data.remove();
用法同添加相同。
Iterator与ListIterator迭代器
用法:
Iterator<Integer> iterator = data.iterator();
while(iterator.hasNext()){
Integer i = iteratorl.next();
System.out.println(i);
}
往上走:iterator.previout();
往下走:iterator.next();
更改指定内容:iterator.set();
增加:iterator.add();
Set
不包含重复元素。
取得数据的方法:iterator或toArray转变为数组输出。
HashSet
是一种散列存放的结构。
存放无序。
内部是双值的存放方式。
添加时有返回值。true表示存储成功,false表示失败(有这个数据因此失败)
TreeSet
是一种树状存放的结构
存放有序(自然顺序)
其迭代器是快速失败的(中途数据改动后,迭代器将抛出异常中止程序)
自定义类的存放会比较大小,因此要实现内部的Comparable接口,实现比较方法:
public int compareTo(Person o){
this与o比较,负数this小/0一样大/正数this大
}
(若两个对象的涉及比较的属性相同则不会再次存储)
Comparator
Map
双值存储结构:键值对 数据。
Map集合的键(key)不可重复
keySet();可以把键通过set存储,对键进行迭代然后用键从map中取出数据。
clear():清空集合
get(Object key):返回键对应的值
put(K key,V value):存储一个键和一个值
putAll(Map<? extends K,? extends V> m ):存储一组键和一组值。
remove():可以根据键删值,或者通过键+值删除。
containsKey():判断一个键在集合中是否存在
containsValue():判断一个值是否在集合中存在
replace(k,v):通过键和值把一个内容替换掉。
size():获取当前集合长度
values():把所有值变成一个Collection单值存储遍历返回。
put和remove有返回值,若添加成功说明原来为null因此返回null,若失败说明原来有值,返回原值。若删除成功则返回值,若失败则返回null。
HashMap的哈希表
对象数组加链表。
默认值为16 0-15
将对象的hashCode%16,得到下标,将数据存放在那个位置,若位置相同则存在每个位置的链表里(称为桶),当一个桶的数据大于8时,链表会转换成红黑树,若红黑树减少到6时,从红黑树转换为链表。
初始桶数量 16
散列因子0.75 当哈希桶存放数据达到75%时,哈希表扩容至两倍大。
HashMap、Hashtable、ConcurrentHashMap、TreeMap、LinkedHashMap
HashMap线程不安全,效率高,不保证存储顺序
Hashtable线程安全,效率低
ConcurrentHashMap采用分段锁机制,保证线程安全,效率又比较高,若操作的下标不同则同时,相同则排队。
TreeMap会自动进行排序
LinkedHashMap更好使用HashMap同时保证存储顺序.用链表加hash表一起存储