1.Hashcode的作用。
快速给元素定位,找到存储位置。了解hashSet中的hashCode.
在HashMap HashSet中,hashCode()是判断放进容器里的两个对象是否相等的依据。
2.ArrayList LinkedList Vector 的区别
ArrayList和Vector是一个可以处理变长数组的类型,他们是一个数组列表,因此内部是用数组实现的,两者的区别在于Vector线程安全,ArrayList线程不安全,Vector的大部分方法都包含了关键字synchronized来进行同步,所以性能较差。所以不需要考虑线程同步问题时,就使用ArrayList.
LinkedList可以看作是双向链表,他实现了Deque和List接口,同样他也是线程不安全的,他的内部实现不是数组,他是采用结点来存放数据,有一个指向链表头的结点first和一个指向链表尾的结点last,LinkedList插入删除快,ArrayList搜索读取快。相比ArrayList,需要更多的内存,因为ArrayList存的是实际数据,而LinkedList除了存数据还需要存头尾结点。
3.String、StringBuffer与StringBuilder的区别。
相比其他两个,String是一个不可变的对象,每次对String类型进行改变时,等同于新建了一个对象,然后变量指向新对象。要经常改变的字符串不推荐用String,每次生成对象对系统性能会产生影响,特别当无引用对象多了以后,GC就开始工作,速度就一定相当慢.
StringBuilder>StringBuffer>String 大多数情况下,但在特殊情况下String更快,例如(String=“haha“+“hehe”+“hei” ,这相当于String="hahahehehei"简单创建对象,比StringBuffer进行拼接更快,,,,,,String s1,String s2, String s = s1+s2,这种情况就很慢)
StringBuilder:非线程安全,StringBuffer是线程安全的。
使用,操作少的数据用String,单线程操作字符串缓冲区用StringBuilder,多线程操作字符串缓冲区用StringBuffer
4. Map、Set、List、Queue、Stack的特点与用法。
Map是键值对,成对添加,删除。键Key是唯一不能重复,一个键对应一个值,值可以重复。可以通过get(Obeject key)来获取值
TreeMap是有序的,HashMap是无序的,
Map的key和value都可以单独抽取出来,Set keySet()方法讲所有的key抽取成一个Set,Collection values()方法讲所有的value抽取成一个Collection。
不包含重复元素,可以包含一个NUll元素,无序的只能通过Iterator来遍历,线程不同步。
元素有序、可重复,每个元素都有对应的索引,
可以在任意位置添加删除元素,可以通过Iterator遍历,也可以通过ListIterator实现双向遍历
队列,遵从先进先出原则。
使用时,尽量避免使用void add()和Object remove()方法,而是使用offer()来添加元素,使用poll来删除元素,他们的优点是可以通过返回值来确定是否操作成功
LinkedList实现了Deque(Queue子接口)接口和List接口
Queue通常不允许添加null元素
栈遵从后进先出的原则。
Stack继承Vector,对Vector进行扩展,有压栈push和出栈pop方法,以及获得栈顶元素peek方法,还有测试栈是否为空的empty()方法(其实Vector有一个isEmpty方法,二者用途是一样的,其实Stack继承Vector是典型的滥用继承。
如果涉及到堆栈,队列等操作,建议使用List.
对于快速插入删除的,使用LinkedList
如需快速访问的,用ArrayList
5. HashMap和HashTable的区别。
- hashTable同步的,而HashMap是非同步的,效率上比hashTable要高。
- hashMap允许空键值,HashTable不允许
- HashMap去掉了HashTable的contains()方法,但是加上了containsValue()和containsKey()方法
- 关于遍历的迭代器,HashMap的迭代器是(Iterator)是fail-fast迭代器,而HashTable的Enumerator迭代器不是fail-fast的。所以当线程改变HashMap的结构(增加或删除),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法不会抛出异常。但这不并不是一定会发生的行为,要看JVM,这也是Iterator和Enumerator的区别。
- 详情点击点击打开链接
6. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。
- 首先一点,HashMap是线程不安全的,ConcurrentHashMap是线程安全的
- ConcurrentHashmap显然不是每个方法加synchronized,这样就成了HashTable,ConcurrentHashMap引用了“分段锁的概念”,将Map分为N个Segment(可以理解为HashTable),根据key.hashCode()来决定把key放在哪个Segment中。segments初始化为长度为16的数组
- 如果考虑到并发性操作就使用ConcurrentHashMap,他的效率是HashTable的N倍,默认为16倍。
7.TreeMap、HashMap、LindedHashMap的区别。(答案不标准)
java为数据结构映射定义了一个接口java.util.Map;他有四个实现类:HashMap、HashTable、LinkedHashMap、TreeMap。Map主要用于存储键值树,根据键得到值,因此不允许键重复(重复就覆盖),但允许值重复。
- Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
- HashTable与HashMap类似,他继承子Dictionary类,不同的是,他不允许记录的键或值为空,它支持线程的同步,即仍以时刻只有一个线程能写HashTable,因此也导致了HashTable在写入时比较慢
- LinkedHashMap保存了插入顺序,在用Iterator遍历时,先得到的肯定是最先插入的,也可以在构造函数时通过传参,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap的容量很大,实际数据少时,HashMap的遍历会很慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
- TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值升序,也可以指定排序。
-
一般情况下,我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。
8.Collection包结构,与Collections的区别。
- Collection是集合类的上级接口,子接口有Set、List、Map。
- Collection是针对集合类的一个工具帮助类,提供了操作集合的工具方法,一系列静态方法实现对集合的搜索、排序、线程安全化等操作。此类不能实例化,就像一个工具类,服务于Java的Collection框架。