集合
类集的三大接口:Iterator、Collection、Map
Collection
Collection有三大子接口:List、Set、Queue
单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List和java.util.Set。其中,List的特点是元素有序、元素可重复。Set的特点是元素不可重复。List接口的主要实现类有java.util.ArrayList和java.util.LinkedList,Set接口的主要实现类有java.util.HashSet和java.util.LinkedHashSet。
主要方法操作所有单列集合:
public boolean add(E e):把给定的对象添加到当前集合中 。
public void clear():清空集合中所有的元素。
public boolean remove(E e): 把给定的对象在当前集合中删除。
public boolean contains(Object obj): 判断当前集合中是否包含给定的对象。
public boolean isEmpty(): 判断当前集合是否为空。
public int size(): 返回集合中元素的个数。
public Object[] toArray(): 把集合中的元素,存储到数组中
List
List接口->抽象类:AbstractList->实现类:Vector->子类Stack、ArrayList、AbstractSequentialList->子类LinkedList.
List是有序集合(也称为序列 ),存储有序 。该接口的用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。与集合不同,列表通常允许重复元素。
Vector类
Vector是同步的。 如果不需要线程安全实现,存储是有序的且可重复的。建议使用ArrayList代替Vector 。
错误示范:
//构造一个空向量,使其内部数据数组的大小为 10 ,其标准容量增量为零。
Vector vector = new Vector();
//添加一个元素
vector.add("1");
vector.add("2");
vector.add("3");
//迭代器转化
Iterator iterator = vector.iterator();
//此时使用vector的remove方法删除后使用迭代器输出会抛出ConcurrentModificationException异常
vector.remove(0);
iterator.remove();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
Stack类
继承了Vector类,也是同步的。
//栈,遵循先进后出
Stack stack = new Stack();
//分别对1-4进行入栈操作,也可以使用add()方法进行添加元素
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
System.out.println(stack.toString());
//进行一次出栈,会把4给删除,也可以使用remove()方法进行删除指定元素
stack.pop();
System.out.println(stack.toString());
stack.peek()方法返回栈帧元素
empty() 判断栈是否为空
ArrayList
ArrayList在new 对象时调用空构造方法时arraylist的长度为0;当add一个元素时会先进行扩容再存入,初始化长度为10。每次当前容量满了之后会进行扩容,扩容现在数组长度的1.5倍size*1.5。
Grow()--oldCapacity + (oldCapacity >> 1);
旧长度+旧长度/2
如果超过了int类型的最大值则赋予容量为:Integer.MAX_VALUE - 8
list.forEach(s-> System.out.println(s));遍历list
indexOf()返回传入字符的第一个位置,如果没有则返回-1。
isEmpty()判断是否为空。
size()返回当前元素个数。
LinkedList类
三种插入方式:
list.add(Object o);直接在结尾插入
list.add(int index,Object o);在指定下标插入
list.addFirst(Object o);在头部插入
list.addLast(Object o);在尾部插入
三种删除方式:
list.remove();
list.remove(int index);
list.remove(Object o);
contains(Object o)判断是否存在此元素
Set
HashSet
存储不按照输入的顺序。没有重复的元素,底层是hashmap。
HashSet在进行add方法时会ruturn一个Map集合,键值为add的数值,value为null。
使用迭代器遍历。
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
TreeSet
TreeSet的底层用到了TreeMap存储。
tree.add(Object o);添加元素
tree.ceiling(Object o);返回大于或等于o的最小元素,若没有则返回null
tree.higher(Object o)返回大于o的最小元素,若没有则返回null
tree.lower(Object o)返回小于o的最大元素,若没有则返回null
tree.floor(Object o)返回小于或等于o的最大元素
tree.first()返回第一个元素。
tree.contains(Object o))判断树是否包含此元素。
tree.descendingIterator()返回一个逆序的迭代器。
tree.pollFirst()删除第一个节点并返回值
TreeSet实现Comparable接口的CompareTo方法可以实现对象的排序。
如实现学生中成绩按降序排列,如果成绩相同则年龄小的先排。
@Override
public int compareTo(Student o) {
if (o.score> this.score) {
return 1;
}
if (o.score == this.score) {
if (o.age<this.age){
return 1;
}
}
return -1;
}
Map
HashMap
部分成员变量如下:
//初始值,为16,必须为2的次幂
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
//当容量被占满0.75时就需要reSize扩容,扩容机制*2
static final float DEFAULT_LOAD_FACTOR = 0.75f;
//链表长度到8,就转为红黑树
static final int TREEIFY_THRESHOLD = 8;
// 树大小为6,就转回链表
static final int UNTREEIFY_THRESHOLD = 6;
调用hashmap的空构造方法时会给一个加载因子为0.75。当进行put()添加元素时会运行
return putVal(hash(key), key, value, false, true);
先将得到key的hash值,key为null时hash值为0,如果key不为null则用key的hashcode与其右移16为异或。
map.put(Object key,Object value);添加键和值
map.entrySet()转为set集合
remove(Object key)删除key的值,如果存在则返回其key,反之返回null
remove(Object key, Object value)如果删除成功则ture
map.keySet()获取key的值配合map.get()方法可以获取value值(效率低)
方法一(低效率):
for (String s:map.keySet()) {
System.out.println("key:"+s+"\tvalue"+map.get(s));
}
方法二:常用
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("key:"+entry.getKey()+"\t"+"value:"+entry.getValue());
}
方法三:迭代器,比方法二多一个步奏
Iterator<Map.Entry<String, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<String, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
还有map.values()可以进行遍历value值。
JDK8中采用的是位桶+链表/红黑树。当(哈希桶存储数)链表长度>8时转化为红黑树,当树节点数(哈希桶存储数)从大于8变为6时转化为链表。初始桶数量为16扩容为*2。
TreeMap
TreeMap底层是红黑树,能够实现该Map集合有序
put(K key, V value);添加元素
remove(Object key, Object value)删除元素
遍历方式:
for (Map.Entry<String, Integer> entry : tree.entrySet()) {
System.out.println(entry.getKey() +"\t" + entry.getValue());
}
如果在构造方法中传递了Comparator对象,那么就会以Comparator对象的方法进行比较。否则,则使用Comparable的compareTo(T o)方法来比较。
key一定是不能为null