Set、List、Map
- 简介
Set和List是Collection派生的两个子接口。 - Set
特点:无序,元素唯一(不能重复)
HashSet: 基于HashMap实现的,可快速查询,hashset中的元素都存在key上,value都是一个统一的对象PRESENT。使用add方法插入值
//创建HashSet
HashSet<String> set = new HashSet<String>();
set.add("f");
set.add("g");
set.add("h");
set.add("i");
set.add("j");
TreeSet: 可以对元素进行排序,需要实现Comparable接口,重写compareTo()方法。
TreeSet<String> set1 = new TreeSet<String>();
set1.add("f");
set1.add("g");
set1.add("h");
set1.add("i");
set1.add("j");
- List
特点:查找元素效率高,元素有放入顺序,可以重复。
ArrayList: 随机访问,查找和遍历的效率高,未指定大小时,默认大小为10,如果超过了这个大小,则需要对它进行扩容(未定义大小),如果定义了大小,没有超过,则不需要扩容。
//创建ArrayList
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
LinkedList: 基于双向链表,快速插入、删除。
Vector: 与ArrayList 类似 , 线程安全。
4. Map
特点:无序,保存键值对,键不能重复,值可以重复
HashMap: 线程不安全,允许键和值为空(null),默认长度为16,负载因子0.75。使用链地址法减少哈希冲突(哈希冲突:在存入元素时,hash地址已被其它元素占用),采用数组加链表的形式,数组为主题,链表向下扩张,当链表长度超过8,链表会自动转化为红黑树,使用开放定址法处理哈希冲突(在当前位置发生冲突,则重新产生另一个哈希地址存值,如果还是冲突,则继续之前的操作,一直到不发生冲突,成功存值)。
HashMap<Integer,String> map = new HashMap<Integer, String>();
map.put(1,"k");
map.put(2,"l");
map.put(3,"m");
map.put(4,"n");
map.put(5,"o");
HashTable: 线程安全,方法声明使用到了synchronized(一种同步锁),默认大小为11,与HashMap的区别在于多线程安全,但几乎被淘汰了,因为几乎所有的方法都加了锁,使得效率低下,现在对于多线程一般使用ConcurrentHashMap,这是一种高效而且线程安全的集合(HashTable对整个集合加锁,而ConcurrentHashMap则只对需要操作的地方加锁,因此高效)。
TreeMap:可以对元素进行比较。需要实现ocmparator接口,重写compare方法。