1.Java容器有哪些
Java容器分为两大类 collection和Map,其下面又有很多子类。
collection list ArrayList LinkedList Vector Stack Set HashSet LinkedHashSet TreeSet
Map HashMap LinkedHashMap TreeMap ConcurrentHashMap HashTable
2.Collection 和collections有什么区别
collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是他的子类。
Collections是一个包装类,包含了很多静态方法,不能被实力化。就像一个工具类。
3.List ,Set,Map之间的区别是什么
List:1.可以允许重复的对象。2.可以插入多个null元素。3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。 4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
Set:1.不允许重复对象。2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。3. 只允许一个 null 元素。4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。
Map:1.Map不是collection的子接口或者实现类。Map是一个接口。2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。3. TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。4. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
4.HashMap和HashTable有什么区别
HashMap继承自AbstractMap类,HashTable继承自Dictionary类,不过他们都同时实现了map,Cloneable(可复制),serializable(可序列化)这三个接口。
HashTable比HashMap多提供了elements()和contains()这两个方法。
HashMap的key和value可以为null,而HashTable的key和value不可以为null。
HashMap因为支持带有Null的形式,就不能由get()方法来判断HashMap中是否存在某个键,会直接抛出空指针异常。而应该用containsKey()方法来判断。因为在使用get()方法时,当返回null,无法判断到底存不存在这个Key,还是这个Key就是NUll,还是Key存在但是value时null。
HashMap的方法都没有使用synchronized关键字修饰,是非线程安全的。
当我们需要HashMap是线程安全的,就可以通过Collections.synchronizedMap(hashMap)来进行处理,亦或者使用线程安全的ConcurrentHashMap。
HashTable是线程安全的。ConcurrentHashMap也是线程安全的,但是他的效率要比HashTable高很多倍,因为ConcurrentHashMap使用了分段锁,并不是对整个数据进行锁定。
HashTable的默认初始大小为11,之后的每次扩充,容量变为原来的两倍+1,HashMap的默认初始大小为16,之后的每次扩充,容量变为原来的两倍。
计算hash值的方法不同:为了得到元素的位置,首先需要根据元素的 key计算出一个hash值,然后再用这个hash值来计算得到最终的位置。Hashtable直接使用对象的hashCode。hashCode是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值。然后再使用除留余数发来获得最终的位置。
5.如何决定使用HashMap还是TreeMap
对于在Map中插入,删除,定位一个元素这类操作,用HashMap,因为相对而言HashMap的插入会更快,但如果你要对一个key集合进行有序的遍历,则用TreeMap更好。
6.HashMap的实现原理
HashMap是基于hash算法实现的,我们通过put存储,get来获取。当传入Key时,HashMap会根据key.hashCode()计算出Hash值,根据hash值将value保存在bucket里。当计算出的hash值相同时,我们称之为hash冲突,HashMap的做法是用链表和红黑树存储相同的hash值的value,当hash冲突个数较少时,使用链表否则使用红黑树。
7.HashSet的实现原理
HashSet是基于HashMap实现的,HashSet底层是使用HashMap来保存所有元素,因此Hash Set的实现相对来说比较简单,HashSet不允许有重复值。
8.ArrayList与LinkedList区别有哪些
ArrayList底层是动态数组的数据结构实现,LinkedList底层是双向链表的数据结构实现。频繁读取集合元素的时候建议用ArrayList,插入和删除的时候建议使用LinkedList。
9.如何实现数组和List之间的转换
数组转List:使用Arrays.asList(arr);进行转换
List转数组:使用List自带的toArray();方法
10:ArrayList和vector的区别是什么
vector使用了synchronized来实现线程同步,是线程安全的。ArraysList是非线程安全的。
ArrayList和vector都会根据实际的需要来动态的调整容量,vector每次会增加一倍,ArrayList每次增加二分之一。
11.Array和ArrayList的区别
Array可以储存基本数据类型和对象,ArrayList只能存储对象。
Array是有固定大小的,ArrayList会自动扩容。
12.那些集合类是线程安全的
Stack,Hashtable,vector都是线程安全的,在JDK1.5之后随着Java.util.concurrent并发包的出现,HashMap也有了自己对应的线程安全类CouncurrentHashMap。
13.Lterator 和 ListIterator 有什么区别?
Lterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。
Lterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。
ListIterator 从 Lterator 接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。
网友评论