集合的总结
List:有序,可以重复,线程不安全,实现了collection接口
LinkedLIst:实现原理是使用的双向列表;常用的方法有:
add(),列表后边追加元素
size(),数组存放元素的的个数
clear(),清空列表
remove():删除列表首个指定元素
isEmpty():列表中是否包含指定元素,返回Boolean值
ArrayList:实现使用的是动态数组,常用的方法有:
add(),列表后边追加元素
size(),数组存放元素的的个数
clear(),清空列表
remove():删除列表首个指定元素
isEmpty():列表中是否包含指定元素,返回Boolean值
vactor
vactor底层的数据结构也是数组存放,除了在线程安全问题上相对于ArrayList更安全,其余几乎一样,他在添加,访问过程中添加了同步锁,线程更安全。
Set:无序,不可以重复,线程不安全,
HashSet:底层是哈希表
哈希表唯一依赖两个方法:hashCode(),equals();
向HashSet集合中放入新元素的执行顺序:
1、调用Hashcode()函数,看是否已经有相同的哈希值
2、如果没有则放入该新元素,如果有则调用equals()函数逐个比对,如果没有,则放入,如果有,则不执行添加元素操作。
TreeSet:底层是红黑树,自然平衡二叉树(
二叉树红黑树,存储规则,左小右大,根节点最多为2;
),因为是二叉树结构所以集合内元素自动按升序排列(升序是其最大特征)。
元素不可重复
TreeSet是对Set集合的实现,而Set集合都是不可重复的
TreeSet自动排序,添加元素时会调用compareTo(Object obj)方法,遇到重复不添加元素
有两种排序方法:自然排序(默认升序)和定制排序。
常用方法:
增:add();add(int,null);
删:remove();
改:set();
查:for()增强和普通,以及迭代器iterator
iterator.hasNext() ; //判断迭代器是否还有下一个元素;
iterator.next();//返回指针指的当前的元素;并且把指针往下移动一个单位;
for(Iterator it = list.iterator(); it.hasNext() ; System.out.println(obj)) {
obj = it.next();
}//迭代器的两种方法
for(Iterator it = list.iterator(); it.hasNext() ; System.out.println(it.next())) {
}
Map:使用键值对方式(key, value),key不允许重复,存储原理使用的是双向列表加红黑树
HashMap:底层是哈希表(哈希表的本质是数组+链表)
把它的键套用HashSet的规则即可,只是每个键都附带了其各自的值。key值允许为null,不可以重复。线程不安全。
TreeMap;底层是红黑树,自然平衡二叉树
其键的存储类似于TreeSet,只是每个键都附带了其各自的值(value)。key值不可以不null ,不允许重复。线程不安全。
HashTable:底层是哈希表(哈希表的本质是数组+链表),十分类似于HashMap,线程安全
与HashMap唯一区别:Hashtable线程安全,效率低,不允许null键null值
HashMap线程不安全,效率高,允许null键null值
常用的方法有:
get();集合取元素
put();元素添加到集合
size();集合大小
clean();清空集合
isEmpty():是否包含元素返回Boolean值。
HashMap是线程不安全的,HashMap是一个实现类,是将键映射到值得到对象,不允许键值重复,允许空键和空值;由于非线程安全,HashMap的效率要比hashTable要高;若添加 key 相同的键值对,后面的 value 会自动覆盖前面的 value,但不会报错。
HashTable是线程安全的一个集合,不允许null值作为一个key值或value值;
HashTable是sychronize多个线程访问时不需要自己为它的方法实现同步而hashMap在被多个线程访问的时候需要自己为它的方法实现同步
Map jdk1.8以前哈希碰撞后,会替换键值,指向旧元素,超过8会变成红黑树,删除到6会变成列表;