常用的集合类有哪些?
Map接口和Collection接口是所有集合框架的父接口:
1、Collection接口的子接口包括:Set接口和List接口
2、Map接口的实现类主要有:HashMap、TreeMap、HashTable、CocurrentHashMap以及Properties等
3、Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
4、List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector
(注简单介绍:java容器分为Collection和Map两大类,Collection集合的子接口有Set、List、Queue三种子接口。其中Set、List为常用接口),Map接口不是Collection的子接口。
Collection集合:
1、Set:一个无序(元素存入集合的顺序和去取出的顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。
2、List一个无序(元素存入集合的顺序必须和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有ArrayList、LinkedList和Vector。Set接口常用实现类是HashSet、LinkedListHashSet以及TreeSet。
Map:Map是一个键值对集合,存储键值之间的一个映射关系。Key无序,位移;value不要求有序且可以重复。Map没有继承与Collection接口,从Map集合中检索元素是,只要给出键对象,就会返回对应的值对象。
Map常用的实现类有:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap)
集合框架的底层数据及结构
1、List
ArrayList:Object数组
Vector:Object数组
LinkedList:双向的循环链表
2、Set
HashSet(无序、唯一):基于HashMap实现,底层采用HashMap来保存元素。
LinkedHashSet:LinkedHashSet继承于HashSet,并且其内部是通过LinkedHashMap来实现的。有点类似于我们之前说的LinkedHashMap其内部是基于HashMap实现一样,不过还是有一点点区别的。
TreeSet(有序、唯一):红黑树(自平衡的排序二叉树)
Map:
HashMap:JDK1.8之前HashMap由数组+链表组成,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8之后在解决Hash冲突时有了较大的改变,当链表的长度大于阈值(默认为8)时,将链表转换为红黑树,以减少搜索时间。
LinkedHashMap:LinkedHashMap继承自HashMap,所以他的底层仍然是基于拉链式散列结构:由数组和链表(红黑树)组成。另外,LinkedHashMap在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。
HashTable:数组+链表组成的,数组是HashMap的主体,链表则主要是为了解决哈希冲突而存在的。
TreeMap:红黑树(自平衡的排序二叉树)
哪些集合类是线程安全的?
Vector:就比ArrayList多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面(页面相应程度)是优先考虑的。
Stack:堆栈类,先进先出
hashtable:就比hashmap多了个线程安全
enumeration:枚举,相当于迭代器
怎么确保一个集合不能被修改?
可以使用Collection.unmodifiableCollection(Colection c)方法创建一个只读集合,这样任何改变集合的操作都会抛出java.lang.unsupportedOperationException
d