1、Collection 和 Map 的区别
容器内每个为之所存储的元素个数不同。Collection类型者,每个位置只有一个元素。List,SetMap类型者,持有 key-value pair,像个小型数据库。
2、各自旗下的子类关系
Collection --List: 将以特定次序存储元素。所以取出来的顺序可能和放入顺序不同。有序 --ArrayList / LinkedList / Vector --Set : 不能含有重复的元素 无序不重复 --HashSet / TreeSetMap 键值对 --HashMap --HashTable --TreeMap
List特点:元素有放入顺序,元素可重复
Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
Map特点:元素按键值对存储,无放入顺序
3.具体实例
List:
LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢
ArrayList:非线程安全的,数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低
Vector:线程安全的,效率低 ;矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现
Set:
HashSet:为快速查找而设计的Set,存入HashSet的元素必须定义hashCode,底层由HashMap实现
LinkedHashSet :具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序),所以在使用迭代器遍历Set时,结果会被元素插入的次序显示。元素也必须定义hashCode()方法。
TreeSet:SortedSet接口唯一的实现类,保持次序的Set,底层由平衡二叉树实现, 使用它可以从Set中提取有序的序列。元素必须实现Comparable接口,是按对象的比较函数对元素进行排序。
Map:
HashMap:Map基于散列表的实现,插入和查询“键值对”的开销是固定的。可以通过构造器设置容量和负载因子,以调整容器的性能。
HashMap非线程安全,高效,支持null;HashTable线程安全,低效,不支持null
LinkedHashMap:使用链表维护内部次序(插入次序)
TreeMap:基于红黑树的实现,特点在于所得到的结果是经过排序的。subMap()/方法返回一个子树
ConcurrentHashMap:一种线程安全的Map,不涉及同步加锁
WeakHashMap:允许释放映射所指向的对象
IdentityHashMap:用==代替equals方法
3、其他特征
* List,Set,Map将持有对象一律视为Object型别。* Collection、List、Set、Map都是接口,不能实例化。 继承自它们的 ArrayList, Vector, HashTable, HashMap是具象class,这些才可被实例化。* vector容器确切知道它所持有的对象隶属什么型别。vector不进行边界检查。
4. 存取
- List 通过下标来存取 和值来存取 add/get
- Map 键值对应来存取 put(k,v) / get(k) keySet()抽取key序列 values()抽取value序列
- set 存取元素是无序的 set.add("a") / set.iterator().hasNext()
线程安全:
synchronized 多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题
hashing 哈希码就是将对象的信息经过一些转变形成一个独一无二的int值,这个值存储在一个array中。 所有存储结构中,array查找速度是最快的。所以,可以加速查找。 发生碰撞时,让array指向多个values。即,数组每个位置上又生成一个梿表。
Array , Arrays
Java所有“存储及随机访问一连串对象”的做法,array是最有效率的一种。
1、array效率高,但容量固定且无法动态改变。
array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量。
2、Java中有一个Arrays类,专门用来操作array。 arrays中拥有一组static函数, equals():比较两个array是否相等。array拥有相同元素个数,且所有对应元素两两相等。 fill():将值填入array中。 sort():用来对array进行排序。 binarySearch():在排好序的array中寻找元素。 System.arraycopy():array的复制。