Java —集合类
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
链接: link.
链接: link.
1、Set(无序、唯一),包括HashSet、LinkedHashSet、TreeSet(三者都不是线程安全的)
链接: link.
HashSet:底层数据结构是哈希表(无序,唯一)。不能保证元素的排列顺序,顺序有可能发生变化。可以存储null元素,默认初始化容量16,加载因子0.75。
LinkedHashSet:底层数据结构是链表和哈希表(FIFO插入有序,唯一)。使用链表维护元素的次序,这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
TreeSet:是SortedSet接口的唯一实现类,底层数据结构是红黑树(唯一,有序)。TreeSet可以确保集合元素处于排序状态(默认自然排序即升序排序,也支持定制排序)
2、List(有序、可重复),包括ArrayList、LinkedList和Vector。
ArrayList:底层数据结构是数组,查询快,增删慢; 线程不安全,效率高。默认初始化容量是10,每次扩容时候增加原先容量的一半。
常用方法:添加元素add()、访问元素get()、修改元素set() 、删除元素remove(),以及计算 ArrayList 中的元素数量 size()
LinkedList:底层数据结构是链表,查询慢,增删快;线程不安全,效率高。
Vector:底层数据结构是数组,查询快,增删慢; 线程安全,效率低。初始化length是10,每次扩容时候增加原先容量的一倍。Stack 是Vector类的实现类。
3、Map,包括hashMap和hashTable 以及LinkedHashMap和TreeMap
链接: link.
链接: link.
链接: link.
HashMap和Hashtable都实现了Map接口;
HashMap是线程不安全的即非Synchronized的,HashMap可以接受为null的键key和值value;但为null的键只能有一个,可以有一个或多个键所对应的值为null。而HashTable的key和value均不能为null。相比来说性能高一些。HashMap是无序的。
LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的,但LinkedHashMap是有序的,且默认为插入顺序
Hashtable是线程安全的,即Synchronized的,性能低一些;Java 5提供了ConcurrentHashMap(也是线程安全的,部分锁),它是HashTable的替代,但性能比HashTable高很多。
TreeMap的用法(主要是排序),TreeMap中默认的排序为升序,也可以自定义排序方式
Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。
4、String、StringBuilder 和 StringBuffer的区别
链接: link.
链接: link.
String的值是不变的, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象(存放于字符串常量池)然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String
StringBuilder 和 StringBuffer是字符串变量,两者的对象能够被多次的修改,并且不产生新的未使用对象。不同的是StringBuffer是线程安全的(内部的方法使用Synchronized进行同步),性能低;而StringBuilder 是线程不安全的(单线程使用),性能高一些。
初始化时String可以赋null,但是StringBuilder 和 StringBuffer不行。