集合
-
set list map 区别
set 无序,不允许重复,Hashset 无序,不重复
Linkedset 按插入排序,不重复
Shortedset 可排序,不重复
List 有序,可以重复, ArrayList 可重复,按下标排序,线程不安全,LinkedList 可重复,按指针排序,线性不安全
map 键值对,键唯一,值不唯一,其实key就是set, 值就是list, Hashmap, 线程不安全,hashtable 线程安全
-
Hashmap 跟Hashtable 区别
-
线程安全性不同。HashMap线程不安全;Hashtable 中的方法是Synchronize的。
-
key、value是否允许null。HashMap的key和value都是可以是null,key只允许一个null;Hashtable的key和value都不可为null。
-
迭代器不同。HashMap的Iterator是fail-fast迭代器;Hashtable还使用了enumerator迭代器。
enumerator 迭代器可以同步,fail-fast 不可以同步,enumerator 不可以修改数据,fail-fast 可以修改数据 enumerator :翻译
-
hash的计算方式不同。HashMap计算了hash值;Hashtable使用了key的hashCode方法。
-
默认初始大小和扩容方式不同。HashMap默认初始大小16,容量必须是2的整数次幂,扩容时将容量变为原来的2倍;Hashtable默认初始大小11,扩容时将容量变为原来的2倍加1。
-
是否有contains方法。HashMap没有contains方法;Hashtable包含contains方法,类似于containsValue。
-
父类不同。HashMap继承自AbstractMap;Hashtable继承自Dictionary。
-
-
ArrayList跟Linkedlist 区别
- ArrayList 基于动态数组实现的非线程安全的集合;LinkedList 基于双向链表实现的非线程安全的集合。
- 扩容问题:ArrayList 使用数组实现,无参构造函数默认初始化长度为 10,数组扩容是会将原数组中的元素重新拷贝到新数组中,长度为原来的 1.5 倍(扩容代价高);LinkedList 不存在扩容问题,新增元素放到集合尾部,修改相应的指针节点即可。
- LinkedList 比 ArrayList 更占内存,因为 LinkedList 为每一个节点存储了两个引用节点,一个指向前一个元素,一个指向下一个元素。
- 对于随机 index 访问的 get 和 set 方法,一般 ArrayList 的速度要优于 LinkedList。因为 ArrayList 直接通过数组下标直接找到元素;LinkedList 要移动指针遍历每个元素直到找到为止。
- 新增和删除元素,一般 LinkedList 的速度要优于 ArrayList。因为 ArrayList 在新增和删除元素时,可能扩容和复制数组;LinkedList 实例化对象需要时间外,只需要修改节点指针即可。
- LinkedList 集合不支持高效的随机访问(RandomAccess)
- ArrayList 的空间浪费主要体现在在list列表的结尾预留一定的容量空间;LinkedList 的空间花费则体现在它的每一个元素都需要消耗存储指针节点对象的空间。
都是非线程安全,允许存放 null
-
使用Hashmap 还是Treemap 情况
都是非线程安全。
- HashMap基于散列桶(数组和链表)实现;TreeMap基于红黑树实现。
- HashMap不支持排序;TreeMap默认是按照Key值升序排序的,可指定排序的比较器,主要用于存入元素时对元素进行自动排序。
- HashMap大多数情况下有更好的性能,尤其是读数据。在没有排序要求的情况下,使用HashMap。
-
数组和List入户互转
数组转换List 时使用Arrays类的asList()方法
eg:String 【】str ={“aaa”,“bbb”,“cc”}
List list=Arrarys.asList(str);
for(String s:list){
system.out.printin(s)}
List 转换数组使用List 的toArrays()方法
List list=Arrarys.asList(“aaa”,“bbb”,“ccc”);
String []str =list.toArrays(new String[list.size()])
for(String s: str){
system.out.printin(s)
}
-
Queue 队列添加元素方法使用 add()和offer()方法区别
- Queue 中 add() 和 offer() 都是用来向队列添加一个元素。
- 在容量已满的情况下,add() 方法会抛出IllegalStateException异常,offer() 方法只会返回 false 。
-
Queue remove()方法和poll()方法区别
- Queue 中 remove() 和 poll() 都是用来从队列头部删除一个元素。
- 在队列元素为空的情况下,remove() 方法会抛出NoSuchElementException异常,poll() 方法只会返回 null 。
-
Queue element ()方法和peek()方法区别
- Queue 中 element() 和 peek() 都是用来返回队列的头元素,不删除。
- 在队列元素为空的情况下,element() 方法会抛出NoSuchElementException异常,peek() 方法只会返回 null。
-
哪些集合类是线程安全的
Hashtable vector Stack
java.util.concurre